可编程逻辑器件及其应用设计报告姓名:王克勤院系:*******学号:*******日期:2012-04-09多功能数字钟设计一、设计内容及要求用Verilog HDL设计一个多功能数字钟基本功能描述:1.时钟功能:包括时、分、秒的显示;2.定时与闹钟功能:能在设定的时间发出闹铃音;3.校时功能:能非常方便地对小时、分钟和秒进行手动调整以校准时间;4.整点报时功能:每逢整点,产生“嘀嘀嘀嘀--嘟”,四短一长的报时音。
二、仿真环境说明用Verilog在Altera公司的Quartus2软件环境下编写RTL代码,并进行综合,行为仿真。
时序仿真采用Mentor公司旗下的ModelsimSE-6.1f软件。
Modelsim 软件是业界最著名的波形仿真软件,仿真效果比Quartus2下编写波形文件仿真效果要好很多,而且仿真相当简单,只不过要编写测试向量(testbench),有点麻烦。
三、系统框图与说明Figure1系统框图1.数字钟电路系统由主体电路和扩展电路两大部分所组成。
2. 秒计数器计到59后,下一秒到来时,秒计时器满60,接着清零后向分计数器进位;同样分计数器计满60后向小时计数器进位;小时计数器按照“24进制”规律计数,每当小时计到23小时时,当分计数和秒计数分别59,59时,即到23小时59分,59秒时候,时分秒全部清零,从新开始计数。
3. 计数器的输出经译码器送显示器,显示器用6个数码管表示,每两个数码管分别表示小时,分钟,秒钟。
每个数码管用BCD码表示。
四、设计步骤(一)列写多功能数字钟设计结构图(二)在QuartusП软件下编写Verilog代码(三)在QuartusП环境下进行综合Figure2综合结果从Fig.2可以看出,该设计采用Altera公司CycloneП系列下的EP2C35F672C8芯片。
从图中可以看出,采用了162个逻辑单元,其中组合逻辑147个,总共的寄存器数为102个。
Figure3RTL门级电路1Figure4RTL门级电路2Figure5RTL门级电路3Figure6RTL门级电路4如图Fig.3、Fig.4、Fig.5、Fig.6所示为综合生成的RTL门级电路,由与设计比较复杂,模块比较多,生成的RTL电路也比较复杂。
不好分析RTL电路是否正确,可以通过时序仿真来分析设计的正确性。
(四)用Modelsim软件进行时序仿真1.建立工程文件,编写multiclock代码2.编写testbench测试向量3.进行波形仿真五、仿真波形及其结果分析(一)整点报时Figure7整点报时仿真波形如图Fig.7所示,时钟能正常工作,9点59分55秒开始,将要到十点时候,产生四短一长的“滴,滴,滴,滴,嘟”报时音。
该功能仿真正确。
(二)设置闹钟Figure8设置闹钟时间为10点28分如图Fig.8所示,设计闹钟时间为10点28分整。
从图中可以看出,闹钟时间到达时候,alert闹钟信号报警,产生20秒的报警音。
当按住change 信号时,即change信号为高电平时,屏蔽闹钟音。
当28分08秒时,change 信号为高电平,则屏蔽掉20秒的闹钟音。
(三)校准时间1.调整到固定时刻Figure9调整到9点32分仿真波形如图Fig.9所示,校准到9点32分,校准时、分刻度时,秒刻度屏蔽,之后继续走。
从图中可以看出,校准分刻度时,LD_min高电平有效,LD_alert高电平有效,时针刻度从10变为9,分针刻度变为32,能正确满足校时功能。
2.调整分钟刻度Figure10调整分钟仿真波形如图Fig.10所示,调整分钟刻度,LD_min为高电平时,每按一次change 键,分钟刻度加 1。
3.调整时针刻度Figure11逐次调整时针仿真波形如图Fig.11所示,LD_hour为高电平,LD_min为低电平时,每按一次change 键,时针刻度加1。
从图中可以看出,时针刻度随着change信号的变化,逐次从00变为09。
Figure12连续调整时针仿真波形如图Fig.12所示,LD_hour为高电平,LD_min为低电平时,连续按change 键,即change一直为高电平时,时针信号hour连续加一。
从图中可以看出,hour 信号从01一直加到09.六、实验总结1.通过本次课程设计的学习,能够熟练地掌握了verilog编程的方法技巧,并能够运用到实际。
设计出多功能时钟电路。
对设计的多功能时钟电路能满足设计要求,基本满意。
2.本次多功能数字钟设计,花费不少时间和精力,同时也收获了很多,学会了使用Verilog语言编程仿真电路实验,掌握了可编程逻辑器件的应用开发技术,熟悉了Quartus2软件的使用,并能够运用Modelsim软件对电路进行时序仿真,会编写测试向量,仿真得到自己预期的结果。
3.本次多功能数字钟设计实验,对于Verilog语言的学习与应用,是一次很好的锻炼机会。
以前自己也学过,但是不是很系统,只是了解个大概,这次设计基本上能够熟练运用。
在设计过程中,汲取了诸多经验教训,深刻体会到一个小小的错误可能会给整个程序所带来的严重后果。
所以,在以后的学习及程序设计当中,我们一定要倍加小心,在程序出现不正常运行的情况下要耐心调试,尽量做到精益求精。
4.由于个人能力有限,本次设计还有很多地方需要改善,以后会更加努力的学习。
但本次设计实验已使我对Verilog语言产生了浓厚的兴趣,在以后的学习生活中会主动去了解更多有关这方面的知识及其在实践中的应用。
5. 本次设计中遇到了很多问题,得到了很多同学的帮助,在此特别感谢我们教研室的刘洋同学、唐伟同学和殷存禄同学,没有他们的帮助,我不可能把设计做的这样好。
在此再次表示感谢!附录(一)多功能时钟RTL代码:多功能时钟整体模块代码:module multiclock (clk,,clk_1k,mode,change,turn,rst,alert,hour,min,sec,LD_alert,LD_hour,LD_min);input clk; //标准时钟信号,本例中频率为4Hzinput clk_1k; //产生闹铃音、报时音的时钟信号,本例中其频率为1024Hzinput mode; //功能控制信号:0表示计时功能,1表示闹钟功能,2表示手动校时功能。
input change; //按接键,手动调整时,每按一次,计数器加1,如果长按,则连续快速加1,//用于快速调试和定时。
input turn; //按接键,在手动校时功能时候,选择是调整小时还是分钟,//如果长按住键,还可以是秒信号清零,用于精确调时间。
input rst; //使能信号,高电平有效output alert; // 输出到扬声器的信号,用于产生闹铃音和报时音;//闹铃音为持续20 秒的急促的“嘀嘀嘀”音,若按住“change”键,//则可屏蔽该音;整点报时音为“嘀嘀嘀嘀—嘟”四短一长音;output LD_alert; //接发光二极管,指示是否设置了闹钟功能;output LD_hour; //接发光二极管,指示当前调整的是小时信号;output LD_min; //接发光二极管,指示当前调整的是分钟信号output[7:0] hour,min,sec; //分别输出并显示时、分、秒信号,//皆采用BCD 码计数,分别驱动6 个数码管显示时间;reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;reg[1:0] m,num1,num2,num3,num4;reg fm;reg[1:0] loop1,loop2,loop3,loop4,sound;reg LD_hour,LD_min;reg clk_1Hz,clk_2Hz,minclk,hclk;reg alert1,alert2,ear;reg count1,count2,counta,countb;wire ct1,ct2,cta,ctb,m_clk,h_clk;always @(posedge clk,posedge rst)beginif(rst)beginclk_2Hz <= 0;sound <= 2'b00;ear <= 0;endelsebeginclk_2Hz<=~clk_2Hz;if(sound==3)beginsound<=0;ear<=1; //ear 信号用于产生或屏蔽声音endelsebeginsound<=sound+1;ear<=0;endendendalways @(posedge clk_2Hz,posedge rst)beginif(rst)clk_1Hz <= 0;elseclk_1Hz<=~clk_1Hz; //由4Hz 的输入时钟产生1Hz 的时基信号endalways @(posedge mode,posedge rst)//mode 信号控制系统在三种功能间转换beginif(rst)m <= 2'b00;elsebeginif(m==2) m<=0;else m<=m+1;endendalways @(posedge turn,posedge rst) //turn的上升沿有效beginif(rst)fm <= 1'b0;elsefm<=~fm; //fm取反endalways @(posedge clk,posedge rst)//该进程产生count1,count2,counta,countb 四个信号beginif(rst)begincount1 <= 0;count2 <= 0;counta <= 0;countb <= 0;LD_hour <= 0;LD_min <= 0;endelsebegincase(m) //mode产生的三个控制信号2: begin //手动校时if(fm)begincount1<=change;{LD_min,LD_hour}<=2; //校准分钟endelsebegincounta<=change;{LD_min,LD_hour}<=1; //校准小时end{count2,countb}<=0; //将调整闹钟的控制信号置零end1: begin //设置闹钟if(fm)begincount2<=change;{LD_min,LD_hour}<=2; //显示设置分钟endelsebegincountb<=change;{LD_min,LD_hour}<=1; //显示设置小时end{count1,counta}<=2'b00; //将手动校时的控制信号置零enddefault: {count1,count2,counta,countb,LD_min,LD_hour}<=0;//所有信号控制校时和设置闹钟的信号都清零,指示灯置0,计时开始。