基于SOPC的数字钟

  • 格式:doc
  • 大小:2.10 MB
  • 文档页数:11

(2013-2014学年第二学期)重庆理工大学研究生课程论文课程论文题目:基于SOPC的数字钟设计课程名称SOPC技术及系统设计课程类别□学位课□非学位课任课教师王先全所在学院电子学院学科专业仪器仪表工程姓名王小辉学号513072601012014年7月7日注意事项:1、以上各项由研究生认真填写;2、研究生课程论文应符合一般学术规范,具有一定学术价值,严禁网上下载或抄袭;凡检查或抽查不合格者,一律取消该门课程成绩和学分,并按有关规定追究相关人员责任;3、论文得分由批阅教师填写(见封底),并签字确认;批阅教师应根据作业质量客观、公正的在文后签写批阅意见;4、原则上要求所有课程论文均须用A4纸打印,加装本封面封底,左侧装订;5、课程论文由各学院(部)统一保存,以备查用。

4、卷纸不够写,可另附纸。

基于SOPC 的数字钟设计摘要:在EDA 软件平台上,以硬件描述语言VHDL 为系统逻辑描述手段完成的数字钟设计文件,完成逻辑优化和仿真测试。

关键词:计数器 模块 FLASH一、设计要求①数字钟的秒计数器(用FPGA 实现); ②数字钟的分计数器(用FPGA 实现); ③数字钟的小时计数器(用FPGA 实现); ④NIOS 的中断设计;⑤NIOS 读取数字钟的秒、分、小时的数据; ⑥NIOS 显示数字钟的秒、分、小时的内容二、方案设计⒈根据设计要求,我们首先需在FPGA 上完成数字钟的硬件设计,这里又可以细化为六个部分:①将所选时钟信号转换为以秒为基准的信号,作为后面所需的秒时钟信号。

这里我选的10Hz 的时钟信号作为GPGA 的输入信号,所以需做个十进制的计数器,即计数到10,full 信号置1(full 信号作为下个模块的时钟信号)。

又因为计数值转换时不稳,会有跳变发生,接到数码管之后可能会有数值跳跃的现象,所以我在其中又添加了一个信号量INTEERUPT ,当计数为2-8时INTEERUPT 为1否则为0,将该信号接到NIOS 中,编程实现INTEERUPT 为1时输出时钟信号,就避免了跳变现象。

时钟②这部分需实现秒的计数,即前个模块的输出信号full作为它的输入信号clk,clk为1,计数值加1,加到59再来一个clk信号,计数值就自动清零,同时把输出信号full置1(full信号又作为下个模块的时钟信号)。

③分模块跟秒模块计数功能一制,这里我偷懒把秒模块复用为分模块。

④小时模块跟秒、分模块功能相近,只是清零值跟进位值不同(个位进位值9而清零值为4),这里要比秒、分模块多加一个变量,让它根据小时模块个位是否是4同时十位是否是2来置0置1,以此作为清零标志。

⑤若以上模块在各自的工程中仿真成功,那接下来就需要把他们组合起来。

新建了个工程a,把以上四个模块(其实只有三个,分、秒模块可以复用)的vhdl文件添加进去,转换文件格式成电路图格式,然后在顶层文件中将他们组合连线,编译仿真成功之后,再将顶层文件转换成bsf文件,供后面使用(在FPGA与CPU系统符号结合时需调用)。

⑥FPGA部分仿真成功之后,接下来就得新建一个工程b另做SOPC builder 部分,把a中vhdl和bsf文件全复制并添加进来。

这里需注意,芯片选型与实验箱要匹配,本设计我添加了片上ROM、RAM及片外FLASH,片上ROM用来存储复位地址,片上RAM用来存储异常变量,片外FLASH 具有掉电保持功能,用来存储程序(因为FLASH只识别pof文件,所以我们下硬件时要先把sof文件转换成pof文件,并在硬件下载界面中,把它加进去)。

三态桥是连接FLASH和CPU的桥梁,这里我选的Avalon-MM Tristate Bridge。

其次是输入输出端口的设置,这里的输入实际是与FPGA的输出对应的,即六个四位输入信号(秒个位、秒十位、分个位、分十位、小时个位、小时十位)外加一个一位的类似中断的选通信号(INTERRUPT)。

设置并分配好之后,生成电路符号文件,在新建的顶层文件中加入刚生成的CPU系统符号和在FPGA中生成的bsf 类型模块,在连线、添加输入输出口、注明网络标号之后,编译。

我们做的硬件最终是要跟实物相连的,所以这里引脚分配很重要,不能重不能漏,qsf中引脚名称也必须bdf中引脚名与一致,参数设置完后再次编译,无误后,我们就可以开始编写软件部分。

⒉软件部分,即NIOS部分,我们打开NIOS并新建工程c时需把前面工程b中的生成的ptf文件作为硬件设计文件。

然后在工程中添加软件程序main.c文件,由于前面FPGA部分已经实现了时钟计数功能,这里就只需实现数码管显示功能,即位选段选,我们需根据实验箱的共阴或共阳写入对应段选码,又因为实验箱上有8个数码管,位选码对应为0-7。

这里我们只用到六个,位选码为0-5。

这里需注意,用FLASH作程序存储时,我们需用USB BLASTER做下载线,软硬件下载接口也不一致。

三、Vhdl程序及bdf文件⒈实现1Hz的时钟信号转换。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sec isport (CLK,RST,EN:in std_logic;full:out std_logic;INTERRUPT:out std_logic);end sec;architecture one of sec isbeginprocess(CLK,RST,EN)variable cqi:std_logic_vector(3 downto 0);beginif RST='1'then cqi:=(others=>'0');elsif CLK'event and CLK='1' thenif EN='1' and cqi<9 then cqi:=cqi+1; full<='0';else cqi:=(others=>'0'); full<='1';end if;end if;if cqi>1 and cqi<8 then INTERRUPT<='1' ;else INTERRUPT<='0' ;end if;end process;end one;⒉分秒计时到60清零并赋值信号位full。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minsec isport (CLK, RST,EN:in std_logic;cq0,cq1:out std_logic_vector(3 downto 0);full:out std_logic);end minsec;architecture one of minsec isbeginprocess(CLK, RST,EN)variable cqi0,cqi1:std_logic_vector(3 downto 0);variable carry:integer;beginif RST='1'then cqi0:=(others=>'0');elsif CLK'event and CLK='1' thenif EN='1' thenif cqi0<9 then carry:=0; cqi0:=cqi0+1;else carry:=1; cqi0:=(others=>'0');end if;if carry=1 thenif cqi1<5 then cqi1:=cqi1+1;full<='0';elsif cqi0=0 then cqi1:=(others=>'0'); full<='1';end if;end if;end if;end if;cq0<=cqi0;cq1<=cqi1;end process;end one;⒊小时计时到24清零。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hour isport (CLK,RST,EN:in std_logic;cq0,cq1:out std_logic_vector(3 downto 0));end hour;architecture one of hour isbeginprocess(CLK,RST,EN)variable cqi0,cqi1:std_logic_vector(3 downto 0);variable carry,full:integer;beginif RST='1'then cqi0:=(others=>'0');elsif CLK'event and CLK='1' thenif EN='1' thenif full=1 then cqi0:=(others=>'0');cqi1:=(others=>'0');elsif cqi0<9 then carry:=0; cqi0:=cqi0+1;elsif cqi0=9 then carry:=1;cqi0:=(others=>'0');end if;if full=0 and carry=1 then cqi1:=cqi1+1;end if;end if;end if;if cqi0=3 and cqi1=2 then full:=1 ;else full:=0;end if;cq0<=cqi0;cq1<=cqi1;end process;end one;⒋合成的时钟计时模块。

⒌SOPC BUILDER生成的CPU系统符号。

⒍合成的FPGA部分。

四、软件程序main.c#include "sys/alt_stdio.h"#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include "unistd.h"#include "sys/alt_irq.h"#include "sys/alt_alarm.h"alt_u8duan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void display();void display(){alt_u8 i,led;int sec_l,sec_h,min_l,min_h,hour_l,hour_h;sec_l=IORD_ALTERA_AVALON_PIO_DATA(SEC_SINGLE_BASE); sec_h=IORD_ALTERA_AVALON_PIO_DATA(SEC_TEN_BASE);min_l=IORD_ALTERA_AVALON_PIO_DATA(MIN_SINGLE_BASE); min_h=IORD_ALTERA_AVALON_PIO_DATA(MIN_TEN_BASE);hour_l=IORD_ALTERA_AVALON_PIO_DATA(HOUR_SINGLE_BASE); hour_h=IORD_ALTERA_AVALON_PIO_DATA(HOUR_TEN_BASE);for(i=0;i<5;i++){IOWR_ALTERA_AVALON_PIO_DATA(WEI_SEL_BASE, i);switch(i){case 0:led=duan[sec_l];break;case 1:led=duan[sec_h];break;case 2:led=duan[min_l];break;case 3:led=duan[min_h];break;case 4:led=duan[hour_l];break;case 5:led=duan[hour_h];break;default:led=duan[10];break;}IOWR_ALTERA_AVALON_PIO_DATA(DUAN_SEL_BASE, led); usleep(30);}}int main(){int it;it=IORD_ALTERA_AVALON_PIO_DATA(TNTERRUPT_BASE);while (1){if (it==1){display();}}return 0;}五、实验结果⒈软件仿真结果⒉实验箱结果。