一、课程设计目标1.熟悉并掌握verilog硬件描述语言2.熟悉quartus软件开发环境3.学会设计大中规模的数字电路,并领会其中的设计思想二、课程设计实现的功能(1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式);(2)可以调节小时,分钟。(3)能够进行24小时和12小时的显示切换。(4)可以设置任意时刻闹钟,并且有开关闹钟功能。(5)有整点报时功能,几点钟LED灯闪亮几下。(6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。三、设计原理:1、总原理框图:是是2、各个子模块设计:计数模块译码显示模块分频模块设置闹钟小时分钟校正小时校正模式选择模块设置闹钟分钟复位是否到闹钟时间切换12进制显示输出闹钟信号到达整点输出整点报时信号(1)、分频模块:分频模块的作用主要是要获得各种频率的时钟信号。输入信号为50MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对50MHZ信号分频。通过计数的方式,当计数从0开始到24999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。部分代码如下:always@(posedge_50MHZornegedgenCR)beginif(~nCR)beginQ1=32'd0;endelseif(Q1=32'd24999999)beginQ1=32'd0;_1HZ=~_1HZ;endelsebeginQ1=Q1+1'd1;end(2)、计数模块:秒计数:在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。分钟计数:在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。小时计数:脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。如果有复位信号,则时分秒全部清零。部分代码如下:modulesecond(cp,reset,mode_flag,BT2,SH,SL,co);inputcp,reset,BT2;input[3:0]mode_flag;outputco=1'b0;//输出脉冲信号regco;output[3:0]SL,SH;//输出秒计时的十位、各位reg[3:0]SH,SL;reg[7:0]cnt;always@(posedgecpornegedgereset)beginif(!reset)begin//有复位,清零cnt=8'd0;SH=4'd0;SL=4'd0;endelseif((mode_flag==4'b0010)&&(!BT2))begin//如果分钟调节,秒清零cnt=8'd0;SH=4'd0;SL=4'd0;endif(cnt==8'd59)//计时达到59,下一个脉冲下从新计时begincnt=8'd0;SH=4'd0;SL=4'd0;co=1'b1;endelsebeginco=1'b0;cnt=cnt+8'd1;SL=cnt%10;//秒十位SH=cnt/10;//秒各位endendendendmodule分计时和小时计时代码和上述类似,不再举出。secondu4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1);minuteu5(co11,reset,MH24,ML24,co2);houru6(co22,reset,HH24,HL24);(3)、模式选择模块:同过一个模式档按键MODE,按一下产生对应一种模式mode_flag,并且可以循环。在不同的模式下可以进行不同的操作。其中mode_flag=4'0000为正常显示计时,mode_flag=4'0001为小时调钟模式,mode_flag=4'00010为分钟调钟模,mode_flag=4'0011为闹钟小时设置模式,mode_flag=4'0100为闹钟分钟设置模式。模式产生:modulemode(MODE,mode_flag);inputMODE;output[3:0]mode_flag;reg[3:0]mode_flag;always@(negedgeMODE)begin//如果检测到有按键按下mode_flag=mode_flag+4'b1;//模式值加1if(mode_flag==4'b0101)//到最后一个模式后返回第一的模式mode_flag=2'b0;ndEndmodule模式选择:modulemode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);input[3:0]mode_flag;//输入模式方式,响应对应操作inputBT2,_250ms,co1,co2,set_co2;//调节按钮,时钟信号,正常计时分钟脉冲信号,正常计时小时脉冲信号,闹钟设置分钟进位信号。outputco11,co22,co111,co222;//分钟脉冲信号,小时脉冲信号,闹钟设置分钟脉冲信号,闹钟设置小时脉冲信号;supply1Vdd;regco11,co22,co111,co222;always@(mode_flag)begincase(mode_flag)4'b0001:beginif(~BT2)co22=_250ms;//小时调钟模式,有按键,则脉冲为250mselsebeginco22=co2;//没有按键,正常计时co11=co1;endend4'b0010:beginif(~BT2)beginco11=_250ms;//小时调钟模式,有按键,则脉冲为250msco22=co2;endelsebeginco11=co1;//没有按键,正常计时co22=co2;endend4'b0011:beginco22=co2;co11=co1;if(~BT2)co222=_250ms;//闹钟小时设置信号elseco222=set_co2;end4'b0100:beginco22=co2;co11=co1;if(~BT2)co111=_250ms;//闹钟分钟设置信号elseco111=Vdd;enddefault:beginco11=co1;co22=co2;endendcaseendendmodule(4)、任意闹钟模块:一、设置闹钟:当对应于闹钟设置模式mode_flag=4'0011和4'b0100时,有设置信号输入时,则开始设置。对应代码:moduleset_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2);inputco111,co222;//闹钟分钟,小时设置信号output[3:0]set_HH,set_HL,set_MH,set_ML;//输出相应的闹钟设置时间supply1Vdd;outputco2;minute(co111,Vdd,set_MH,set_ML,co2);hour(co222,Vdd,set_HH,set_HL);endmodule二、闹钟响应:当正常计时达到闹钟设置得时间后,通过比较二者之间的时间,相等,则产生一个闹钟允许响应信号,在闹钟开关打开和闹钟允许响应信号同时满足的情况下,则产生闹钟响应信号,并送到相应的闹钟设备LED灯。如果闹钟档处于关闭状态,则不会产生闹钟响应信号。响应代码如下:modulenaozhong(Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);inputAlarm_ctr,_1HZ;input[3:0]set_HH,set_HL,set_MH,set_ML;input[3:0]HH24,HL24,MH24,ML24;outputnao_signal;regsignal;regnao_signal;reg[16:0]Q;//计数,调节闹钟响应时间长度always@(posedge_1HZ)beginif((~signal)&&(Alarm_ctr))beginif((set_HH==HH24)&&(set_HL==HL24)&&(set_MH==MH24)&&(set_ML==ML24))signal=1'b1//达到闹钟设置时间,产生闹钟允许响应信号elsesignal=1'b0;end//未达到,不产生elseif((signal)&&(Alarm_ctr))begin//闹钟开关打开和闹钟允许响应信号同时满足nao_signal=~nao_signal;//产生闹钟响应信号Q=Q+nao_signal;if(Q=8'd720)begin//响应时间完毕,关闭闹钟允许响应信号Q=16'b0;signal=1'b0;endendelsebeginsignal=1'b0;nao_signal=1'b0;endendendmodule(5)、整点报时模块:检测分钟和秒钟计数是否都达到了59,然后再下一个秒脉冲的作用下发出整点报时信号,送到LED。并开始计数,计数达到报时信号响应次数后,终止报时信号。部分代码如下:always@(posedge_500ms)beginif(((SH*10+SL)==8'd59)&&((MH*10+ML)==8'd59))beginQ1=7'b0;bao=1'b1;end//允许报时elseif((Q110*HH+HL)&&(bao))beginbao_signal=~bao_signal;//产生报时信号Q1=Q1+bao_signal;//响一次计数加一endelseif(Q1==(10*HH+HL))//报时次数达到整点时数,终止信号bao=1'b0;elsebeginbao_signal=1'b0;endEnd(6)、12—24小时切换模块:将24小时切换成12小时,并存入相应的寄存器。如果拨上切换显示档,则切换显示。相应代码如下:modulehour12_24(HH24,HL24,HH12,HL12);input[3:0]HH24,HL24;output[3:0]HH12,HL12;reg[3:0]HH12,HL12;always@(HH24orHL24)beginif((HH24*10+HL24)=12)beginHH12=HH24;HL12=HL24;endelseif(((HH24*10+HL24)=13)&&((HH24*10+HL24)=19))beginHH12=4'd0;HL12=HL24-4'd2;endelseif(((HH24*10+HL24)=19)&&((HH24*10+HL24)=21))beginHH12=4'd0;HL12=HL24+4'd8;endelsebeginHH12=HH24-4'd1;HL12=HL24-4'd2;endendendmodule(7)、译码显示模块:一、数码管显示:通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。代码如下:moduleSEG7_LUT(oSEG1,iDIG);input[3:0]iDIG;//输入要显示的数output[7:0]oSEG1;reg[7:0]oSEG;wire[7:0]oSEG1;always@(iDIG)begincase(iDIG)4'h0:oSEG=8'b00111111;4'h1:oSEG=8'b00000110;4'h2:oSEG=8'b01011011;4'h3:oSEG=8'b01001111;4'h4:oSEG=8'b01100110;4'h5:oSEG=8'b01101101;4'h6:oSEG=8'b01111101;4'h7:oSEG=8'b00000111;4'h8:oSEG=8'b0