verilog数字钟设计FPGA

  • 格式:docx
  • 大小:19.60 KB
  • 文档页数:33

一、课程设计目标1. 熟悉并掌握verilog 硬件描述语言;是总模块:moduleclock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao _signal,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); //分频,得到4种不同频率的时钟信号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); //4个数码管显示SEG7_LUT u8(DMH,MH);SEG7_LUT u9(DHL,HL);SEG7_LUT u10(DHH,HH);display_LED u11(DSL,SL); //LED灯显示秒或模式灯display_LED u12(DSH,SH);mode_chooseu13(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_naozhong u16(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_s ignal); //任意闹钟响应LUT_modeu18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,se t_ML,MH,ML,HH,HL);//通过模式选择数码管显示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;endbeginQ1<=32'd0;_1HZ=~_1HZ;endelse if(Q2>=32'd249999) beginQ2<=32'd0;_10ms=~_10ms;endelse if(Q4>=32'd6299999) beginQ4<=32'd0;_250ms=~_250ms;endbeginQ3<=32'd0;_500ms=~_500ms;endelse beginQ1<=Q1+1'd1;Q2<=Q2+1'd1;Q3<=Q3+1'd1;Q4<=Q4+1'd1;endendendmodule计时模块:秒计数:在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)) 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;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) 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;endendendendmodulemodule 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为闹钟分钟设置模式。

module key_press(_10ms,KEY,Keydone); input KEY,_10ms;output Keydone;reg dout1,dout2,dout3;always @(posedge _10ms)begindout1 <= KEY;dout2 <= dout1;dout3 <= dout2;endassign Keydone = (dout1 | dout2 | dout3); endmodulemodule mode (MODE,mode_flag);input MODE ;output [3:0]mode_flag;reg [3:0]mode_flag;always @ (negedge MODE )beginmode_flag = mode_flag+ 4'b1;if(mode_flag == 4'b0101)mode_flag = 2'b0;endendmodulemodule LED_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;end 4'b0010: beginSH<=4'b0000;SL<=4'b0010;end 4'b0011: beginSH<=4'b0000;SL<=4'b0100;end 4'b0100: beginSH<=4'b0000;SL<=4'b1000;enddefault : beginSH<=SH24;SL<=SL24;endendcaseendendmoduleModule LUT_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;input H12_24;output [3:0] MH,ML,HH,HL;reg [3:0] MH,ML,HH,HL;always@(mode_flag or H12_24) begincase (mode_flag)4'b0011,4'b0100: beginHH<=set_HH;HL<=set_HL;MH<=set_MH;ML<=set_ML; enddefault:beginif(H12_24)begin HH<=HH12;HL<=HL12;MH<=MH24;ML<=ML24;end else beginHH<=HH24;HL<=HL24;MH<=MH24;ML<=ML24;end endendcaseendendmodulemodulemode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);input [3:0]mode_flag;input BT2,_250ms,co1,co2,set_co2;output co11,co22,co111,co222;supply1 Vdd;reg co11,co22,co111,co222;always@(mode_flag)begincase (mode_flag)4'b0001: beginif(~BT2) co22<=_250ms;else begin co22<=co2;co11<=co1; endend4'b0010: beginif(~BT2) begin co11<=_250ms;co22<=co2;endelse begin co11<=co1;co22<=co2; endend4'b0011: begin co22<=co2;co11<=co1;if(~BT2) co222<=_250ms; else co222<=set_co2;end4'b0100: begin co22<=co2;co11<=co1;if(~BT2) co111<=_250ms; else co111<=Vdd; enddefault :beginco11<=co1;co22<=co2; endendcaseendendmodule闹钟模块:module set_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2);input co111,co222;output [3:0]set_HH,set_HL,set_MH,set_ML;supply1 Vdd;output co2;minute (co111,Vdd,set_MH,set_ML,co2);hour (co222,Vdd,set_HH,set_HL);endmodulemodulenaozhong(Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);input Alarm_ctr,_1HZ;input [3:0] set_HH,set_HL,set_MH,set_ML;input [3:0] HH24,HL24,MH24,ML24;output nao_signal;reg signal;reg nao_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 ;else signal<=1'b0;endelse if((signal)&&(Alarm_ctr))beginnao_signal<=~nao_signal;Q=Q+nao_signal;if(Q>=8'd720)beginQ<=16'b0;signal<=1'b0;end endelse beginsignal<=1'b0;nao_signal<=1'b0;endendendmodule12——24小时切换模块:module hour12_24(HH24,HL24,HH12,HL12); input [3:0] HH24,HL24;output [3:0] HH12,HL12;reg [3:0] HH12,HL12;reg flag;always@(HH24 or HL24)beginif((HH24*10+HL24)<=12)beginHH12<=HH24;HL12<=HL24;endelse if(((HH24*10+HL24)>=13)&&((HH24*10+HL24)<=19)) beginHH12<=4'd0;HL12<=HL24-4'd2;endelse if(((HH24*10+HL24)>=19)&&((HH24*10+HL24)<=21)) beginHH12<=4'd0;HL12<=HL24+4'd8;endelsebeginHH12<=HH24-4'd1;HL12<=HL24-4'd2;endendendmodule整点报时模块:module boshi(HH,HL,MH,ML,SH,SL,_500ms,bao_signal);input[3:0] HH,HL,MH,ML,SH,SL;input _500ms;output bao_signal;reg bao_signal;reg [7:0]Q1,Q2;reg bao;always@(posedge _500ms)beginif(((SH*10+SL)==8'd59)&&((MH*10+ML)==8'd59))begin Q1<=7'b0;bao<=1'b1;endelse if((Q1<10*HH+HL)&&(bao))beginbao_signal<=~bao_signal;Q1<=Q1+bao_signal;endelse if(Q1==(10*HH+HL))bao<=1'b0;elsebeginbao_signal<=1'b0;endendendmodule译码显示模块:一、数码管显示:通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。