verilog数字钟设计(FPGA)

  • 格式:docx
  • 大小:61.23 KB
  • 文档页数:12

、课程设计目标1.熟悉并掌握verilog硬件描述语言2.熟悉quartus软件开发环境3.学会设计大中规模的数字电路,并领会其中的设计思想、课程设计实现的功能(1) 设计一个数码管实时显示时、分、秒的数字时钟( 24小时显示模式);(2) 可以调节小时,分钟。

(3) 能够进行24小时和12小时的显示切换。

(4 )可以设置任意时刻闹钟,并且有开关闹钟功能。

(5) 有整点报时功能,几点钟LED灯闪亮几下。

(6) 有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。

三、设计原理:1、总原理框图:附全部代码: 总模块:module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signa l,nao_signal);input clk;//50MHzinput reset,MODE,Alarm_ctr,BT2,H12_24;// 复位键,模式选择按钮,闹钟开关档,调节按钮 ,12—24 小时切换档output [7:0]DMH,DML,DHH,DHL; //4 个数码管显示输入信号output dian,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; wire Keydone1; wire Keydone2;wire co1,co11,co111,co2,co22,co222,set_co2; wire [3:0]mode_flag; assign dian=1'b0;devide_f u1(_1HZ,_10ms,_250ms,_500ms,reset,clk); key_press u2(_10ms,MODE,Keydone1); key_press u20(_10ms,BT2,Keydone2); mode u3(Keydone1,mode_flag);second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); //秒计时 minute u5(co11,reset,MH24,ML24,co2); // 分计时 hour u6(co22,reset,HH24,HL24); SEG7_LUT u7(DML,ML); SEG7_LUT u8(DMH,MH); SEG7_LUT u9(DHL,HL); SEG7_LUT u10(DHH,HH); display_LED u11(DSL,SL); display_LED u12(DSH,SH);mode_choose u13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);// 选择模式进行不同操作hour12_24 u14(HH24,HL24,HH12,HL12); //12--24 小时切换boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); // 整点报时 set_naozhongu16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); // 设置闹钟时间 Naozhong u17(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);// 通过模式选择数码管显示// 分频,得到 4 种不同频率的时钟信号 //模式档按钮去抖动 // 调节按钮去除抖动 //通过模式按钮产生不同模式 // 小时计时 //4 个数码管显示//LED 灯显示秒或模式灯LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式选择LED 灯显示Endmodule分频模块:分频模块的作用主要是要获得各种频率的时钟信号。

输入信号为50MHZ 的信号,要想获得1HZ 的信号作为秒脉冲计时,则要对50MHZ 信号分频。

通过计数的方式,当计数从0开始到24 999999时,1HZ 信号取反一次,计数又从0开始,如此循环,就可以得到1HZ 脉冲信号。

对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。

module devide_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 _50MHZ or negedge nCR)beginif(~nCR)beginQ1<=32'd0;Q2<=32'd0;Q3<=32'd0;Q4<=32'd0;endelse if(Q1>=32'd2*******)beginQ1<=32'd0;_1HZ=~_1HZ;endelse if(Q2>=32'd249999)beginQ2<=32'd0;_10ms=~_10ms;endelse if(Q4>=32'd6299999)beginQ4<=32'd0;_250ms=~_250ms;endelse if(Q3>=32'd1*******)beginQ3<=32'd0;_500ms=~_500ms; end else begin Q1<=Q1+1'd1; Q2<=Q2+1'd1; Q3<=Q3+1'd1;Q4<=Q4+1'd1; end endendmodule计时模块:秒计数:在1HZ 脉冲下进行秒计时,当计时达到59 秒后,在下一个脉冲来临变0 ,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。

分钟计数:在输入脉冲下,分钟开始计时,当计时达到59 后,在下一个脉冲来临变0 ,并发出一个脉冲,供小时计数的输入脉冲新号。

小时计数:脉冲信号来临时,计数加1,达到23 后在下一个脉冲的作用下清零,从新计时。

如果有复位信号,则时分秒全部清零。

module second(cp,reset,mode_flag,BT2,SH,SL,co);input cp,reset,BT2; input[3:0]mode_flag;output co=1'b0;reg co;output [3:0]SL,SH; reg[3:0]SH,SL;reg[7:0]cnt; always@(posedge cp or negedge reset ) beginif(!reset)beginSL=4'b0;SH=4'b0;cnt<=8'b0;endelse if((mode_flag==4'b0010)&&(!BT2))begin SL=4'b0;SH=4'b0; cnt<=8'b0;end else begin if(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;endendendendmodulemodule minute (cp,reset,MH,ML,co); input cp ,reset;output co=1'b0;output [3:0]ML,MH; reg[3:0]MH,ML; reg[7:0]cnt; reg co;always@(posedge cp or negedge reset) begin if(!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;endendend endmodulemodule hour (cp,reset,HH,HL);input cp,reset;output [3:0]HL,HH;reg[3:0]HH,HL;reg[7:0]cnt;always@(posedge cp or negedge reset) 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 为闹钟分钟设置模式。