verilog数字钟设计FPGA文档格式.docx
《verilog数字钟设计FPGA文档格式.docx》由会员分享,可在线阅读,更多相关《verilog数字钟设计FPGA文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
![verilog数字钟设计FPGA文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/0aa477c9-171d-4502-902d-4db8c646be37/0aa477c9-171d-4502-902d-4db8c646be371.gif)
assigndian=1'
b0;
devide_fu1(_1HZ,_10ms,_250ms,_500ms,reset,clk);
//分频,得到4种不同频率的时钟信号
key_pressu2(_10ms,MODE,Keydone1);
//模式档按钮去抖动
key_pressu20(_10ms,BT2,Keydone2);
//调节按钮去除抖动
modeu3(Keydone1,mode_flag);
//通过模式按钮产生不同模式
secondu4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1);
//秒计时
minuteu5(co11,reset,MH24,ML24,co2);
//分计时
houru6(co22,reset,HH24,HL24);
//小时计时
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灯显示
Endmodule
分频模块:
分频模块的作用主要是要获得各种频率的时钟信号。
输入信号为50MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对50MHZ信号分频。
通过计数的方式,当计数从0开始到24999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。
对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。
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;
always@(posedge_50MHZornegedgenCR)begin
if(~nCR)
begin
Q1<
=32'
d0;
Q2<
Q3<
Q4<
end
elseif(Q1>
d24999999)
_1HZ=~_1HZ;
end
elseif(Q2>
d249999)
_10ms=~_10ms;
elseif(Q4>
d6299999)
_250ms=~_250ms;
elseif(Q3>
d12499999)
_500ms=~_500ms;
elsebegin
=Q1+1'
d1;
=Q2+1'
=Q3+1'
=Q4+1'
endmodule
计时模块:
秒计数:
在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。
分钟计数:
在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。
小时计数:
脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。
如果有复位信号,则时分秒全部清零。
modulesecond(cp,reset,mode_flag,BT2,SH,SL,co);
inputcp,reset,BT2;
input[3:
outputco=1'
regco;
output[3:
0]SL,SH;
reg[3:
0]SH,SL;
reg[7:
0]cnt;
always@(posedgecpornegedgereset)
begin
if(!
reset)
begin
SL=4'
SH=4'
cnt<
=8'
end
elseif((mode_flag==4'
b0010)&
&
(!
BT2))
else
if(cnt==8'
d59)
cnt<
SH<
=4'
SL<
co<
=1'
b1;
else
begin
co=1'
cnt=cnt+8'
=cnt%10;
=cnt/10;
endmodule
moduleminute(cp,reset,MH,ML,co);
inputcp,reset;
0]ML,MH;
0]MH,ML;
always@(posedgecpornegedgereset)
ML=4'
MH=4'
else
MH<
ML<
end
modulehour(cp,reset,HH,HL);
inputcp,reset;
0]HL,HH;
0]HH,HL;
HL=4'
HH=4'
d23)
HH<
HL<
模式选择模块:
同过一个模式档按键MODE,按一下产生对应一种模式mode_flag,并且可以循环。
在不同的模式下可以进行不同的操作。
其中mode_flag=4'
0000为正常显示计时,mode_flag=4'
0001为小时调钟模式,mode_flag=4'
00010为分钟调钟模,mode_flag=4'
0011为闹钟小时设置模式,mode_flag=4'
0100为闹钟分钟设置模式。
modulekey_press(_10ms,KEY,Keydone);
inputKEY,_10ms;
outputKeydone;
regdout1,dout2,dout3;
always@(posedge_10ms)
dout1<
=KEY;
dout2<
=dout1;
dout3<
=dout2;
assignKeydone=(dout1|dout2|dout3);
modulemode(MODE,mode_flag);
inputMODE;
reg[3:
always@(negedgeMODE)
mode_flag=mode_flag+4'
if(mode_flag==4'
b0101)
mode_flag=2'
endmodule
moduleLED_mode(mode_flag,SH24,SL24,SH,SL);
input[3:
0]mode_flag;
0]SH24,SL24;
always@(mode_flag)begin
case(mode_flag)
4'
b0000:
=SH24;
=SL24;
b0001:
b0000;
b0001;
b0010:
b0010;
b0011:
b0100;
b0100:
b1000;
default:
endcase
endmodule
ModuleLUT_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;
inputH12_24;
0]MH,ML,HH,HL;
reg[3:
always@(mode_flagorH12_24)begin
b0011,
=set_HH;
=set_HL;
=set_MH;
=set_ML;
default:
if(H12_24)begin
=HH12;
=HL12;
=MH24;
=ML24;
elsebegin
=HH24;
=HL24;
modulemode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);
inputBT2,_250ms,co1,co2,set_co2;
outputco11,co22,co111,co222;
supply1Vdd;
regco11,co22,co111,co222;
always@(mode_flag)begin
case(mode_flag)
if(~BT2)co22<
=_250ms;
elsebeginco22<
=co2;
co11<
=co1;
if(~BT2)beginco11<
co22<
elsebeginco11<
beginco22<
if(~BT2)co222<
elseco222<
=set_co2;
if(~BT2)co111<
elseco111<
=Vdd;
endcase
闹钟模块:
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);
modulenaozhong(Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);
inputAlarm_ctr,_1HZ;
0]HH24,HL24,MH24,ML24;
outputnao_signal;
regsignal;
regnao_signal;
reg[16:
0]Q;
always@(posedge_1HZ)begin
if((~signal)&
(Alarm_ctr))begin
if((set_HH==HH24)&
(set_HL==HL24)&
(set_MH==MH24)&
(set_ML==ML24))signal<
elsesignal<
elseif((signal)&
nao_signal<
=~nao_signal;
Q=Q+nao_signal;
if(Q>
d720)begin
Q<
=16'
signal<
12——24小时切换模块:
modulehour12_24(HH24,HL24,HH12,HL12);
0]HH24,HL24;
0]HH12,HL12;
regflag;
always@(HH24orHL24)begin
if((HH24*10+HL24)<
=12)
HH12<
HL12<
elseif(((HH24*10+HL24)>
=13)&
((HH24*10+HL24)<
=19))
=HL24-4'
d2;
=19)&
=21))
=HL24+4'
d8;
=HH24-4'
整点报时模块:
moduleboshi(HH,HL,MH,ML,SH,SL,_500ms,bao_signal);
input[3:
0]HH,HL,MH,ML,SH,SL;
input_500ms;
outputbao_signal;
regbao_signal;
reg[7:
0]Q1,Q2;
regbao;
always@(posedge_500ms)begin
if(((SH*10+SL)==8'
d59)&
((MH*10+ML)==8'
d59))begin
=7'
bao<
elseif((Q1<
10*HH+HL)&
(bao))
bao_signal<
=~bao_signal;
=Q1+bao_signal;
elseif(Q1==(10*HH+HL))
else
译码显示模块:
一、数码管显示:
通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。
二、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)
h0:
s_out=4'
4'
h1:
b0001;
h2:
h3:
b0011;
h4:
h5:
b0101;
h6:
b0110;
h7:
b0111;
h8:
h9:
b1001;
endcase
assigns_out1=~s_out;
moduleSEG7_LUT(oSEG1,iDIG);
0]iDIG;
output[7:
0]oSEG1;
reg[7:
0]oSEG;
wire[7:
always@(iDIG)
case(iDIG)
oSEG=8'
b00111111;
b00000110;
b01011011;
b01001111;
b01100110;
b01101101;
b01111101;
b00000111;
b01111111;
b01101111;
ha:
b01110111;
hb:
b01111100;
hc:
b00111001;
hd:
b01011110;
he:
b01111001;
hf:
b01110001;