EDA课设—数字钟设计说明书

  • 格式:doc
  • 大小:237.00 KB
  • 文档页数:15

目录

第一章 系统工作原理 ..................................................................... 1

第二章 程序模块分析 ..................................................................... 2

2.1 时钟分频模块 ..................................................................... 2

2.2 时钟运行模式模块 ................................................................. 2

2.3扫描数码管及蜂鸣模块 ............................................................. 4

2.4数码管显示模块 ................................................................... 5

第三章 时序仿真 ......................................................................... 7

第四章 总结 .............................................................................. 9

参考文献 ................................................................................. 9

附录 .................................................................................... 10

1 基于Verilog HDL设计的多功能数字钟

本文利用Verilog HDL 语言自顶向下的设计方法设计多功能数字钟, 在本文中采用Verilog HDL 语言设计多功能数字钟, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到目的, 并可以通过Verilog HDL 语言的综合工具进行相应硬件电路的生成, 突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点, 具有传统逻辑设计方法所无法比拟的优越性。此程序通过下载到FPGA 芯片后,可应用于实际的数字钟显示中。

第一章 系统工作原理

工作原理:时钟系统由八个数码管显示组成,其中第1、2个显示的为时的高位和低位,第3个数码管显示的是分隔符“-”,第4、5个为分的高低位,第6个也为隔符“-”,第7、8个为秒的高低位。时钟工作时用到两个频率,一个是系统频率Clk,主要用来扫描数码管和分频,第二个是时钟工作频率Clk_1HZ(由Clk分频得来),按下复位键,秒分时显示清零,工作时Clk(489HZ)不断通过3-8译码器值的改变来扫描时钟的八位数码管,由于人眼分辩不出这么高的频率,所以看到的是八个数码管一直同时亮着,与此同时控制端连着七段数码管的七位不断提供秒时分的高低位译码到数码管上显示,当Clk计数到244次(500ms)时,Clk_1HZ翻转一次,这样Clk_1HZ的周期就为1s整,每个Clk_1HZ的上升沿给秒的低位加1。按调时键S1进入调时模式,按下开关时程序里设置扫描到时的高低位时不显示,同时时的低位加1,松开开关时再显示出来,以此实现闪烁的功能,调分键也是同理。

abcdefg3-8译码器核心控制rstS1(调时)S2(调分)489HZ时钟分频为1HZ小时分钟秒

图1、系统原理图

各个输入输出端口定义如下:

Clk: 489HZ 的系统基准时钟输入。作为七段码管扫描频率。将其489分频可得到1HZ的数字钟工作频率。

Rst: 系统复位信号, 低电平有效。复位后显示00-00-00。

S1: 调节小时信号, 低电平有效。每按下一次, 小时增加一个小时。

S2: 调节分钟信号, 低电平有效。每按下一次, 分钟增加一个分钟。 2 Spk: 输出到扬声器, 产生嘀、嗒的报时声。

Sel: 七段码管扫描驱动。因为是八个七段码管,所以Sel 为三位总线。扫描频率为489HZ, 由于人眼的视觉效果, 呈现在眼前的便是整体的时-分-秒显示。

Display: 七段码管显示输出。

除此之外另设了几个寄存器:

Clk_1HZ:1HZ的数字钟工作频率

Clk_Count1:产生1Hz 时钟的分频计数器

Music_Count:产生扬声器声音频率的分频计数器

SECL,SECH:秒的低位和高位

MINL,MINH:分的低位和高位

HOURL,HOURH:时的低位和高位

Disp_Temp:显示存储中间量

第二章 程序模块分析

2.1 时钟分频模块

always@(posedge Clk)

begin

if(Clk_Count1==244) //对计数器进行判断, 以确定Clk_1HZ 信号是否反转

begin

Clk_1HZ<=~Clk_1HZ;

Clk_Count1<=0;

end

else Clk_Count1<=Clk_Count1+1;

end

时钟分频模块实现的功能的把系统时钟(489HZ)分频为Clk_1HZ(1HZ)提供时钟工作频率,Clk_Count1为定义的一个计数器,当计到第244次时,刚好经过500ms(略有误差),Clk_1HZ翻转一次,人为制造出一个1HZ的时钟。

2.2 时钟运行模式模块

always@(posedge Clk_1HZ or negedge Rst)

if(!Rst)//系统复位

begin

SECL<=0;

SECH<=0;

MINL<=0;

MINH<=0; 3 HOURL<=0;

HOURH<=0;

end

else

begin

if(!S1) //调节小时

begin

if(HOURL==9)

begin

HOURL<=0;

HOURH<=HOURH+1;

end

else

begin

if(HOURH==2&&HOURL==3)

begin

HOURL<=0;

HOURH<=0;

end

else

HOURL<=HOURL+1;

end

end

else if(!S2) //调节分钟

begin

if(MINL==9)

begin

MINL<=0;

if(MINH==5) MINH<=0;

else MINH<=MINH+1;

end

else MINL<=MINL+1;

end

else if(SECL==9) //一般运行状态

begin

SECL<=0;

if(SECH==5)

begin

SECH<=0;

if(MINL==9) 4 begin

MINL<=0;

if(MINH==5)

begin

MINH<=0;

if(HOURL==9)

begin

HOURL<=0;

HOURH<=HOURH+1;

end

else if(HOURH==2&&HOURL==3)

begin

HOURL<=0;

HOURH<=0;

end

else HOURL<=HOURL+1;

end

else MINH<=MINH+1;

end

else MINL<=MINL+1;

end

else SECH<=SECH+1;

end

else SECL<=SECL+1;

end

此模块描述的是时钟运行的几种形式,复位之后时分秒的高低位全给赋0,开始计数,按下S1键后,进入调时模式,按下一次加1,再根据各种情况判断是否进位等,同理按下S2键后进入调分模式,什么都不按下的情况下就是一般运行状态,先从秒开始判断,9秒时秒低位给0,高位进1,59秒时秒的高低位全给0,分的低位加1,还有9分59秒、59分59秒的情况等等,完全列举出了时钟运行的各种可能,按情况处理。

2.3扫描数码管及蜂鸣模块

always@(posedge Clk)

begin

Music_Count<=Music_Count+1;

Sel<=Sel+1; //扫描累加

if(MINH==5&&MINL==9&&SECH==5) //在59 分50 秒开始提示

begin

if((SECL%2)==0) //在偶数秒开始发声 5 Spk<=Music_Count[2]; //嘀

else Spk<=0;

end

else if(MINH==0&&MINL==0&&SECH==0&&SECL==0)

Spk<=Music_Count[1]; //嗒

else Spk<=0;

end

此模块的功能是给3-8译码器一个扫描频率为Clk的三位输入,经3-8译码器输出后扫描八个数码管,蜂鸣器实现的是整点报时功能。

2.4数码管显示模块

always@(Sel) //三种扫描方式

begin

if(!S1)

begin

case(Sel)

3'b111:Disp_Temp=4'b1111;

3'b110:Disp_Temp=4'b1111;

3'b101:Disp_Temp=4'b1010;

3'b100:Disp_Temp=MINH;

3'b011:Disp_Temp=MINL;

3'b010:Disp_Temp=4'b1010;

3'b001:Disp_Temp=SECH;

3'b000:Disp_Temp=SECL;

endcase

end

else if(!S2)

begin

case(Sel)

3'b111:Disp_Temp=HOURH;

3'b110:Disp_Temp=HOURL;

3'b101:Disp_Temp=4'b1010;

3'b100:Disp_Temp=4'b1111;