verilog数字钟设计(FPGA)

  • 格式:doc
  • 大小:86.62 KB
  • 文档页数:14

实用文档 标准 一、课程设计目标 1. 熟悉并掌握verilog 硬件描述语言 2. 熟悉quartus 软件开发环境 3. 学会设计大中规模的数字电路,并领会其中的设计思想

二、课程设计实现的功能 (1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式); (2)可以调节小时,分钟。 (3)能够进行24小时和12小时的显示切换。 (4)可以设置任意时刻闹钟,并且有开关闹钟功能。 (5)有整点报时功能,几点钟LED灯闪亮几下。 (6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。

三、设计原理: 1、总原理框图:

是 是 计

数模块

译码显示模块 分频模块

设置闹钟小时 分钟校正 小时校正

模式选择模块 设置闹钟分钟 复位

是否到闹钟时间

切换12进制显示 输出闹钟信号 到达整点 输出整点报时信号 实用文档

标准 附全部代码: 总模块: module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal); input clk;//50MHz input 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_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_naozhong u16(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_mode u18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_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)begin if(~nCR) begin Q1<=32'd0; Q2<=32'd0; Q3<=32'd0; Q4<=32'd0; end else if(Q1>=32'd24999999) begin Q1<=32'd0; _1HZ=~_1HZ; end else if(Q2>=32'd249999) begin Q2<=32'd0; _10ms=~_10ms; end else if(Q4>=32'd6299999) begin Q4<=32'd0; _250ms=~_250ms; end else if(Q3>=32'd12499999) begin Q3<=32'd0; 实用文档 标准 _500ms=~_500ms; end else begin Q1<=Q1+1'd1; Q2<=Q2+1'd1; Q3<=Q3+1'd1; Q4<=Q4+1'd1; end end endmodule

计时模块: 秒计数:在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 ) begin if(!reset) begin SL=4'b0; SH=4'b0; cnt<=8'b0; end else if((mode_flag==4'b0010)&&(!BT2)) begin SL=4'b0; SH=4'b0; cnt<=8'b0; end else begin if(cnt==8'd59) begin 实用文档 标准 t<=8'd0; SH<=4'd0; SL<=4'd0; co<=1'b1; end else begin co=1'b0; t=cnt+8'd1; SL<=cnt%10; SH<=cnt/10; end end end endmodule

module 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) begin ML=4'b0; MH=4'b0; cnt<=8'b0; end else begin if(cnt==8'd59) begin t<=8'd0; MH<=4'd0; ML<=4'd0; co<=1'b1; end else begin co=1'b0;