用VHDL实现数字时钟的设计[1]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
收稿日期:2007-06-04 第一作者 刘竹林 男 27岁 助教
用V HDL 实现数字时钟的设计
刘竹林 李晶骅
(十堰职业技术学院电子工程系,湖北十堰442000)
摘 要:以一款数字钟设计为例,较详细的介绍了如何用VHDL 语言设计数字电路,并给出了部分程序、仿真
波形图,并在MAX +plusII 中进行编译、仿真、下载。由此说明利用VHDL 开发数字电路的优点。
关键词:VHDL ;设计;数字钟;应用电路中图分类号:TN953 文献标识码:A
0 引言
VHDL 硬件描述语言在电子设计自动化(EDA )中扮演
着重要的角色,它的出现极大的改变了传统的设计方法、设
计过程乃至设计观念。由于采用了“自顶向下”
(Top 2Down )的全新设计方法,使设计师们摆脱了大量的辅助设计工作,
而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期。
这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。由于设计的主要仿真和调试过程是在高层次上完成的,这不仅有利于早期发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
1 用V HDL 设计一款数字钟
我们设计的数字时钟原理框图如图1。其基本功能划
分为:计数模块(包括秒、分、时)、译码模块、扫描显示控制模块。计数模块由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计数,当计数到23点59分59秒的时候,即一天结束,计数器清零,
新的一天重新开始计数。
图1 数字时钟原理框图
秒计数器的计数时钟信号为1Hz 的标准信号,可以由系
统板上提供的4MHz 信号通过222分频得到。秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。设计一个同时显示时、分、秒6个数字的数字钟,则需要6个七段显示器。若同时点亮这6个七段显示器,则电路中会产生一个比较大的电流,很容易造成电路烧坏,我们通过扫描电路来解决这一问题,通过产生一个扫描信号CS (0)-CS (5)来控制6个七段显示器,依次点亮6个七段显示器,也就是每次只点亮一个七段显示器。只要扫描信号CS (0)-CS (5)的频率超过人的眼睛视觉暂留频率24Hz 以上,就可以达到尽管每次点亮单个七段显示器,却能具有6个同时显示的视觉效果,而且显示也不致闪烁抖动。
其中6位扫描信号一方面控制七段显示器依次点亮,一方面控制6选1选择器输出相应显示数字。
2 模块设计
2.1 VHDL 语言的基本结构
一个独立的设计实体通常包括:实体(EN TIT Y )、结构体(ARCHITECTURE )、配置(CONFIGURA TION )、包集合(PACKGE )、和库(L IBRAR Y )5个部分。其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。VHDL 程序设计基本结构如图2
。
图2 VHDL 程序设计基本结构
2.2 各模块的实现
2.2.1 计数模块(建立VHDL 语言的工程文件)
计数模块由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计数。其VHDL 源程序相差不大由于篇幅有限,这里我们以秒模块的实现为例。程序如下:
library ieee ;
use ieee.std -logic -1164.all ;entity counter -60-bcd is
山西电子技术
2008年第1期
应用实践
port (cen ,clk ,settime :in std -logic ;
q -one :out integer range 0to 9; q -ten :out integer range 0to 9; co :out std -logic );end counter -60-bcd ;
architecture rtl of counter -60-bcd is signal coo :std -logic ; signal clkI :std -logic ; component dff is port (clk ,d :in std -logic ; q :out std-logic ); end component ;begin process (clk ) variable s -one :integer range 0to 9; variable s -ten :integer range 0to 9; begin if clk ’event and clk =’1’then if settime =’1’then if s -one <9then
s -one :=s -one +1; else
s -one :=0;
if s -ten <5then
s -ten :=s -ten +1;
else
s -ten :=0; end if ; end if ; elsif cen =’1’then if s -one <9then
s -one :=s -one +1;
else s -one :=0; if s -ten <5then
s -ten :=s -ten +1;
else
s -ten :=0; end if ; end if ; end if ; end if ; q -one <=s -one ; q -ten <=s -ten ; if s -ten =5and s -one =9then co <=’1’; else co <=’0’; end if ;end process ;clkI <=not clk ;
U1:dff port map (clkI ,co ,co );2.2.2 多路选择控制模块
多路选择控制模块中扫描控制电路产生扫描信号一方面控制6个七段显示器每次只点亮一个七段显示器;另一方面同时控制6×1多路选择器输出相应的显示数字。由于篇幅有限代码就省略了。2.2.3 显示译码模块的设计
该模块描述了一个共阴极数码管显示驱动电路,其输入为选择控制模块的输出,输出信号分别接在数码管的的7个段。例如当输入为‘0’时,输出就为“1111110”,数码管显示0。由于篇幅有限代码就省略了。
3 各模块的编译、仿真
各模块设计完成后,就要对其进行功能仿真。打开MAX +plusII ,选择菜单File/New 命令,进入出现对话框选择中选择“Text Editor File ”选项,即进入文本编辑方式新建一个工程。在编译之前要此工程设置为当前工程。若没有错误则编译通过。新建仿真文件,输入保存。这里以秒模块的仿真为例,其结果如图3
。
图3 秒模块的仿真结果
4 综合
在编译各模块的同时,生成符号文件,把各符号文件按照逻辑功能连接起来(如图4),当然也可以利用元件例化语句进行,然后加上输入输出端口构成顶层系统然后在进行编译。
5 程序下载至芯片
1)点击主菜单Assign/Pin/Location/Chip 进行芯片脚位设置。2)将实体定义的端口名字和下载芯片的管脚进行具体对应。3)最后再进行一次编译,这时系统将产生可以向EPF10K10下载的文件。4)将带芯片的实验板通过下载电缆与计算机并口相连,然后给实验板通电。5)打开下载窗
口选择下载方式、下载器件型号最后点击Configure 按钮将程序写入芯片中。连接外围器件即可工作。
6 结束语
本文通过数字钟实现的例子展现出了现代电子设计新方法2EDA 技术的灵活性,层次化设计方式的优点。VHDL 语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。用VHDL 语言实现电路设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺
(下转第54页)