用verilog_HDL多功能数字钟

时间:2025-05-11

Verilog HDL实验报告

基于Verilog HDL语言的多功能数字钟设计

一、试验目的

设计一个有如下功能的数字钟:

(1)计时功能:包括时、分、秒。

(2)定时与闹钟功能:能在所设定的时间发出铃音。

(3)校时功能:对小时、分钟和秒钟进行手动校时。

(4)整点报时功能:每到整点能够发出“嘀嘀嘀嘀嘟”四短一长的报时。

二、试验原理

多功能数字钟端口示意图

数字钟设有五个输入端,分别为时钟输入(CLK)、模式(MODE)、产生声音的时钟信号(CLK_1K)、切换(TURN)和调时(CHANGE)键。输出共七个,其中HOUR[7..0]、MIN[7..0]和SEC[7..0]采用BCD计数方式,分别驱动2个数码管。

硬件电路原理图如下:

三、试验内容

1. 代码

/*信号定义:

clk: 标准时钟信号,其频率为4Hz;

clk_1k:产生闹铃声、报时音的时钟信号,其频率为1024Hz;

mode:功能控制信号;为0:计时功能;

为1:闹钟功能;

为2:手动校时功能;

turn:接按键,在手动校时功能时,选择是调整小时还是分钟;

若长时间按住改建,还可使秒信号清零,用于精确调时;

change: 接按键,手动调整时,每按一次,计数器加1;

如果长按,则连续快速加1,用于快速调时和定时;

hour,min,sec:此三信号分别输出并显示时、分、秒信号,

皆采用BCD码计数,分别驱动6个数码管显示时间;

alert:输出到扬声器的信号,用于产生闹铃音和报时音;

闹铃音为持续20秒的急促的“嘀嘀嘀”音,若按住“change”键, 则可屏蔽该音;整点报时音为“嘀嘀嘀嘀嘟”四短一长音;

LD_alert:接发光二极管,指示是否设置了闹钟功能;

LD_hour:接发光二极管,指示当前调整的是小时信号;

LD_min:接发光二极管,指示当前调整的是分钟信号

*/

module

clock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_min); input clk,clk_1k,mode,change,turn;

output alert,LD_alert,LD_hour,LD_min;

output[7:0] hour,min,sec;

reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;

reg[1:0] m,fm,num1,num2,num3,num4;

reg[1:0] loop1,loop2,loop3,loop4,sound;

reg LD_hour,LD_min;

reg clk_1Hz,clk_2Hz,minclk,hclk;

reg alert1,alert2,ear;

reg count1,count2,counta,countb;

wire ct1,ct2,cta,ctb,m_clk,h_clk;

always @(posedge clk)

begin

clk_2Hz<=~clk_2Hz;

if(sound==3) begin sound<=0; ear<=1; end //ear信号用于产生或屏蔽声音 else begin sound<=sound+1; ear<=0; end

end

always @(posedge clk_2Hz) //由4Hz的输入时钟产生1Hz的时基信号 clk_1Hz<=~clk_1Hz;

always @(posedge mode) //mode信号控制系统在三种功能间转换

begin if(m==2) m<=0; else m<=m+1; end

always @(posedge turn)

fm<=~fm;

always //产生count1,count2,counta,countb四个信号

begin

case(m)

2:begin if(fm)

begin count1<=change; {LD_min,LD_hour}<=2; end

else

begin counta<=change; {LD_min,LD_hour}<=1; end

{count2,countb}<=0;

end

1:begin if(fm)

begin count2<=change; {LD_min,LD_hour}<=2; end

else

begin countb<=change; {LD_min,LD_hour}<=1; end

{count1,counta}<=2'b00;

end

default:{count1,count2,counta,countb,LD_min,LD_hour}<=0;

endcase

end

always @(negedge clk) //如果长时间按下“change”键,则生成“num1”信号用于连续快速加1

if(count2) begin

if(loop2==3) num2<=1;

else

begin loop2<=loop2+1; num2<=0;end

end

else begin loop2<=0; num2<=0; end

always @(negedge clk) //产生num2信号

if(count1) begin

if(loop3==3) num3<=1;

else

begin loop3<=loop3+1; num3<=0; end

end

else begin loop3<=0; num3<=0; end

always @(negedge clk)

if(counta) begin

if(loop4==3) num4<=1;

else

begin loop4<=loop4+1; num4<=0; end

end

else begin loop4<=0; num4<=0; end

assign ct1=(num3&clk)|(!num3&m_clk); //ct1用于计时、校时中的分钟计数 assign ct2=(num1&clk)|(!num1&count2); //ct2用于在定时状态下调整分钟信号 assign cta=(num4&clk)|(!num4&h_clk); //cta用于计时、校时中的小时计数 assign ctb=(num2&clk)|(!num2&countb); //ctb用于在定时状态下调整小时信号 always @(posedge clk_1Hz) //秒计时和秒调整进程

if(!(sec1^8'h59)|turn&(!m))

begin

sec1<=0;if(!(turn&(!m))) minclk<=1;

end

//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时

else begin

if(sec1[3:0]==4'b1001)

begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; end

else sec1[3:0]<=sec1[3:0]+1; minclk<=0;

end

assign m_clk=minclk||count1;

always @(posedge ct1) //分计时和分调整进程

begin

if(min1==8'h59) begin min1<=0; hclk<=1; end

else begin

if(min1[3:0]==9)

begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; end

else min1[3:0]<=min1[3:0]+1; hclk<=0;

end

end

assign h_clk=hclk||counta;

always @(posedge cta) //小时计时和小时调整进程

if(hour1==8'h23) hour1<=0;

else if(hour1[3:0]==9)

begin hour1[7:0]<=hour1[7:4]+1; hour1[3:0]<=0; end

else hour1[3:0]<=hour1[3:0]+1;

alway …… 此处隐藏:2547字,全部文档内容请下载后查看。喜欢就下载吧 ……

用verilog_HDL多功能数字钟.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219