#用Verilog语言编写的多功能数字钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2009—2010学年第二学期
《数字电子技术课程设计》报告
专业班级:电气-08-1
姓名:曹操
学号:08051127
设计日期:2010年8月23日~27日
一.设计题目
多功能数字钟电路设计
二.设计任务及要求
多功能数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。
整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23时。
在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD 码)显示个位,对于小时因为他的范围是从0~23,所以可以用一个2位的二进制码显示十位,用一个4位的二进制码(BCD码)显示个位。
实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz 时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的1Hz 信号,必须对输入的系统时钟50Mhz进行分频。
对于整点报时功能,本实验设计的是当进行正点的倒计时5秒时,让LED来闪烁进行整点报时的提示。
调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00—00—00。
管脚分配如下表:
端口名使用模块信号对应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 脉冲
三.基于Verilog HDL 语言的电路设计、仿真和综合 (一)顶层模块
本程序采用结构化设计方法,将其分为彼此独立又有一定联系的三个模块,如图1所示:
图1:顶层结构框图
(二)子模块 1.分频器
分频器的作用是对50Mhz 的系统时钟信号进行分频,得到频率为1000hz 的信号,作为显示器的输入信号。
源程序如下:
module fenpin(input CP, output CPout );
reg CPout;
reg [31:0] Cout;
Location P IN_R16Option Value VCC S1
INPUT Location P IN_P 14
Option Value VCC S2INPUT Location P IN_J3
Option Value VCC
CP
INPUT Location P IN_M4Location P IN_F3Location P IN_F4Option Value SEL[2..0]OUTPUT Location P IN_L14
Option Value LED
OUTPUT
Location P IN_N4Location P IN_G4Location P IN_H4Location P IN_L5Location P IN_L4Location P IN_K4Location P IN_K5
Option Value LEDAG[6..0]
OUTPUT
CP CPout
f enpin
inst1
CPout
S1S2RET
Hour[5..0]Minute[5..0]Second[5..0]
LED
kongzhiqi
inst2
VCC
RET
INPUT CPout Hour[5..0]
Minute[5..0]
Second[5..0]
SEL[2..0]LEDAG[6..0]
xianshi
inst
CP CPout
f enpin
inst1
VCC
CP
INPUT
CPout
OUTPUT
reg CP_En;
always @(posedge CP ) //将50MHz分频为1kHz
begin
Cout <= (Cout == 32'd50000) ? 32'd0 : (Cout + 32'd1);
CP_En <= (Cout == 32'd50000) ? 1'd1 : 1'd0;
CPout <= CP_En;
end
endmodule
功能仿真波形如图2所示(以五分频为例):
2.控制器和计数器
控制器的作用是,调整小时和分钟的值,并能实现清零功能。
计数器的作用是实现分钟和秒钟满60进1,小时则由23跳到00。
当到达59分55秒的时候,LED灯会闪烁来进行报时。
因为控制器和计数器的驱动信号频率均为1Hz,故从分频器输出的信号进入控制器后,要进行二次分频,由1Khz变为1Hz。
源程序如下:
module kongzhiqi( CPout,S1,S2,RET,Hour,Minute,Second,LED );
input CPout,S1,S2,RET;
output [5:0] Hour;
output [5:0] Minute;
output [5:0] Second;
output LED;
reg [5:0] Hour;
reg [5:0] Minute;
reg [5:0] Second;
reg R1;
reg R2,R8,LED;
reg [10:0] Cout;
reg Clk_En;
always@(posedge CPout)
begin
if(S1==0)
begin
R1=1;
end
if(S2==0)
begin
R2=1;
end
if(RET==0)
begin
R8=1;
end
Cout=(Cout==32'd1000)?32'd0:(Cout + 32'd1);
Clk_En=(Cout==32'd1000)?1'd1:1'd0;
if(Clk_En)
begin
if(R1==1)
begin
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
R1=0;
end
if(R2==1)
begin
if(Minute<60)
Minute=Minute+1;
if(Minute==60)
begin
Minute=0;
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
end
R2=0;
end
if(Second<60)
Second=Second+1;
if(Second==60)
begin
Second=0;
if(Minute<60)
Minute=Minute+1;
if(Minute==60)
begin
Minute=0;
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
end
end
if((Minute==59)&&(Second>55))//整点倒计时
begin
if(LED==1)
LED=0;
else
LED=1;
end
else
LED=0;
if(R8==1)//清零
begin
Hour=0;
Minute=0;
Second=0;
R8=0;
end
end
end
endmodule
功能仿真波形如图3所示:
3.显示器
显示器的作用是将时—分—秒的值在数码管上依次显示出来。
从分频器输出的1Khz的信号作为数码管的扫描信号。
SEL 表示三个数码管选择位,它的取值表示八个数码管,从左至右依次是111~000。
LEDGA表示七段数码管,它的取值决定特定位数上显示的数字。
源程序如下:
module xianshi( CPout,Hour,Minute,Second,SEL,LEDAG );
input CPout;
input Hour,Minute,Second;
output SEL,LEDAG;
reg [2:0] SEL;
reg [6:0] Led;
reg [3:0] shi1,ge1,shi2,ge2,shi3,ge3;
always @(posedge CPout )
begin
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: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
endcase
if(SEL==3'b101)
case(gewei1)
4'b0000: Led = 7'b0111_111;
4'b0001: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
endcase
if(SEL==3'b100)
Led=7'b1000_000;
if(SEL==3'b011)
case(shiwei2)
4'b0000: Led = 7'b0111_111;
4'b0001: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
if(SEL==3'b010)
case(gewei2)
4'b0000: Led = 7'b0111_111;
4'b0001: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
endcase
if(SEL==3'b001)
Led=7'b1000_000;
if(SEL==3'b000)
case(shiwei3)
4'b0000: Led = 7'b0111_111;
4'b0001: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
endcase
if(SEL==3'b111)
case(gewei3)
4'b0000: Led = 7'b0111_111;
4'b0001: Led = 7'b0000_110;
4'b0010: Led = 7'b1011_011;
4'b0011: Led = 7'b1001_111;
4'b0100: Led = 7'b1100_110;
4'b0101: Led = 7'b1101_101;
4'b0110: Led = 7'b1111_101;
4'b0111: Led = 7'b0000_111;
4'b1000: Led = 7'b1111_111;
4'b1001: Led = 7'b1101_111;
default: Led = 7'b0000_000;
SEL = SEL + 3'd1;
end
assign
LEDAG=Led;
endmodule
四.总结体会
这次课程设计虽然只有短短的四天,但我的收获却很大。
通过这次实习,我掌握了EDA设计的基本流程(即设计输入—编译—调试—仿真—下载),领会了自顶而下结构化设计的优点,并具备了初步的EDA程序设计能力。
我感觉,这个程序最难的地方在于顶层模块的设计,因为顶层模块需要将各个子模块按照电路原理有机地结合起来,这需要扎实的理论功底,而这正是我所欠缺的。
相比而言,子模块的设计就容易多了,因为Verilog
语言和C语言有很多相似之处,只要明白了实验原理,就不难完成,水平
的高下只体现在程序的简洁和否。
Verilog源程序的编写很容易出现错误,这就需要耐心的调试。
因为很多情况下,一长串的错误往往是由一个不经
意的小错误引起的。
当程序屡调屡错的时候,最好和其他同学沟通交流一
下,他们不经意的一句话,就可能给我启发,使问题迎刃而解。
这次实习,给我感触最深的还是行为态度问题。
人的能力有大有小,
但只要端正态度,不抛弃,不放弃,任何人都能取得令自己满意的成绩。
在此,我由衷的感谢在这次课程设计中给了我巨大帮助的老师和同学们!
11。