关键词:EDA;VHDL;数字频率计;波形仿真;CPLD�
1引言
VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(The Institute of Electrical and Electronics Engineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(Top to Down)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD器件中去,从而实现可编程的专用集成电路(ASIC)的设计。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体的性能和可靠性。
本文用VHDL在CPLD器件上实现一种8 b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。具陪旅有体积小、可靠性高、功耗低的特点。
2数字频率计的基本设计原理
数字频率计的原理框图如图1所示。他主要由5个模块组成,分别是:脉冲发生器电路、测频控制信号发生器电路、计数模块电路、锁存器、译码驱动电路。�
当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。�
3设计实现�
3.1系统方框图的划分和结构设计
根据数字频率计的系统原理框图(图1虚线框内),设计系统的顶层电路图如图2所示。�
图2中TESTCTL为测频控制信号发生器。TESTCTL的计数使能信号TSTEN能产生一个1 s宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制:当TSTEN高电平时允许带乱握计数、低电平时停止计数。
REG32B为锁存器。在信号Load的上升沿时,立即对模块的输入口的数据锁存到REG32B的内部,并由REG32B的输出端输出,然后,七段译码器可以译码输出。在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
CNT10为十进制计数器。有一时钟使能输入端ENA,用于锁定计数值。当高电平时允许计数,低电平时禁止计数。图2中将8个十进制计数器CNT10级联起来实现8 b十进制计数功能。
SEVYM为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。
为了实现系统功能,测频控制信号发生器TESTCTL、计数器CNT10、锁存器REG32B存在一个工作时序的问题,设计时需要综合考虑。
图3给出了系统的工作时序。图3中CLK是由图1中脉冲发生器产生的频率为1 Hz的标准时钟信号,当测频控制信号发生蠢庆器TESTCTL的TSTEN端为高电平时允许计数、低电平时停止计数,在停止计数期间,测频控制信号发生器TESTCTL的Load端产生一个上升沿,将计数器在前1 s的计数值锁存进32 b锁存器REG32B中,并由8个7段译码器将计数结果译出稳定显示。锁存信号之后经过半个CLK周期,测频控制信号发生器TESTCTL的CLR�_CNT端产生一个上升沿,对计数器进行清零。为下1 s的计数 *** 作做准备。
为了产生这个时序图,首先有一个D触发器构成二分频器,在每次时钟CLK的上升沿到来使其值翻转。D触发器的输出高电平正好是1 s,因此可以作为测频控制信号发生器TESTCTL的TSTEN端,用来控制计数。而Load信号正好是TSTEN端信号的翻转。在计数结束后半个CLK周期,CLK与TSTEN都为低电平,这时CLR�_CNT产生一个上升沿作为清零信号。�
3.2各模块的VHDL源程序
采用VHDL描述数字频率计的电路时,根据图2所示的数字频率计系统顶层电路图,按照自顶向下的设计思路,编写各个模块的VHDL源程序,最后再对各个模块进行组合,编写顶层描述的VHDL源程序,由于篇幅所限,本文仅介绍数字频率计顶层描述的源程序,各个模块的VHDL源程序编写较为简单,可以根据各自的功能,相应地写出。
8位数字频率计的顶层描述VHDL源程序为:
4系统的功能仿真
Lattice公司推出的Isp Expert的数字系统设计软件,是一套完整的EDA软件,能够对所设计的数字电子系统进行时序仿真和功能仿真。
采用Lattice公司推出的Isp Expert EDA软件,对所编写数字频率计VHDL源程序进行编译、逻辑综合,自动地把VHDL描述转变为门级电路。然后进行波形仿真,编写的仿真测试向量文件如下(为仿真简单起见,测试一个66 Hz的周期信号):
仿真后得到的波形图如图4所示,从仿真波形上看测量的结果是准确的。还可以进一步修改测试向量文件,进行波形仿真。最后通过编程电缆,将所设计的内容下载到CPLD器件中,进行实物仿真。�
5结语
本文介绍了使用VHDL语言设计数字频率计的方法,并下载到CPLD中组成实际电路,这样可以简化硬件的开发和制造过程,而且使硬件体积大大缩小,并提高了系统的可靠性。同时在基本电路模块基础上,不必修改硬件电路,通过修改VHDL源程序,增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。
#includeunsigned char code
dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
unsigned char a=0,b=0,c=0,d=0
unsigned int pinlv=0
unsigned long int count=0
void delay() //延时约20ms
{
int j
for(j=0j<2000j++)
}
void display() //碰棚显示函数
{
a=pinlv/1000
b=pinlv/100%10
c=pinlv%100/10
d=pinlv%10
P2=0xf1
P0=dispcode[a]//显示千位
delay()
P2=0xf2
P0=dispcode[b]//显示百位
delay()
P2=0xf4
P0=dispcode[c]//显示十位
delay()
P2=0xf8
P0=dispcode[d]//显示个位
delay()
}
void delay1(n) //延时约2n毫秒
{
int i,j
for(i=0i<ni++)
{
for(j=0j<255j++) {}
display()
}
}
void main(void)
{
EA=0
TMOD=0x51//定时器0为16位计数器模式,定时器0为16位定时器模式
TH0=15602/256//50毫秒定时。
TL0=15602%256
T1=1
ET0=1
//
EA=1
TR1=1
TR0=1
while(1)
{
display()
}
}
void time0(void)interrupt 1 using 2 //定时器0中断,使用第二工作寄存器组
{
ET0=0
count++
if(count==20) //1秒时间到
{
count=0
TR1=0
pinlv=TH1*256+TL1//取计数器1的计数值
TH1=0//颂此取值后重新笑樱则归零
TL1=0
TR1=1
}
TH0=15602/256//定时器0赋初值
TL0=15602%256
TR0=1
ET0=1
}
八位单片机存储的数据是八位,两个字节16位。不姿拆过你不用关心这问题,对你来说他就是一个整兆友数而已,你的编译器会帮你搞定。hundreds = temp/100//百位
decade = temp/10%10//十位
units = temp%10//个位
此外:temp=TMR1H*256+TMR1L这一句改改
temp=TMR1H<<8+TMR1L
现在很多编译器会帮你改成这样,不过自己写成族册槐这样总不会错的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)