verilog数字钟设计FPGA文档格式.docx

上传人:b****7 文档编号:22112006 上传时间:2023-02-02 格式:DOCX 页数:23 大小:43.65KB
下载 相关 举报
verilog数字钟设计FPGA文档格式.docx_第1页
第1页 / 共23页
verilog数字钟设计FPGA文档格式.docx_第2页
第2页 / 共23页
verilog数字钟设计FPGA文档格式.docx_第3页
第3页 / 共23页
verilog数字钟设计FPGA文档格式.docx_第4页
第4页 / 共23页
verilog数字钟设计FPGA文档格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

verilog数字钟设计FPGA文档格式.docx

《verilog数字钟设计FPGA文档格式.docx》由会员分享,可在线阅读,更多相关《verilog数字钟设计FPGA文档格式.docx(23页珍藏版)》请在冰豆网上搜索。

verilog数字钟设计FPGA文档格式.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1