基于verilog数字钟设计报告Word格式文档下载.docx
《基于verilog数字钟设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于verilog数字钟设计报告Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
分钟计数:
在输入脉冲下,分钟开始计时,当计时达到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)
begin
if(!
reset)begin//有复位,清零
cnt<
=8'
SH<
=4'
SL<
end
elseif((mode_flag==4'
b0010)&
&
(!
BT2))begin//如果分钟调节,秒清零
if(cnt==8'
d59)//计时达到59,下一个脉冲下从新计时
co<
=1'
b1;
else
begin
co=1'
cnt=cnt+8'
=cnt%10;
//秒十位
=cnt/10;
//秒各位
endmodule
分计时和小时计时代码和上述类似,不再举出。
secondu4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1);
minuteu5(co11,reset,MH24,ML24,co2);
houru6(co22,reset,HH24,HL24);
(3)、模式选择模块:
同过一个模式档按键MODE,按一下产生对应一种模式mode_flag,并且可以循环。
在不同的模式下可以进行不同的操作。
其中mode_flag=4'
0000为正常显示计时,mode_flag=4'
0001为小时调钟模式,mode_flag=4'
00010为分钟调钟模,mode_flag=4'
0011为闹钟小时设置模式,mode_flag=4'
0100为闹钟分钟设置模式。
模式产生:
modulemode(MODE,mode_flag);
inputMODE;
output[3:
reg[3:
always@(negedgeMODE)begin//如果检测到有按键按下
mode_flag=mode_flag+4'
//模式值加1
if(mode_flag==4'
b0101)//到最后一个模式后返回第一的模式
mode_flag=2'
nd
Endmodule
模式选择:
modulemode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);
input[3:
//输入模式方式,响应对应操作
inputBT2,_250ms,co1,co2,set_co2;
//调节按钮,时钟信号,正常计时分钟脉冲信号,正常计时小时脉冲信号,闹钟设置分钟进位信号。
outputco11,co22,co111,co222;
//分钟脉冲信号,小时脉冲信号,闹钟设置分钟脉冲信号,闹钟设置小时脉冲信号;
supply1Vdd;
regco11,co22,co111,co222;
always@(mode_flag)begin
case(mode_flag)
4'
b0001:
if(~BT2)co22<
=_250ms;
//小时调钟模式,有按键,则脉冲为250ms
elsebeginco22<
=co2;
//没有按键,正常计时
co11<
=co1;
b0010:
if(~BT2)beginco11<
co22<
elsebeginco11<
b0011:
beginco22<
if(~BT2)co222<
//闹钟小时设置信号
elseco222<
=set_co2;
b0100:
if(~BT2)co111<
//闹钟分钟设置信号
elseco111<
=Vdd;
default:
endcase
endmodule
(4)、任意闹钟模块:
一、设置闹钟:
当对应于闹钟设置模式mode_flag=4'
0011和4'
b0100时,有设置信号输入时,则开始设置。
对应代码:
moduleset_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2);
inputco111,co222;
//闹钟分钟,小时设置信号
0]set_HH,set_HL,set_MH,set_ML;
//输出相应的闹钟设置时间
outputco2;
minute(co111,Vdd,set_MH,set_ML,co2);
hour(co222,Vdd,set_HH,set_HL);
二、闹钟响应:
当正常计时达到闹钟设置得时间后,通过比较二者之间的时间,相等,则产生一个闹钟允许响应信号,在闹钟开关打开和闹钟允许响应信号同时满足的情况下,则产生闹钟响应信号,并送到相应的闹钟设备LED灯。
如果闹钟档处于关闭状态,则不会产生闹钟响应信号。
响应代码如下:
modulenaozhong(Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);
inputAlarm_ctr,_1HZ;
0]set_HH,set_HL,set_MH,set_ML;
0]HH24,HL24,MH24,ML24;
outputnao_signal;
regsignal;
regnao_signal;
reg[16:
0]Q;
//计数,调节闹钟响应时间长度
always@(posedge_1HZ)begin
if((~signal)&
(Alarm_ctr))beginif((set_HH==HH24)&
(set_HL==HL24)&
(set_MH==MH24)&
(set_ML==ML24))signal<
b1//达到闹钟设置时间,产生闹钟允许响应信号
elsesignal<
end//未达到,不产生
elseif((signal)&
(Alarm_ctr))begin//闹钟开关打开和闹钟允许响应信号同时满足
nao_signal<
=~nao_signal;
//产生闹钟响应信号
Q=Q+nao_signal;
if(Q>
d720)begin//响应时间完毕,关闭闹钟允许响应信号
Q<
=16'
signal<
(5)、整点报时模块:
检测分钟和秒钟计数是否都达到了59,然后再下一个秒脉冲的作用下发出整点报时信号,送到LED。
并开始计数,计数达到报时信号响应次数后,终止报时信号。
always@(posedge_500ms)begin
if(((SH*10+SL)==8'
d59)&
((MH*10+ML)==8'
d59))begin
=7'
bao<
end//允许报时
elseif((Q1<
10*HH+HL)&
(bao))begin
bao_signal<
=~bao_signal;
//产生报时信号
=Q1+bao_signal;
//响一次计数加一
elseif(Q1==(10*HH+HL))//报时次数达到整点时数,终止信号
else
End
(6)、12—24小时切换模块:
将24小时切换成12小时,并存入相应的寄存器。
如果拨上切换显示档,则切换显示。
相应代码如下:
modulehour12_24(HH24,HL24,HH12,HL12);
0]HH24,HL24;
0]HH12,HL12;
always@(HH24orHL24)begin
if((HH24*10+HL24)<
=12)
HH12<
=HH24;
HL12<
=HL24;
elseif(((HH24*10+HL24)>
=13)&
((HH24*10+HL24)<
=19))
=HL24-4'
d2;
=19)&
=21))
=HL24+4'
d8;
=HH24-4'
(7)、译码显示模块:
一、数码管显示:
通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。
代码如下:
moduleSEG7_LUT(oSEG1,iDIG);
input[3:
0]iDIG;
//输入要显示的数
output[7:
0]oSEG1;
reg[7:
0]oSEG;
wire[7:
always@(iDIG)
case(iDIG)
4'
h0:
oSEG=8'
b00111111;
h1:
b00000110;
h2:
b01011011;
h3:
b01001111;
h4:
b01100110;
h5:
b01101101;
h6:
b01111101;
h7:
b00000111;
h8:
b01111111;
h9:
b01101111;
endcase
assignoSEG1=~oSEG;
//由于是共阴极数码管,低电平显示,所以取反
二、LED显示:
moduledisplay_LED(s_out,s_int);
0]s_int;
output[3:
0]s_out;
wire[3:
0]s_out1;
always@(s_int)
case(s_int)
s_out=4'
b0000;
b0001;
b0010;
b0011;
b0100;
b0101;
b0110;
b0111;
b1000;
b1001;
assigns_out1=~s_out;
设计过程常见问题:
(1)要注意编写程序的过程中begin和end配对问题,类似于C语言中的括号匹配问题,在编写计数模块时编译不通过,最后检查出是缺少一个end结束符号,经修改后编译通过。
(2)VerilogHDL语言编写时的语法问题。
在最初的计时模块的程序设计中,将小时、分钟的调节信号放在了另外的一个always语句块中,编译无法通过,经查阅资料,在VerilogHDL语言的编写中应该注意不同的always语句块不可以对同一个变量进行操作,即一个变量不可以经过两个always语句块操作。
将对小时和分钟调节信号的操作与计时放在同一个语句块中,编译通过。
(3)数码管刚开始时显示于实际计数不一样,主要是由译码错误造成的原因。
数码管一开始不变化,说明计数没有进行,是由于分钟的输入脉冲信号错误引起。
心得体会
这次的课程设计结束了,在这次的设计中我学会了很多东西。
首先是对VerilogHDL语言的设计思想有了深入理解,将这种自顶向下的设计理念运用于实践中,设计多功能数字钟,突出了VerilogHDL作为硬件描述语言的良好可读性和可移植性,对上学期所学的而理论知识有了深刻的理解。
其次是对VerilogHDL语言的语法熟悉,在这次的课程设计中,我学习到很多VerilogHDL语言的语法知识,比如在两个不同的语句块中不能对同一个变量进行操作,比如在用VerilogHDL语言中编写程序时要注意begin和end语句的匹配问题,在使用VerilogHDL语言时不可以使用中文注释等等。
对于这种语言的学习也有了很大的帮助。
最后是设计作品时的设计逻辑和设计思想,在选择不同的系统方案时要综合考虑,选择最优方案。
各个模块的实现也要考虑综合情况而制定出最符合实际情况的实现方案,方案间要进行对比、实践,最终确定。
在这次的课程设计中我不仅学习到有关程序编写以及设计方面的逻辑思维,对系统功能的实现也有了较为深入的了解,对各模块的调试等也学习到不少东西,总之,从这次设计中学到很多东西,也巩固了我的理论学习。
附代码:
总模块:
moduleclock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal);
inputclk;
//50MHz
inputreset,MODE,Alarm_ctr,BT2,H12_24;
//复位键,模式选择按钮,闹钟开关档,调节按钮,12—24小时切换档
output[7:
0]DMH,DML,DHH,DHL;
//4个数码管显示输入信号
outputdian,bao_signal,nao_signal;
//时分间隔点,报时信号,闹钟信号
0]DSH,DSL;
//秒钟输出信号
wire[3:
0]SH,SL,MH,ML,HH,HL;
0]LED_mode;
0]HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24;
wire_1HZ,_10ms,_250ms,_500ms;
wireKeydone1;
wireKeydone2;
wireco1,co11,co111,co2,co22,co222,set_co2;
assigndian=1'
devide_fu1(_1HZ,_10ms,_250ms,_500ms,reset,clk);
//分频,得到4种不同频率的时钟信号
key_pressu2(_10ms,MODE,Keydone1);
//模式档按钮去抖动
key_pressu20(_10ms,BT2,Keydone2);
//调节按钮去除抖动
modeu3(Keydone1,mode_flag);
//通过模式按钮产生不同模式
//秒计时
//分计时
//小时计时
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灯显示
分频模块:
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;
Q2<
Q3<
Q4<
elseif(Q2>
d249999)
_10ms=~_10ms;
elseif(Q4>
d6299999)
_250ms=~_250ms;
elseif(Q3>
_500ms=~_500ms;
=Q2+1'
=Q3+1'
=Q4+1'
endmodule
计时模块:
modulesecond(cp,reset,mode_flag,BT2,SH,SL,co);
reset)
begin
SL=4'
SH=4'
cnt<
BT2))
el