一、课程设计目标1.熟悉并掌握verilog硬件描述语言2.熟悉quartus软件开发环境3.学会设计大中规模的数字电路,并领会其中的设计思想二、课程设计实现的功能(1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式);(2)可以调节小时,分钟。(3)能够进行24小时和12小时的显示切换。(4)可以设置任意时刻闹钟,并且有开关闹钟功能。(5)有整点报时功能,几点钟LED灯闪亮几下。(6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。三、设计原理:1、总原理框图:是是计数模块译码显示模块分频模块设置闹钟小时分钟校正小时校正模式选择模块设置闹钟分钟复位是否到闹钟时间切换12进制显示输出闹钟信号到达整点输出整点报时信号附全部代码:总模块:moduleclock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal);inputclk;//50MHzinputreset,MODE,Alarm_ctr,BT2,H12_24;//复位键,模式选择按钮,闹钟开关档,调节按钮,12—24小时切换档output[7:0]DMH,DML,DHH,DHL;//4个数码管显示输入信号outputdian,bao_signal,nao_signal;//时分间隔点,报时信号,闹钟信号output[3:0]DSH,DSL;//秒钟输出信号wire[3:0]SH,SL,MH,ML,HH,HL;wire[3:0]LED_mode;wire[3:0]HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24;wire[3:0]set_HH,set_HL,set_MH,set_ML;wire_1HZ,_10ms,_250ms,_500ms;wireKeydone1;wireKeydone2;wireco1,co11,co111,co2,co22,co222,set_co2;wire[3:0]mode_flag;assigndian=1'b0;devide_fu1(_1HZ,_10ms,_250ms,_500ms,reset,clk);//分频,得到4种不同频率的时钟信号key_pressu2(_10ms,MODE,Keydone1);//模式档按钮去抖动key_pressu20(_10ms,BT2,Keydone2);//调节按钮去除抖动modeu3(Keydone1,mode_flag);//通过模式按钮产生不同模式secondu4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1);//秒计时minuteu5(co11,reset,MH24,ML24,co2);//分计时houru6(co22,reset,HH24,HL24);//小时计时SEG7_LUTu7(DML,ML);//4个数码管显示SEG7_LUTu8(DMH,MH);SEG7_LUTu9(DHL,HL);SEG7_LUTu10(DHH,HH);display_LEDu11(DSL,SL);//LED灯显示秒或模式灯display_LEDu12(DSH,SH);mode_chooseu13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);//选择模式进行不同操作hour12_24u14(HH24,HL24,HH12,HL12);//12--24小时切换boshiu15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal);//整点报时set_naozhongu16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2);//设置闹钟时间Naozhongu17(Alarm_ctr,_500ms,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);//任意闹钟响应LUT_modeu18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL);//通过模式选择数码管显示LED_modeu19(mode_flag,SH24,SL24,SH,SL);模式选择LED灯显示Endmodule分频模块:分频模块的作用主要是要获得各种频率的时钟信号。输入信号为50MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对50MHZ信号分频。通过计数的方式,当计数从0开始到24999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。moduledevide_f(_1HZ,_10ms,_250ms,_500ms,nCR,_50MHZ);input_50MHZ,nCR;output_1HZ,_10ms,_250ms,_500ms;reg_1HZ,_10ms,_250ms,_500ms;reg[31:0]Q1,Q2,Q3,Q4;always@(posedge_50MHZornegedgenCR)beginif(~nCR)beginQ1=32'd0;Q2=32'd0;Q3=32'd0;Q4=32'd0;endelseif(Q1=32'd24999999)beginQ1=32'd0;_1HZ=~_1HZ;endelseif(Q2=32'd249999)beginQ2=32'd0;_10ms=~_10ms;endelseif(Q4=32'd6299999)beginQ4=32'd0;_250ms=~_250ms;endelseif(Q3=32'd12499999)beginQ3=32'd0;_500ms=~_500ms;endelsebeginQ1=Q1+1'd1;Q2=Q2+1'd1;Q3=Q3+1'd1;Q4=Q4+1'd1;endendendmodule计时模块:秒计数:在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)beginSL=4'b0;SH=4'b0;cnt=8'b0;endelseif((mode_flag==4'b0010)&&(!BT2))beginSL=4'b0;SH=4'b0;cnt=8'b0;endelsebeginif(cnt==8'd59)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;endendendendmodulemoduleminute(cp,reset,MH,ML,co);inputcp,reset;outputco=1'b0;output[3:0]ML,MH;reg[3:0]MH,ML;reg[7:0]cnt;regco;always@(posedgecpornegedgereset)beginif(!reset)beginML=4'b0;MH=4'b0;cnt=8'b0;endelsebeginif(cnt==8'd59)begincnt=8'd0;MH=4'd0;ML=4'd0;co=1'b1;endelsebeginco=1'b0;cnt=cnt+8'd1;ML=cnt%10;MH=cnt/10;endendendendmodulemodulehour(cp,reset,HH,HL);inputcp,reset;output[3:0]HL,HH;reg[3:0]HH,HL;reg[7:0]cnt;always@(posedgecpornegedgereset)beginif(!reset)beginHL=4'b0;HH=4'b0;cnt=8'b0;endelsebeginif(cnt==8'd23)begincnt=8'd0;HH=4'd0;HL=4'd0;endelsebegincnt=cnt+8'd1;HL=cnt%10;HH=cnt/10;endendendEndmodule模式选择模块:同过一个模式档按键MODE,按一下产生对应一种模式mode_flag,并且可以循环。在不同的模式下可以进行不同的操作。其中mode_flag=4'0000为正常显示计时,mode_flag=4'0001为小时调钟模式,mode_flag=4'00010为分钟调钟模,mode_flag=4'0011为闹钟小时设置模式,mode_flag=4'0100为闹钟分钟设置模式。modulekey_press(_10ms,KEY,Keydone);inputKEY,_10ms;outputKeydone;regdout1,dout2,dout3;always@(posedge_10ms)begindout1=KEY;dout2=dout1;dout3=dout2;endassignKeydone=(dout1|dout2|dout3);endmodulemodulemode(MODE,mode_flag);inputMODE;output[3:0]mode_flag;reg[3:0]mode_flag;always@(negedgeMODE)beginmode_flag=mode_flag+4'b1;if(mode_flag==4'b0101)mode_flag=2'b0;endendmodulemoduleLED_mode(mode_flag,SH24,SL24,SH,SL);input[3:0]mode_flag;input[3:0]SH24,SL24;output[3:0]SH,SL;reg[3:0]SH,SL;always@(mode_flag)begincase(mode_flag)4'b0000:beginSH=SH24;SL=SL24;end4'b0001:beginSH=4'b0000;SL=4'b0001;end4'b0010:beginSH=4'b0000;SL=4'b0010;end4'b0011:beginSH=4'b0000;SL=4'b0100;end4'b0100:beginSH=4'b0000;SL=4'b1000;enddefault:beginSH=SH24;SL=SL24;endendcaseendendmoduleModuleLUT_mode(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL);input[3:0]HH12,HL12,HH24,HL24,MH24,ML24;input[3:0]set_HH,set_HL,set_MH,set_ML;input[3:0]mode_flag;in