用Verilog语言编写的多功能数字钟Word文件下载.docx
《用Verilog语言编写的多功能数字钟Word文件下载.docx》由会员分享,可在线阅读,更多相关《用Verilog语言编写的多功能数字钟Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![用Verilog语言编写的多功能数字钟Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-2/3/c4d215c6-16e4-476c-bb78-0abc09076cbb/c4d215c6-16e4-476c-bb78-0abc09076cbb1.gif)
对应FPGA管脚
说明
S1
按键开关S1
R16
调整小时
S2
按键开关S2
P14
调整分钟
RST
按键开关S8
M15
复位
LED
LED模块D1
L14
整点倒计时
LEDAG0
数码管模块A段
N4
时间显示
LEDAG1
数码管模块B段
G4
LEDAG2
数码管模块C段
H4
LEDAG3
数码管模块D段
L5
LEDAG4
数码管模块E段
L4
LEDAG5
数码管模块F段
K4
LEDAG6
数码管模块G段
K5
SEL0
数码管选择位1
M4
8个数码管的选择位
SEL1
数码管选择位2
F3
SEL2
数码管选择位3
F4
CP
脉冲源
J3
50Mhz脉冲
三.基于VerilogHDL语言的电路设计、仿真与综合
(一)顶层模块
本程序采用结构化设计方法,将其分为彼此独立又有一定联系的三个模块,如图1所示:
图1:
顶层结构框图
(二)子模块
1.分频器
分频器的作用是对50Mhz的系统时钟信号进行分频,得到频率为1000hz的信号,作为显示器的输入信号。
源程序如下:
modulefenpin(inputCP,outputCPout);
regCPout;
reg[31:
0]Cout;
regCP_En;
always@(posedgeCP)//将50MHz分频为1kHz
begin
Cout<
=(Cout==32'
d50000)?
32'
d0:
(Cout+32'
d1);
CP_En<
1'
d1:
d0;
CPout<
=CP_En;
end
endmodule
功能仿真波形如图2所示(以五分频为例):
2.控制器和计数器
控制器的作用是,调整小时和分钟的值,并能实现清零功能。
计数器的作用是实现分钟和秒钟满60进1,小时则由23跳到00。
当到达59分55秒的时候,LED灯会闪烁来进行报时。
因为控制器和计数器的驱动信号频率均为1Hz,故从分频器输出的信号进入控制器后,要进行二次分频,由1Khz变为1Hz。
modulekongzhiqi(CPout,S1,S2,RET,Hour,Minute,Second,LED);
inputCPout,S1,S2,RET;
output[5:
0]Hour;
0]Minute;
0]Second;
outputLED;
reg[5:
regR1;
regR2,R8,LED;
reg[10:
regClk_En;
always@(posedgeCPout)
if(S1==0)
begin
R1=1;
end
if(S2==0)
R2=1;
if(RET==0)
R8=1;
Cout=(Cout==32'
d1000)?
32'
d0:
(Cout+32'
Clk_En=(Cout==32'
1'
d1:
if(Clk_En)
if(R1==1)
begin
if(Hour<
24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
R1=0;
end
if(R2==1)
if(Minute<
60)
Minute=Minute+1;
if(Minute==60)
Minute=0;
if(Hour<
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
R2=0;
if(Second<
Second=Second+1;
if(Second==60)
Second=0;
if((Minute==59)&
&
(Second>
55))//整点倒计时
if(LED==1)
LED=0;
else
LED=1;
else
LED=0;
if(R8==1)//清零
Hour=0;
Minute=0;
R8=0;
end
end
功能仿真波形如图3所示:
3.显示器
显示器的作用是将时—分—秒的值在数码管上依次显示出来。
从分频器输出的1Khz的信号作为数码管的扫描信号。
SEL表示三个数码管选择位,它的取值表示八个数码管,从左至右依次是111~000。
LEDGA表示七段数码管,它的取值决定特定位数上显示的数字。
modulexianshi(CPout,Hour,Minute,Second,SEL,LEDAG);
inputCPout;
inputHour,Minute,Second;
outputSEL,LEDAG;
reg[2:
0]SEL;
reg[6:
0]Led;
reg[3:
0]shi1,ge1,shi2,ge2,shi3,ge3;
always@(posedgeCPout)
shiwei1=Hour/10;
gewei1=Hour%10;
shiwei2=Minute/10;
gewei2=Minute%10;
shiwei3=Second/10;
gewei3=Second%10;
if(SEL==3'
b110)//判断位选SEL的值,并将此位上的值输出到数码管
case(shiwei1)
4'
b0000:
Led=7'
b0111_111;
4'
b0001:
b0000_110;
b0010:
b1011_011;
b0011:
b1001_111;
b0100:
b1100_110;
b0101:
b1101_101;
b0110:
b1111_101;
b0111:
b0000_111;
b1000:
b1111_111;
b1001:
b1101_111;
default:
Led=7'
b0000_000;
endcase
b101)
case(gewei1)
b100)
Led=7'
b1000_000;
b011)
case(shiwei2)
b010)
case(gewei2)
b001)
if(SEL==3'
b000)
case(shiwei3)
Led=7'
endcase
b111)
case(gewei3)
SEL=SEL+3'
d1;
assign
LEDAG=Led;
四.总结体会
这次课程设计虽然只有短短的四天,但我的收获却很大。
通过这次实习,我掌握了EDA设计的基本流程(即设计输入—编译—调试—仿真—下载),领会了自顶而下结构化设计的优点,并具备了初步的EDA程序设计能力。
我感觉,这个程序最难的地方在于顶层模块的设计,因为顶层模块需要将各个子模块按照电路原理有机地结合起来,这需要扎实的理论功底,而这正是我所欠缺的。
相比而言,子模块的设计就容易多了,因为Verilog语言和C语言有很多相似之处,只要明白了实验原理,就不难完成,水平的高下只体现在程序的简洁与否。
Verilog源程序的编写很容易出现错误,这就需要耐心的调试。
因为很多情况下,一长串的错误往往是由一个不经意的小错误引起的。
当程序屡调屡错的时候,最好和其他同学沟通交流一下,他们不经意的一句话,就可能给我启发,使问题迎刃而解。
这次实习,给我感触最深的还是行为态度问题。
人的能力有大有小,但只要端正态度,不抛弃,不放弃,任何人都能取得令自己满意的成绩。
在此,我由衷的感谢在这次课程设计中给了我巨大帮助的老师和同学们!