1、基于FPGA的数字钟设计目录摘要 1 设计任务与要求 2系统整体方案及设计原理 2各模块电路设计与实现 21 分频模块 22 计数模块 43 数码管显示模块 7 硬件下载及调试 10 试验中出现的问题及解决办法 11 设计总结 11参考文献 12摘要FPGA是可编程逻辑器件,在早期可编程逻辑器件PAL和GAL的基础上发展而来,但电路规模更大。同时FPGA具有许多优点,在数字电路设计中得到广泛的应用。本次设计过程中,我们使用了Altera公司开发的Cyclone芯片,使用EP2C8Q208C8开发板,完成我们的设计。在设计过程中,主要使用Verilog编程语言进行编程,由于它和C语言有一定的相似
2、之处,使用起来较为方便。本次课程设计,我们通过编程来控制八段数码管显示我们要的时钟数字,我们通过编程控制交通灯的变换并且利用数码管显示剩余时间,根据EP2C8Q208C8 使用说明,合理安排引脚和时序,顺利完成预定的功能,同时也了解了FPGA和其编程控制过程,为以后的设计奠定了基础。 设计任务与要求。1. 设计一个数字计时器,可以完成00:00:00到23:59:59的计时功能。2. 具体要求如下:1) 能进行正常的时、分、秒计时功能,最大计时显示23小时59分59秒。2) 分别由六个数码管显示时分秒的计时。系统整体方案及设计原理。数字计时器是由计时电路、译码显示电路、脉冲发生电路等几部分组成
3、的。其中,脉冲发生电路将试验箱提供的50Mhz的频率分成电路所需要的频率;计时电路与动态显示电路相连,将时间显示在八段数码管上。原理框图如下: 各模块电路设计与实现。1 分频模块。分频模块程序:module div_clk(clk_50MHz,clk_1Hz,clk_1KHz);input clk_50MHz; /20M时钟频率output clk_1Hz,clk_1KHz;/20M时钟频率分为1Hz,200Hz,1MHz,1kHz,500Hz时钟频率reg clk_1Hz,clk_1KHz;reg 24:0 cnt;/计数器reg 14:0 cnt3;always (posedge clk_
4、50MHz)begin if(cnt = 24999999) /20MHz分为1Hz,当计数器到9999999时,时钟反转一次 begin cnt = 0; /即20000000次为一个时钟周期,即周期为1Hz clk_1Hz = clk_1Hz;/时钟翻转 end else cnt = cnt + 1b1;endalways (posedge clk_50MHz)begin if(cnt3 = 24999) begin cnt3 =0; clk_1KHz = clk_1KHz;/20MHz分为1kHz end else cnt3 = cnt3 + 1b1;endendmodule分频模块时序
5、仿真图如下:2 计数模块。秒计时模块:秒是60进制,所以秒计时模块是60进制。程序如下:module cet60(clk,cen,a,b);input clk;output cen;output 3:0a,b;reg 3:0a,b;reg cen;always (posedge clk ) beginif(a=9)begin a=0; if (b=5)b=0; else b=b+1;endelse begina=a+1;b=b;endendalways(posedge clk)beginif(a=9)&(b=5) cen=1;else cen=0;endendmodule秒及时模块时序仿真图如
6、下:分计时模块也是60进制,同上。小时计时模块:小时使用的24小时制,故使用的是24进制计数,程序如下:module counter24(a,b,nCR,EN,clk);input clk,nCR,EN,nCR;output3:0a,b;reg 3:0 a,b;always(posedge clk or negedge nCR)beginif(nCR)a,b=8h00;else if(EN)a,b2)|(b9)|(a=2)&(b=3)a,b=8h00;else if(a=2)&(b3)begin a=b; b=b+1b1;endelse if(b=9)begin a=a+1b1; b=4b00
7、00;endelsebegin a=a; b=b+1b1;endend endmodule小时计数模块时序仿真图如下:3 数码管显示模块:数码管显示模块程序如下:module decode(clk_1kHz,hour_ten,hour_one,min_ten,min_one,sec_ten,sec_one,dig,seg);input clk_1kHz; /输入时钟1kHzinput 3:0 hour_ten,hour_one,min_ten,min_one,sec_ten,sec_one;output7:0 dig; /数码管位选output7:0 seg; /数码管段选reg7:0 seg
8、_reg; /定义数码管段选寄存器reg7:0 dig_reg; /定义数码管位选寄存器reg3:0 dat_reg; reg2:0 count; /定义计数器always (posedge clk_1kHz) /定义上升沿触发进程begin if(count = 5)count = 0; else count = count +1b1;endalways (posedge clk_1kHz)begin case(count) /选择扫描显示数据 3d0 : begin dat_reg = hour_ten3:0;dig_reg = 8b01111111;end /第一个数码管显示小时的十位
9、3d1 : begin dat_reg = hour_one3:0;dig_reg = 8b10111111;end /第二个数码管显示小时的个位 3d2 : begin dat_reg = min_ten3:0; dig_reg = 8b11011111;end /第三个数码管显示分钟的十位 3d3 : begin dat_reg = min_one3:0; dig_reg = 8b11101111;end /第四个数码管显示分钟的个位 3d4 : begin dat_reg = sec_ten3:0; dig_reg = 8b11110111;end /第五个数码管显示秒的十位 3d5 :
10、 begin dat_reg = sec_one3:0; dig_reg = 8b11111011;end /第六个数码管显示秒的个位 default : begin dat_reg = 0;dig_reg =6b000000;end endcaseendalways (dat_reg)begin case (dat_reg) 4h0 : seg_reg = 8hc0; /显示0 4h1 : seg_reg = 8hf9; /显示1 4h2 : seg_reg = 8ha4; /显示2 4h3 : seg_reg = 8hb0; /显示3 4h4 : seg_reg = 8h99; /显示4
11、4h5 : seg_reg = 8h92; /显示5 4h6 : seg_reg = 8h82; /显示6 4h7 : seg_reg = 8hf8; /显示7 4h8 : seg_reg = 8h80; /显示8 4h9 : seg_reg = 8h90; /显示9 default: seg_reg = 8hff;/不显示 endcase endassign dig = dig_reg; assign seg = seg_reg; endmodule 硬件下载及调试。数字时钟模块搭建图:下载:选择“Processing-start complication”进行全编译,编译通过后要进行管脚分
12、配,选择“AssignmentsPins”,在打开的对话框中的“Location”栏中选择相应的管脚填入,并将未用到的管脚置为三态,最后将程序下载到SmartSOPC实验系统中运行,检验结果是否正确。 试验中出现的问题及解决办法。在设计分频模块的时候,由于没有考虑整体功能实现需要多个不同频率的输出,而只把1HZ作为我们的目标,导致后来用到时又返回去增加输出,导致模块的变动,也给整个工程带来了麻烦。 设计总结。本次试验一方面需要我们掌握数字逻辑电路的知识,另一方面又要适应新的软件Quartus和试验箱的用法。虽说和电工电子实验的内容基本一样,但用的方法却不一样。上次实验除了理论知识外,还需要相当高的人品,万一哪边没接地或哪个孔差错了可能害你花掉整个小时的时间去查错,而且万一芯片坏了也很麻烦,效率比较低,而且眼花缭乱。而这一次,可以利用软件仿真,观察波形,调试,而且不会发生芯片烧坏的情况。参考文献:1闫石.数字电子技术基础.第五版.高等教育出版社.2杨晓慧.杨旭.FPGA系统设计与实例.人民邮电出版社.3杨军.基于QUARTUS计算机组成与体系实验教程.4 侯伯亨.VHDL硬件描述语言与数字逻辑电路设计.西安电子科技大学出版社. 5 任勇峰 .VHDL与硬件实现速成.国防工业出版社.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1