基于FPGA的Verilog HDL数字钟设计Word下载.docx
- 文档编号:18893350
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:19
- 大小:20.25KB
基于FPGA的Verilog HDL数字钟设计Word下载.docx
《基于FPGA的Verilog HDL数字钟设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的Verilog HDL数字钟设计Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
当认为时钟不准确时,可以分别对分钟和小时位的值进行调整;
4.秒表功能:
利用4个数码管完成秒表显示:
可以实现清零、暂停并记录时间等功能。
秒表利用4位数码管计数;
方案说明:
本次设计由时钟模块和译码模块组成。
时钟模块中50MHz的系统时钟clk分频产生一个1Hz的使能控制信号enable,并以此产生1s的脉冲second_en以实现每秒计时,控制各个模式下的计数显示。
由模式控制信号选择当前数码管显示哪个状态:
mode=00,时钟常规显示状态,
mode=01,闹铃定时状态,
mode=10,时钟校时状态,
mode=11,秒表计时状态;
时钟:
利用count,smin0,smin1,shour0,shour1的计数来实现,具体情况见程序;
校时:
当turn=1时,调整分位smin1、smin0;
当turn=0时,调整小时位shour1、shour0;
闹铃:
当turn=1时,调整分位amin1、amin0;
当turn=0时,调整小时位ahour1、ahour0;
秒表:
当pause=0时,开始计时;
当pause=1时,暂停。
4、实验代码
时钟模块
moduleclock(clk,
clr,
pause,
turn,
mode,
sec,
min1,
min0,
hour1,
hour0,
alert,
LD_alert
);
inputclk;
//时钟信号(50MHz)
inputclr;
//清零键
inputpause;
//秒表暂停键
inputturn;
//调整分还是小时位的控制
input[1:
0]mode;
//决定时钟显示功能状态
outputsec;
//接发光二极管
output[3:
0]min1;
//用于输出接数码管4
0]min0;
//用于输出接数码管3
0]hour1;
//用于输出接数码管2
0]hour0;
//用于输出接数码管1
outputalert;
//接发光二极管,代替蜂鸣器
outputLD_alert;
//当闹铃设定后,发光二极管显示
wiresec;
//秒位显示
wireLD_alert;
//用于闹铃存在时的提醒显示
//wireclk1;
//时钟1s
//wireclk2;
//时钟100ms,用于秒表最小计时单位
//wireclr1;
reg[3:
//常规显示
0]smin1;
//校时
0]smin0;
0]shour1;
0]shour0;
0]amin1;
//闹铃
0]amin0;
0]ahour1;
0]ahour0;
0]mmin1;
//秒表
0]mmin0;
0]mhour1;
0]mhour0;
regalert;
//当闹铃到时高电平输出
reg[7:
0]count;
reg[24:
0]counter;
regenable;
regen1,en2;
wiresecond_en;
always@(posedgeclk)//generate1s
begin
if(clr)
begin
counter=0;
enable=0;
end
else
counter=counter+1;
if(counter==25'
d249)//仿真时可将闸门信号设为0.00001s,加快仿真速度
//
begin
enable=~enable;
counter=25'
d0;
end
end
always@(posedgeclk)//?
begin
en1<
=1'
b0;
en2<
=enable;
=en1;
end
assignsecond_en=(!
en1)&
&
(en2);
always@(posedgeclk)
if(clr)
amin1<
=0;
amin0<
ahour1<
ahour0<
smin1<
smin0<
shour1<
shour0<
mmin1<
mmin0<
mhour1<
mhour0<
count<
elseif(second_en)
count<
=count+1;
///////////////////////////////////////////////////////////////////////////////////////////
if(mode==2'
b01)//闹铃调时状态
if(turn==1)//当turn为高电平时调整分位
if((amin1==5)&
(amin0==9))
if(amin0==9)
begin
=amin1+1;
=amin0+1;
else//当turn为低电平时调整小时位
if((ahour1==2)&
(ahour0==3))
if(ahour0==9)
=ahour1+1;
=ahour0+1;
////////////////////////////////////////////////////////////////////////////////////////
b10)//时钟调时状态
if((smin1==5)&
(smin0==9))
if(smin0==9)
=smin1+1;
=smin0+1;
if((shour1==2)&
(shour0==3))
if(shour0==9)
=shour1+1;
=shour0+1;
else//以下是常规显示
begin
if(count==59)
if(smin0==9)
begin
smin0<
smin1<
if(smin1==5)
begin
shour0<
if(shour0==3)
begin
shour1<
if(shour1==2)
end
end
end
end
////////////////////////////////////////////////////////////////////////////////
if(mode==2'
b11)
begin//秒表计时状态
if(pause==0)//当pause为低电平时开始计时
=mmin0+1;
if(mmin0==9)
=mmin1+1;
if(mmin1==9)
mmin1<
mhour0<
=mhour0+1;
if(mhour0==9)
mhour1<
=mhour1+1;
if(mhour1==9)
end
end
assignLD_alert=(amin1|amin0|ahour1|ahour0)?
1:
0;
//当闹铃有定时后LD_alert发光以示闹铃已定
assignsec=enable;
//将秒针接到LED灯
always@(posedgeclk)
alert<
else
if((amin1==smin1)&
(amin0==smin0)&
(ahour1==shour1)&
(ahour0==shour0))
=1;
//对闹铃做检查,时间到时发光
elsealert<
//以下为选择显示模块
always@(posedgeclk)
min1<
min0<
hour1<
hour0<
case(mode)
2'
b01:
begin//mode=01时,显示闹铃模块
=amin1;
=amin0;
=ahour1;
=ahour0;
b10:
begin//mode=10时,显示校时模块
=smin1;
=smin0;
=shour1;
=shour0;
b11:
begin//mode=11时,显示秒表模块
=mmin1;
=mmin0;
=mhour1;
=mhour0;
b00:
begin//其他状态,显示普通时钟模块
endcase
endmodule
译码模块
moduledisplay(q,ctr,h1,h0,m1,m0,clk,reset);
output[6:
0]q;
output[3:
0]ctr;
input[3:
0]h1,h0,m1,m0;
inputclk,reset;
reg[6:
0]q;
reg[25:
0]count;
reg[3:
0]temp;
0]scan;
//delayyanshi(clk,clk2);
always@(posedgeclk)
if(reset)
count=0;
count=count+1;
always@(posedgeclk)//SegScan
if(reset)
scan<
=4'
b0000;
case(count[1:
0])//仿真时将扫描信号频率加快1000倍
//case(count[11:
10])//执行设计时将扫描频率改回
b0111;
b1011;
b1101;
b1110;
assignctr=scan;
always@(posedgeclk)//SegScan
temp<
=h1;
=h0;
=m1;
=m0;
always@(posedgeclk)//数码管译码
q<
=7'
b0000000;
case(temp)
4'
d0:
q<
b0000001;
//0
d1:
b1001111;
//1
d2:
b0010010;
//2
d3:
b0000110;
//3
d4:
b1001100;
//4
d5:
b0100100;
//5
d6:
b0100000;
//6
d7:
b0001111;
//7
d8:
//8
d9:
b0000100;
//9
default:
UCF文件
NET"
clk"
LOC="
B8"
;
#50M
#PinassignmentforDispCtl
#ConnectedtoBasys2onBoard7qdisplay
6>
"
L14"
#Bank=1,Signalname=CA
5>
H12"
#Bank=1,Signalname=CB
4>
N14"
#Bank=1,Signalname=CC
3>
N11"
#Bank=2,Signalname=CD
2>
P12"
#Bank=2,Signalname=CE
1>
L13"
#Bank=1,Signalname=CF
0>
M12"
#Bank=1,Signalname=CG
#NET"
dp"
N13"
#Bank=1,Signalname=DP
ctr<
K14"
#Bank=1,Signalname=AN3
M13"
#Bank=1,Signalname=AN2
J12"
#Bank=1,Signalname=AN1
F12"
#Bank=1,Signalname=AN0
reset"
N3"
#Bank=2,Signalname=SW7
mode<
E2"
#Bank=3,Signalname=SW6
F3"
#Bank=3,Signalname=SW5
turn"
G3"
#Bank=3,Signalname=SW4
pause"
B4"
#Bank=3,Signalname=SW3
LD_alert"
P7"
;
#Bank=3,Signalname=LD2
alert"
M11"
#Bank=2,Signalname=LD1
sec"
M5"
#Bank=2,Signalname=LD0
testbench
moduletb_test;
//Inputs
regclk;
regreset;
reg[1:
0]mode;
regturn;
regpause;
//Outputs
wire[6:
wire[3:
wiresec;
wirealert;
wireLD_alert;
//InstantiatetheUnitUnderTest(UUT)
clkuut(
.clk(clk),
.reset(reset),
.mode(mode),
.turn(turn),
.pause(pause),
.q(q),
.ctr(ctr),
.sec(sec),
.alert(alert),
.LD_alert(LD_alert)
parameterPERIOD=10;
alwaysbegin
clk=1'
#(PERIOD/2)clk=1'
b1;
#(PERIOD/2);
initialbegin
//InitializeInputs
reset=1;
mode=2'
b00;
turn=0;
pause=0;
//Wait100nsforglobalresettofinish
#500;
reset=0;
#600000;
b01;
#60000;
turn=1;
b10;
b11;
pause=1;
//Addstimulushere
5、仿真
进入ISim仿真波形界面
(1)仿真,运行1ms,将波形结果调整为适合的大小。
(2)这时我们可以分别点开clock模块和display模块查看具体的信号变化是否正确。
我们先看clock模块。
(3)当mode=00时,实现正常时钟显示功能。
在脉冲second_en到来时,count做计数加1,此时小时位是shour1,shour0,分钟位是smin1,smin0,将这几个相关信号在波形窗口中位置做个调整放到一起来查看。
当count计数到59时,分钟位smin0实现加1变化,由0变为1;
此时结果是正确的。
(4)当mode=2’b01时,实现闹铃模块。
当turn=0时,调整小时位ahour1、ahour0。
将相关信号放在一起查看,由图可知,当turn为低时,调整小时位,ahour0计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于FPGA的Verilog HDL数字钟设计 基于 FPGA Verilog HDL 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)