摘 要:本设计结合了EDA技术和直接数字频率合成(DDS)技术。EDA技术是现代电子设计技术的核心,是以电子系统设计为应用方向的电子产品自动化的设计技术。DDS技术则是最为先进的频率合成技术,具有频率分辨率高、频率切换速度快、相位连续、输出相位噪声低等诸多优点。
本文在对现有DDS技术的大量文献调研的基础上,提出了符合FPGA结构的正弦信号发生器设计方案并利用MAXPLUSⅡ软件进行了设计实现。文中介绍了EDA技术相关知识,同时阐述了DDS技术的工作原理、电路结构,及设计的思路和实现方法。经过仿真测试,设计达到了技术要求。
关键词:现场可编程门阵列(FPGA);直接数字频率合成(DDS); 正弦波信号发生器
The design of sine signal generating device
based on FPGA
Abstract:The design that combines EDA technology and Direct Digital Synthesis (DDS) technology. EDA technology is the design of modern electronic technology at the core, electronic system design direction for the application of electronic design automation products technology. DDS technology is the most advanced frequency synthesizer technology with the high-frequency resolution and frequency switching speed, continuous phase, low phase noise output many advantages.
Based on the technology of existing DDS study of the extensive literature on the basis of FPGA with the structure of the sinusoidal signal generator design and the use of FPGA II software located Total realized. The paper introduced the EDA technology-related knowledge, and elaborated on the DDS technology principle, circuit structure, and design ideas and methods. After simulation tests designed to achieve the technical requirements.
Keywords:FPGA;DDS;sine signal generating device
第1章 绪 论
1.1 引言
直接数字频率合成(Digital Direct Frequency Synthesis)是一种比较新颖的频率合成方法。这个理论早在20世纪70年代就被提出,它的基本原理就是利用采样定理,通过查表法产生波形。由于硬件技术的限制,DDS技术当时没能得到广泛应用。但是随着大规模集成电路的飞速发展,DDS技术的优越性已逐步显现出来。今天DDS技术凭借其优越的性能已成为现代频率合成技术中的佼佼者,广泛用于接收机本振、信号发生器、仪器、通信系统、雷达系统等,尤其适合跳频无线电通信系统。不少学者认为,DDS是产生信号和频率的一种理想方法,发展前景十分广阔。
基于FPGA的DDS模型是在EDA技术逐步完善的今天才得以建立起来的。EDA技术依靠功能强大的电子计算机,在EDA工具软件平台上,对以硬件描述语言HDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、简化、分割、综合、优化和仿真,直至下载到可编程逻辑器件CPLD/FPGA或专用集成电路ASIC芯片中,实现即定的电子电路设计功能。EDA技术使得电子电路设计者的工作仅限于利用硬件描述语言和EDA软件平台来完成对系统硬件功能的实现,极大地提高了设计效率,缩短了设计周期,节省了设计成本。
EDA技术是现代电子设计技术的核心。20世纪90年代以来,微电子工艺有了惊人的发展。为了满足千差万别的系统用户提出的设计要求,最好的办法是由用户自己设计芯片。这个阶段发展起来的EDA工具,目的是在设计前期将原来设计师从事的许多高层次设计工作改由工具来完成。设计师通过一些简单标准化的设计过程,利用微电子厂家提供的设计库来完成数万门ASIC和集成系统的设计与验证。这样就对电子技术的工具提出了更高的要求,提供了广阔的发展空间,促进了EDA技术的形成。
今天,EDA技术已经成为电子设计的重要工具,无论是设计芯片还是设计系统,如果没有EDA工具的支持,都将是难以完成的。EDA工具已经成为现代电路设计工程师的重要工具,正在发挥越来越重要的作用。
1.2 方案比较与确定
设计要求:利用EDA技术,建立正弦信号DDS产生模型,编写源程序,达到频率输出范围1KHz-10MHz、频率步进100Hz、频率稳定度优于104、带50Ω负载输出电压峰峰值大于1V等要求,完成硬件实现与测试。
【方案一】 采用分立元件模拟直接合成法。这种方法转换速度快,频率分辨率高,但其转换量程靠手动来实现,不仅体积大难以集成,而且可靠性和准确度很难进一步提高。
【方案二】 采用MAX038芯片来产生正弦波信号。该集成块的输出波形种类多,频率覆盖范围广。它采用的是RC充放电振荡结构。第一,由于模拟器件元件分散性太大,外接的电阻、电容对参数的影响很大,因而产生的频率稳定度差,只能达到103104。第二,它的频率控制是通过充放电流的大小来实现。因而要达到步进100HZ,所需的电流变化量非常小,精度要求很高。所以采用MAX038芯片难以实现设计要求。
【方案三】 采用锁相环合成方法。采用该方案设计输出信号的频率可达到超高频甚至微波段,且输出信号频谱纯度较高。由于锁相环技术是一个不间断的负反馈控制过程,所以该系统输出的正弦信号频率可以维持在一个稳定状态,频率稳定度高。但由于它是采取闭环控制的,系统的输出频率改变后,重新达到稳定的时间也比较长。所以锁相环频率合成器要想同时得到较高的频率分辨率和转换率非常困难,频率转换一般要几毫秒的时间,同时频率间隔也不可能做得很小。
【方案四】 采用直接数字合成器(DDS),可用硬件或软件实现。即用累加器按频率要求对相应的相位增量进行累加,再以累加相位值作为地址码,取存放于ROM中的波形数据,经D/A转换,滤波即得到所需波形。
以EDA技术为基础,用FPGA实现DDS模型的设计。电路的规模大小和总线宽度可以由设计者根据自己的需要而设定可将波形数据存入FPGA的ROM中。同时外部控制逻辑单元也可在FPGA中实现。方法简单,易于程控,便于集成。用该方法设计产生的信号频率范围广,频率稳定度高,精度高,频率转换速度快。
分析以上四种方案,显然第四种方案具有更大的优越性、灵活性。所以采用方案四进行设计。
[1]
1.3 频率合成技术概述
所谓频率合成技术指的是由一个或者多个具有高稳定度和高精确度的频率参考源,通过在频率域中的线性运算得到具有同样稳定度和精确度的大量的离散频率的技术。完成这一功能的装置被称为频率合成器。频率合成器应用范围非常广泛,特别是在通信系统、雷达系统中,频率合成器起了极其重要的作用。随着电子技术的不断发展。频率合成器的应用范围也越来越广泛,对其性能要求也越来越高。频率合成器的主要指标有以下这些:
(1) 输出频率的范围
指的是输出的最小频率和最大频率之间的变化范围。 (2) 频率稳定度
指的是输出频率在一定时间隔内和标准频率偏差的数值,它分长期、短期和瞬间稳定度三种。
(3) 频率分辨率
指的是输出频率的最小间隔。 (4) 频率转换时间
指的是输出由一种频率转换成另一种频率的时间。 (5) 频谱纯度
频谱纯度以杂散分量和相位噪声来衡量,杂散分为谐波分量和非谐波分量两种,主要由频率合成过程中的非线性失真产生;相位噪声是衡量输出信号相位抖动大小的参数。
(6) 调制性能
指的是频率合成器是否具有调幅(AM),调频(FM)、调相(PM)等功能。
频率合成器的实现方法大体可以分成三种:直接频率合成、间接频率合成、直接数字频率合成。下面对这三种方法进行一下简单的介绍。
直接频率合成是一种比较早期的频率合成方法,这种频率合成方法使用一个和多个标准频率源先经过谐波发生器产生各次谐波,然后经过分频、倍频、混频滤波等处理产生所需要的各个频点。这种方法产生的波形,相噪小,频率转换时间短。但是直接频率合成设备比较复杂笨重,并且容易产生杂散。
间接频率合成又称之为锁相频率合成。采用了锁相环技术,对频率进行加、减、乘、除,产生所需的频率。由于锁相环相当于一个窄带跟踪滤波器,所以锁相频率合成的方法对杂散有很好的抑止作用。锁相式频率合成器还易于集成化。但是锁相式频率合成器的频率转换时间比较长,而且在单环的情况下很难做到很小的频率分辨率。
直接数字频率合成(DDS-Digital Direct Frequency Synthesis)是一种比较新颖的频率合成方法。随着科学技术的日益发展这种频率合成方法也越来越体现出它的优越性来。DDS是一种全数字化的频率合成方法。DDS频率合成器主要由频率寄存器、相位累加器、波形ROM, D/A转换器和低通滤波器组成。在系统时钟一定的情况下,输出频率决定于频率寄存器的中的频率字。而相位累加器的字长决定了分辨率。基于这样的结构DDS频率合成器具有以下优点:(1)频率分辨率高,输出频点多,可达2N个频点(假设DDS相位累加器的字长是N);(2)频率切换速度快,可达us量级;(3)频率切换时相位连续;(4)可以输出宽带正交信号;(5)输出相位噪声低,对参考频率源的相位噪声有改
善作用;(6)可以产生任意波形;(7)全数字化实现,便于集成,体积小,重量轻。
1.4 直接数字频率合成技术的现状与应用
由于 DDS的自身特点决定了它存在这以下两个比较明显的缺点:一是输出信号的杂散比较大,二是输出信号的带宽受到限制。DDS输出杂散比较大这是由于信号合成过程中的相位截断误差、D/A转换器的截断误差和D/A转换器的非线性造成的。当然随着技术的发展这些问题正在逐步的到解决。如通过增长波形ROM的长度减小相位截断误差。通过增加波形ROM的字长和D/A转换器的精度减小D/A量化误差。在比较新的DDS芯片中普遍都采用了12bit的D/A转换器。
当然一味靠增加波形ROM 的深度和字长的方法来减小杂散对性能的提高总是有限的。国内外学者在对DDS输出的频谱做了大量的分析以后,总结出了误差的频域分布规律建立了误差模型,在分析DDS频谱特性的基础上又提出了一些降低杂散功率的方法:可以通过采样的方法降低带内误差功率,可以用随机抖动法提高无杂散动态范围(在D/A转换器的低位上加扰打破DDS输出的周期性,从而把周期性的杂散分量打散使之均匀化)。
此外随着集成电路制造工艺的逐步提高,通过采用先进的工艺和低功耗的设计,数字集成电路的工作速度己经有了很大的提高。现在最新的DDS芯片工作频率己经可以达到1GHz。这样就可以产生频带比较宽的输出信号了。
为了进一步提高DDS的输出频率,产生了很多DDS与其他技术结合的频率合成方法。如当输出信号是高频窄带信号的时候可以用混频滤波的方法扩展DDS的输出,也可以利用DDS的频谱特性来产生高频信号,如输出它较高的镜像频率。
DDS和 PLL相结合的方法也是一种有效的方法。这种方法兼顾了两者的优点,既有较高的频率分辨率,又有较高的频谱纯度。DDS和PLL相结合一般有两种实现方法:DDS激励PLL的锁相倍频方式和PLL内插DDS方式。
DDS不仅可以产生正弦波同时也可以产生任意波,这是其他频率合成方式所没有的。任意波在各个领域特别是在测量测试领域有着广泛的应用。通过DDS这种方法产生任意波是一种简单、低成本的方法,通过增加波形点数可以使输出达到很高的精度,这都是其他方法所无法比拟的。
自80年代以来各国都在研制DDS产品,并广泛的应用于各个领域。其中以AD公司的产品比较有代表性。如AD7008, AD9850, AD9851, AD9852, AD9858等。其系统时钟频率从30MHz到300MHz不等,其中的AD9858系统时钟更是达到了1GHz。这些芯片还具有调制功能。如AD7008可以产生正交调制信号,而AD9852也可以产生FSK,PSK、线性
[2]
调频以及幅度调制的信号。这些芯片集成度高内部都集成了D/A转换器,精度最高可达126it。同时都采用了一些优化设计来提高性能。如这些芯片中大多采用了流水技术,通过流水技术的使用,提高了相位累加器的工作频率,从而使得DDS芯片的输出频率可以进一步提高。通过运用流水技术在保证相位累加器工作频率的前提下,相位累加器的字长可以设计得更长,如AD9852的相位累加器达到了48位。而不是之前型号的32位,这样输出信号的频率分辨率大大提高了。同时为了抑止杂散这些芯片大多采用了随机抖动法提高无杂散动态范围(这是由于DDS的周期性,输出杂散频谱往往表现为离散谱线,随机抖动技术使离散谱线均匀化,从而提高输出频谱的无杂散动态范围)。
运用 DDS技术生产的DDS任意波型信号发生器是较新的一类信号源并,且已经广泛投入使用。它不仅能产生传统函数信号发生器能产生的正弦波、方波、三角波、锯齿波,还可以产生任意编辑的波形。由于DDS的自身特点,还可以很容易的产生一些数字调制信号,如FSK, PSK等。一些高端的信号发生器甚至可以产生通讯信号。同时输出波形的频率分辨率、频率精度等指标也有很大的提高。如HP公司的HP33120可以产生lOmHz-15MHz的正弦波和方波。同时还可以产生lOmHz-5MHz的任意波形。任意波形深度16000点。采样率40M,还具备了调制功能,可以产生AM, FM, FSK,拌发、扫频等信号。HP公司的HP33250可以产生luHZ-80MHz的正弦波和方波,产生luHz到25MHz的任意波形,任意波形深度64K点,采样率200M。同时也具备了AM,FM,FSK,碎发、扫频等功能。BK PRECISION公司的4070A型函数级任意波形发生器正弦波和方波输出频率DC-21.5M Hz频率分辨率IO mHz。同时还具有AM,FM,PM,SSB,BPSK,FSK,碎发、DTMF Generation和DTMF Detection的功能。并且具有T和PC机良好的接口,可以通过WINDOWS界面的程序进行任意波形的编辑。
除了在仪器中的应用外,DDS在通信系统和雷达系统中也有很重要的用途。通过DDS可以比较容易的产生一些通信中常用的调制信号如:频移键控(FSK)、二进制相移键控(BPSK)和正交相移键控(QPSK)。 DDS可以产生两路相位严格正交的信号在正交调制和解调中的到广泛应用,是一中很好的本振源。
在雷达中通过DDS和PLL相结合可以产生毫米波线性调频信号,DDS移相精度高、频率捷变快和发射波形可捷变等优点在雷达系统中也可以得到很好的发挥。
第2章 直接数字频率合成技术(DDS)
2.1 直接数字频率合成的基本结构
图2.1 直接数字频率合成的基本结构
如图2.1DDS的基本结构图,从图中可以看出DDS主要由四个基本部分组:(1)相位累加器;(2)波形ROM;(3)D/A转换器;(4)低通滤波器。
相位累加器的结构如图2.2所示
图2.2 相位累加器原理框图
相位累加器是DDS的核心部分,它由一个N位的加法器和N位的寄存器构成,通过把上一个时钟的累加结果反馈回加法器的输入端实现累加功能。这里的N是相位累加器的字长,K叫做频率控制字。每经过一个时钟周期,相位累加器的值递增K。
波形ROM示意图如图2.3所示
图2.3 波形 ROM示意图
当 ROM 地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。因为波形ROM的存储容量有限,相位累加器的字长一般不等于ROM地址线的位数,因此在这个过程当中也又会引入相位截断误差。
D/A 转换器将波形ROM输出的幅度量化序列转化成对应的电平输出,将数字信号转换成模拟信号。但输出波形是一个阶梯波形,必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。抗镜像滤波器是一个低通滤波器,要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。
根据 DDS的基本结构,可以推出以下一些结论:
频率控制字K唯一地确定一个单频模拟余弦信号S(t)cos(2f0t)的频率f0,
f0kfc/2N (2.1)
当K =1的时候DDS输出最低频率为f,
f=fc/2N (2.2)
这就是DDS的频率分辨率,所以,当N不断增加的时候DDS的频率分辨率可以不断的提高。D/A转换器的输出波形相当于是一个连续平滑波形的采样,根据奈奎斯特采样定律,采样率必需要大于信号频率的两倍。也就是说D/A转化器的输出如果要完全恢复的话,输出波形的频率必须小于fc/2N。一般来说,由于低通滤波器的设计不可能达到理想情况,即低通滤波器总是有一定的过渡带的,所以输出频率还要有一定的余量,一般来说在实际应用当中DDS的输出频率不能超过0.4fc。
2.2 DDS的技术特点
2.2.1 DDS的优点
(1)输出频率的范围广。由式 2.1 知道,频率覆盖范围从fc/2N到 0.4fc。fc为输入时钟频率。随着硬件水平的不断提高,一些DDS专用芯片的最大输出频率已经可以达到几百兆赫兹。
(2)频率分辨率高,可达2N个频点。 (3)频率稳定度高。
(4)频率转换时间快,可小于100ns。同时,频率转换时相位是连续的。 (5)频谱纯度高。 (6)正交输出。
(7)产生任意波形。由于DDS技术是利用查表法来产生波形的,所以它适用于任意波形发生器。
(8)全数字化实现,便于集成,体积小,重量轻。
[3]
2.2.2 DDS的缺点
(1)最高工作频率不可能很高,从理论上说就只有系统始终频率的一半,实际中还
要小于此值。要想获得较高的输出频率,就必须提高系统的时钟批率,也就是说DDS系统的相位累加器、波形存储器、D/A转换器等都将工作在较高的时钟频率下,它的实现依赖于高速数字电路和高速D/A转换器。
(2)DDS系统采用数字技术,先构成离散信号再变换成模拟信号输出,尤其是要产生相位截断误差,因而噪声和杂散是不可避免的。
[4]
2.3 DDS性能分析
由式 2.1可知,系统的输出频率只与频率字的值K、系统时钟频率fc和相位累加器
的字长N有关。在系统时钟频率fc和相位累加器字长N固定时,通过改变频率字,可以方便地改变输出频率f0。
系统的频率分辨率只与系统的时钟频率fc和相位累加器的字长N有关。要增加系统为了达到较高的输出频率,DDS系统的时钟频率一般都比较高。根据式2.2,在较高的时钟频率下,为了获得较高的频率分辨率,则只有增加相位累加器的字长N,故一般N都取值较大。但是受存储器容器的限制,存储器地址线的为数 W 不可能很大,一般都要小于N。这样存储器的地址线一般都只能接在相位累加器输出的高 W 位,而相位累加器输出余下的(N-W)个低位则只能被舍弃,这就是相位截断误差的来源。
由于相位截断,频率字的值K就将被分为两部分,其最高的 W 位将被看承整数部分,而余下的将被看为小数部分。这是因为存储器地址线的位数只有 W 位,相位累加器的输出只有搞 W 位才对存储器有影响,频率字的小数部分只有在其累加达到整数部分是才能影响存储器。
DDS系统的频率转换非常快,几乎是即时的这是锁相环系统无法做到的。DDS系统在频率字改变后的一个时钟周期,起输出频率就可以转换成新的输出频率。也就是说在频率字的值改变以后,累加器在经过一个时钟周期后就按照新的频率字进行累加,即开始输出新的频率,所以我们可以认为DDS系统的频率转换是在一个系统时钟周期内完成的。
DDS系统不仅频率转换速度快,而且更可贵的是只须改变频率字,就可以改变输出频率,无须复杂的控制过程。从DDS技术的原理可知,在改变输出频率时,实际改变的是频率字,也就是相位增量。当频率字的值从K1改变为K2之后,相位累加器是在已有的积累相位上,再每次累加K2,相位函数的曲线是连续的,只是在改变频率字的瞬间其斜率发生了突变。输出波形和相位累加器的输出值两者都是平滑过度。也就是说DDS系统能够在频率转换中保持相位连续,输出波形能平滑的从一个频率过度到另一个频率。
[5]
的频率分辨率,可以增加相位累加器的字长N,或是降低系统的时钟频率。
3.1 EDA技术及其发展
第3章 EDA技术
随着社会生产力发展到了新的阶段,各种电子新产品的开发速度越来越快。现代计算机技术和微电子技术进一步发展和结合使得集成电路的设计出现了两个分支。一个是传统的更高集成度的集成电路的进一步研究;另一个是利用高层次VHDL/Verilog等硬件描述语言对新型器件FPGA/CPLD进行专门设计,使之成为专用集成电路(ASIC)。这不仅大大节省了设计和制造时间,而且对设计者,无须考虑集成电路制造工艺,现已成为系统级产品设计的一项新的技术。
EDA(Electronic Design Automation)技术是现代电子设计技术的核心。它以EDA软件工具为开发环境,采用硬件描述语言(Hardware Description Language, HDL),采用可编程器件为实验载体,实现源代码编程、自动逻辑编译、逻辑简化、逻辑分割、逻辑综合、布局布线、逻辑优化和仿真等功能,以ASIC、SOC芯片为目标器件,以电子系统设计为应用方向的电子产品自动化的设计技术。
EDA代表了当今电子设计技术的最新发展方向,利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程在计算机上自动处理完成。设计者采用的设计方法是一种高层次的“自顶向下”的全新设计方法,这种设汁方法首先从系统设计人手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错.并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行驶证。然后,用综合优化工具生成具体门电路的网络表,其对应的物理实现级可以是印刷电路板或专用集成电路(ASIC)。设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件来完成对系统硬件功能的实现。由于设计的主要仿真和调试过程是在高层次上完成的,这既有利于早期发现结构设计上的错误,避免设计工作的浪费,又减少了逻辑功能仿真的工作量,提高了设计的一次性成功率。
EDA技术在硬件实现方面融合了大规模集成电路制造技术,IC版图设计技术、ASIC测试和封装技术、FPGA/CPLD编程下载技术、自动测试技术等;在计算机辅助工程方面融合了计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)、计算机辅助工程(CAE)技术以及多种计算机语言的设计概念;而在现代电子学方面则容纳了更多的内容,如电子线路设计理论、数字信号处理技术、数字系统建模和优化技术及长线技术理论等等。因此EDA技术为现代电子理论和设计的表达与实现提供了可能性。
[7]
在现代技术的所有领域中,纵观许多得以飞速发展的科学技术,多为计算机辅助设计,而非自动化的所有设计。显然,最早进入设计自动化的技术领域之一是电子技术,这就是为什么电子技术始终处于所有科学技术发展最前列的原因之一。不难理解,EDA技术已经不是那一学科的分支,或者是新的技术,应该是一门综合性学科。它融合多学科于一体,打破了软件和硬件间的壁垒,使计算机的软件技术与硬件实现、设计效率和产品性能合二为一,他代表了电子设计技术和应用技术的发展方向。
正因为EDA技术丰富的内容以及电子技术各学科领域的相关性,其发展的历程同大规模集成电路设计技术、计算机辅助工程、可编程逻辑器件,以及电子设计技术和工艺的发展是同步的。就过去近30年的电子技术的发展历程,可大致将EDA技术的发展分为三个阶段。
20世纪70年代,集成电路制作方面,MOS工艺已得到广泛的应用。可编程逻辑技术及器件已经问世,计算机作为一种运算工具已经在科研领域得到了广泛的应用。而在后期,CAD的概念已见雏形。这一阶段人们开始利用计算机取代手工劳动,辅助进行集成电路版图编辑、PCB布局布线等工作。
20世纪80年代,集成电路设计进入了COMS(互补场效应)时代。复杂可编程逻辑器件已经进入商业应用,相应的辅助设计软件也已投入使用。而在80年代末,出现了FPGA(Field Programmable Gate Array),CAE和CAD技术应用更为广泛,他们在PCB设计方面的原理图输入、自动布局布线及PCB分析,以及逻辑设计、逻辑仿真、布尔方程综合和化简等方面担任了重要的角色,特别是各种硬件描述语言的出现、应用和标准化方面的重大进步,为电子设计自动化必须解决的电路建模、标准文档及仿真测试奠定了基础。
进入20世纪90年代,随着硬件描述语言的标准化得到进一步的确立,计算机辅助工程、辅助分析和辅助设计在电子技术领域获得了更加广泛的应用,与此同时电子技术在通信、计算机及家电产品生产中的市场需求和技术需求,极大地推动了全新的电子设计自动化技术的应用和发展。特别是集成电路设计工艺步入了超深亚微米阶段,百万门以上的大规模可编程逻辑器件的陆续面世,以及基于计算机技术的面向用户的低成本大规模ASIC技术的应用,促进了EDA技术的形成。更为重要的是各EDA公司致力于推出兼容各种硬件实现方案和支持标准硬件描述语言的EDA工具软件的研究,都有效地将EDA技术推向成熟。
EDA技术在进入21世纪后,得到了更大的发展,突出表现在以下几个方面: (1)使电子设计成果以自主知识产权的方式得以明确表达和确认成为可能; (2)在仿真和设计两方面支持标准硬件描述语言的功能强大的EDA软件不断推出;
(3)电子技术全方位纳入EDA领域;
(4)EDA使得电子领域各学科的界限更加模糊,更加互为包容; (5)更大规模的FPGA和CPLD器件的不断推出;
(6)基于EDA工具的ASIC设计标准单元已涵盖大规模电子系统及IP核模块; (7)软硬件IP核在电子行业的产业领域、技术领域和设计应用领域得到进一步确认; (8)SoC高效低成本设计技术的成熟。
3.2 硬件描述语言VHDL
3.2.1 VHDL简介
甚高速集成电路硬件描述语言(Very-High-Speed Integrated Circuit Hardware Description Language,VHDL)于1983年有美国国防部(DOD)发起创建,由IEEE(The Institute of Electrical and Electronics Engineers)进一步发展并在1987年作为“IEEE 标准1076”发布。从此,VHDL成为硬件描述语言的业界标准之一。自IEEE公布了VHDL的标准版本之后,各EDA公司相继推出了自己的 VHDL 设计环境,或宣布自己的设计工具支持 VHDL。此后 VHDL在电子设计领域得到了广泛应用,并逐步取代了原有的非标准硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL语言将承担起大部分的数字系统设计任务。除了作为电子系统设计的主选硬件描述语言外,VHDL在EDA领域的仿真测试、程序模块的移植、ASIC设计源程序的交付、IP核(Intelligence Property core)的应用方面担任着不可或缺的角色,因此不可避免地将成为了必要的设计开发工具。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
[8]
3.2.2 VHDL的主要优点
(1)覆盖面广,有强大的系统硬件描述能力
VHDL可以覆盖行为描述、RTL (寄存器传输)级描述、门描述、电路描述和物理参数描述(包括延时、功耗、频率、几何尺寸等)。VHDL还具有丰富的数据类型.即可以支持预定义的数据类型,也可以自己定义数据类型。这样便给硬件描述带来了较大的自由度,使设计人员能够方便地使用VHDL创建高层次的系统模型。
(2)可读性好、易于修改
在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构模块化,所以易于修改设计。
(3)独立于器件的设计,与工艺无关
用VHDL进行硬件电路设计时,并不需要首先考虑选择完成设计的器件,也就是说,VHDL并没有嵌入具体的技术和工艺约定,设计人员可以集中精力进行设计的优化,不需要考虑其他问题。当一个设计描述完成以后,可以用多种不同的器件结构来实现其功能。
(4)易于移植和设计资源共享
由于VHDL是一种国际标准化的硬件描述语言,对于同一个设计描述,它可以移植到符合相同标准的任意系统或平台上运行。
对于一些较大的通用性硬件电路,目前已经有专门的IP核出售,因此,能实现设计资源的有偿使用,可大大缩短设计周期,加快设计产品的上市速度。
3.3 现场可编程逻辑(FPGA)器件
3.3.1 引言
FPGA(现场可编程门阵列)与CPLD(复杂可编程逻辑器件)都是可编程逻辑器件
[11]
,
它们是在PAL、GAL等逻辑器件的基础之上发展起来的。但FPGA/CPLD的规模较大,非常适合于对时序、组合等逻辑电路应用场合,它可以替代几十甚至上百块通用IC芯片。应用FPGA/CPLD可以做成一个系统级芯片,它具有可编程性和实现方案容易修改的特点。
现在,CPLD/FPGA等可编程器件已应用在不同的高科技领域,如数字电路设计、微处理系统、DSP、通信及ASIC设计等。由于芯片内部硬件连接关系的描述的存放,是以EEPROM、SRAM或FLASH或外接EPROM为基础的,设计用户可在可编程门阵列芯片及外围电路保持不动的情况下,通过计算机重新下载或配置设计软件,就能实现一种新的芯片功能。于是FPGA/CPLD可编程器件,正得到越来越多的电子设计者的青睐。
3.3.2 FPGA的组成及其应用特点
FPGA的组成:现场可编程门阵列(FPGA)是在PAL和GAL等逻辑器件的基础之上发展起来的、可由用户自行定义配置的高密度专用集成电路,结构上主要由三部分组成:可编程逻辑块(CLB----Configurable Logic Block)、输入\\输出单元(IOB----I\\O Block)和可编程连线(IR----Interconnect Resoutce)。
高速和高可靠是FPGA最明显的特点,当今的该类可编程器件,其最高工作频率可达百兆级,其时钟延迟可达纳秒级,结合其并行工作方式,在超高速应用领域和实时测控方面有非常广阔的应用前景。相比应用单片机的设计系统来说,可以较好地解决诸如MCU的复位不可靠和PC可能跑飞等问题。CPLD和FPGA的高可靠性还表现在,可形成片上系统,从而大大缩小了体积,易于管理和屏蔽。
由于FPGA的集成规模非常大,因此可借助HDL硬件描述语言开发出系统级芯片和产品。又由于开发工具的通用性、设计语言的标准化以及设计过程几乎与所用器件的硬件结构没有关系,所以设计成功的各类逻辑功能块软件有很好的兼容性和可移植性,它几乎可用于任何型号和规模的FPGA中,从而使得产品设计效率大幅度提高。FPGA显著的优势是开发周期短,投资风险小、产品上市速度快,市场适应能力强和硬件升级回旋余地大。一旦市场对所设计的产品需求量大,则可进行流片设计,形成价格更低廉的AISC产品。
FPGA芯片都是比较特殊的ASIC芯片,除了具有SAIC的特点之外,还具有以下几个优点:
(1)集成度越来越高:随着超大规模集成电路VLSI(Very Large Scale IC)工艺的不断提高,单一芯片内部可以容纳上百万个晶闸管。FPGA芯片的规模也越来越大,其单片逻辑门数已达到上百万门,所能实现的功能越来越强,同时还可以实现系统集成。 (2)嵌入式存贮技术:在CPLD/FPGA内部嵌入一定数量的存贮器。存贮器的类型有双口SRAM、ROM、FIFO,可用于存贮信号处理的系统,中间结果等。这对设计电子系统的智能化功能提供了技术支持。
(3)时钟锁定和倍频技术:解决了时钟脉冲延迟和偏斜问题,并使PLD内部时钟更高。单个16 bit乘法器的速度可达100 MHZ以上,这正是宽带高速实时信号的需要。CPLD/FPGA的时钟延迟可达纳秒级,结合其并行工作方式,在超高速应用领域和实时测控方面有非常广阔的应用前景。
(4)系统保密性能增强:随着IP(知识产权)越来越被高度重视,带有IP内核的功能块在ASIC设计平台上的应用日益广泛。越来越多的设计人员,采用设计重用,将系统设计模块化,为设计带来了快捷和方便。并可以使每个设计人员充分利用软件。
(5)开发周期短:用户可以反复的编程、擦除、使用,或者在外围电路不动的情况下,用不同的软件就可以实现不同的功能。因此,用FPGA试制样片,能以最快的速度占领市场。FPGA软件包中有各种输入工具、仿真工具、版图设计工具及编程器等全线产品,使电路的、设计人员在很短的时间内就可完成电路的输入、编译、优化、仿真,直至最后芯片的制作。当电路有少量改动时,更能显示出FPGA的优势。电路设计人员使用FPGA进行电路设计时,不需要有专门的IC(集成电路)深层次的知识。FPGA软件易学易用,可以使设计人员集中精力进行电路设计,快速将产品推向市场。
3.3.3 Altera的FLEX10K器件
Altera公司作为目前世界上最大的可编程逻辑器件供应商之一,其产品主要有FLEX10K, FLEX8000, FLEX6000, MAX9000, MAX7000, MAX5000以及Classic等七大系列,而FLEX10K系列是ALTERA 1995年推出的一个新的产品系列,因其规模大且价格便宜,倍受人们关注,Altera的FLEX10K器件是工业界第一个嵌入式可编程器件,基于可重构的CMOS SRAM单元,这种灵活逻辑单元阵(Flexible Logic Element Matrix)具有一般门阵列的所有优点。FLEX1OK系列器件规模从1万门到25万门,它无论在密度或者速度上都可以将一定规模的子系统集成到一个芯片上,采用快速可预测连线延时的连续式布线结构,在某种意义上说,是一种将EPLD和FPGA优点结合于一体的新型器件。
FLEX10K系列器件在结构上大同小异,它们都包含有四大部分:输入输出单元IOE、逻辑阵列块(LAB)、嵌入阵列块EAB及行、快速通道(FastTrack)互连。
1、输入输出单元(IOE)
每个IOE包含一个双向I/O缓冲器和一个输入输出寄存器,可被用作输入输出或双向引脚。IOE中的输出缓冲器有可调的输出摆率,可根据需要配置成低噪音或高速度模式。此外每个引脚还可指定为集电极开路输出。
IOE中的时钟、清除、时钟使能和输出使能由称作周边控制总线的I/O控制信号网络提供。周边控制总线提供多达12个周边控制信号并用高速驱动器使穿越器件的信号偏移最小化。这些信号是可配置的,能提供最多8个输出使能信号,6个时钟使能信号,2个时钟信号和2个清零信号。每个周边控制信号可被一专用输入脚驱动,或被特定行中每个LAB的第一个LE驱动。
2、逻辑阵列块(LAB)
FLEX10K的逻辑阵列块由8个逻辑单元(LE)、与LE相连的进位链和级联链、LAB控制信号和LAB局部互连组成。
FLEX10K的LAB在结构上与FLEX8000大致相同,不同之处主要体现在输出到快速通道
的互连上,此外构成LAB的逻辑单元内部结构也有所改进。每个LE包含一个4输入查找表(LUT),一个具有使能、预置和清零输入端的可编程寄存器,一个进位链和一个级联链。每个LE有两个输出,输出可驱动局部互连和快速通道互连。
查找表是一种函数发生器,能快速计算M个输入变量的任意函数。查找表的物理结构是静态存储器(SRAM)。M个输入项的逻辑函数可以由一个2M位容量的SRAM实现,函数值存放在SRAM中,SRAM的地址起输入线的作用,地址即输入变量值,SRAM的输出为逻辑函数值,由连线开关实现与其它功能块的连接。
查找表结构的函数功能非常强。M个输入的查找表可以实现任意一个M个输入项的组合逻辑函数,这样的函数有2M个。用查找表实现逻辑函数时,把对应函数的真值表预先存放在SRAM中,即可实现相应的函数运算。FLEX10K LAB中的LUT是一个4输入查找表,能快速实现4输入变量的任意函数。
FLEX10K的LE中的可编程触发器可设置成D,T ,JK或RS触发器。该触发器的时钟(Clock)、清除(Clear)和置位(Preset)控制信号可由专用输入引脚、通用I/O引脚或任何内部逻辑驱动。对于纯组合逻辑,可旁路LE中的触发器,将LUT的输出直接连到LE的输出端。
3、输入阵列块EAB
嵌入式阵列快是一种输入输出端带有寄存器的灵活的RAM,当实现存储器功能时,每个EAB提供2048位,可用来构成RAM,ROM,FIFO或双端口RAM。每个EAB单独使用时,可配置成以下几种尺寸之一:256×8、512×4、1024×2或2048×1。组合多个EAB可实现更大的RAM/ROM功能。Altera的Quartus II软件能够自动地组合多个EAB实现设计者对RAM规格的要求。
嵌入式阵列块也可用于实现逻辑功能,此时每个EAB可提供大约100-300个等效门,能方便地构成乘法器,矢量求模、纠错电路等功能块,并由这些功能进一步构成诸如数字滤波器、微控制器等方面的应用。逻辑功能通过配置时编程EAB为只读模型,生在一个大的LUT实现。在这个LUT中,组合功能通过查找表而不是通过计算来完成,其速度较常规逻辑运算实现时更快,且这一优势因EAB的快速访问时间而得到进一步加强。EAB的大容量使设计者能够在一个逻辑级上完成复杂的功能,避免了多个LE连接带来的连线延时。
4、快速通道(FastTrack)互连
在FLEX10K中,FastTrack互连提供不同LAB中的LE与器件I/O引脚间的互连,是贯穿整个器件长和宽的一系列水平和垂直的连续式布线通道,由若干组行连线和列连线组成。每一组行连线视器件大小不同可以有144根、216根或312根,每一组列连线均是24
根。
为了增强布线能力,行内连线由全长通道和半长通道结合组成。全长通道连接一行中所有的LAB,半长通道只与半行LAB相连接。每个EAB能被其左边的半长通道驱动,也可为全长通道驱动。FLEX10K行内连的这种改进使两个邻近的LAB相连时只占用半长行通道,保留另一半通道资源供其它LAB使用,从而增加了走线资源。
为了便于PCB板制作,Altera公司为各器件提供了诸PLCC,TQFP,RQFP,PGA和BGA等不同的封装形式,并有商业级和工业级芯片。
FLEXl0K系列器件特点:
1、嵌入阵列EAB,是一个在输入和输出端口都带有寄存器的一种灵活的RAM块,可以完成许多宏函数如存储器、查找表等。
2、全局时钟使用,可以最大限度减少时钟到各触发器的延迟,尽量使整个系统同步产生。
3、基于JTAG的边界扫描测试,2.5V(B系列),3.0V(A,V 系列)或5.0V电源。 4、低功耗,系统不工作时电流小于1mA。 5、灵活多变的行列连线资源。 6、功能丰富的I/O引脚。 7、多种封装形式。 8、基于SRAM重构。
9、强大的集成开发环境和多形式的用户接口。
3.4 EDA工具MAXPLUSⅡ
MAX+PLUSII是Altera提供的FPGA/CPLD开发集成环境, 它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。在 MAX+PLUS II软件提供的设计环境中可以完成设计输入、设计编译、设计仿真和器件编程四个设计阶段。在设计输入阶段,用户可以采用图形输入、文本输入和波形输入三种方式输入设计文件,但波形输入方式只能在工程设计的底层使用。在设计编译阶段,MAX+PLUS II编译器依据设计输入文件自动生成用于器件编程、波形仿真及延时分析等所需的数据文件。在设计仿真阶段,MAX+PLUS II仿真器和时延分析器利用编译器产生的数据文件自动完成逻辑功能仿真和时延特性仿真。并且可以在设计文件中加载不同的激励,观察中间结果以及输出波形。必要时,可以返回设计输入阶段,修改设计输入,达到设计要求。在器件编程阶段,MAX+PLUS II编程器将编译器生成的编程文件下载到Altera器件实现对器件编程。此后,可以将实际信号送入该器件进行时序验证。因为CPLD/FPGA芯片能够可重
复编程,所以如果动态时序验证的结果不能满足用户的需要时,用户可以返回到设计阶段重新设计,然后重复上面的步骤,最终达到设计要求。图3.1中所示的是标准的EDA开发流程。
图3.1 MAX+PLUSII设计流程
第4章 基于FPGA的正弦信号发生器
4.1 总体设计框图 显示模块 信号发生器核心 频 率 相位 波形ROM D/A转换器 滤波电路 输出波形 控制模块 累加器 系统时钟 clk
图4.1 信号发生器结构框图
图4.1为本次设计总体结构框图,其中相位累加器和波形存储器构成信号发生器核 心部分。该部分又与频率字控制模块共同构成信号发生器主模块。而显示模块,D/A转换器和滤波电路则作为信号发生器外围硬件设计。下面就分主模块软件设计和外围硬件设计两大部分来说明信号发生器的设计。
4.2 主模块软件设计
4.2.1 相位累加器的设计
N位 累加 高W位至波形存储器 全加器 寄存器 (W为存储器地址线宽度)
频率字输入
clk 图4.2 相位累加器
图4.2为相位累加器内部结构图,它有一个N位的全加器和一个寄存器构成。当系统时钟上升沿到来的时候,上一个时钟周期的相位值与频率字的相加值被送入累加寄存器,并输出高W位至波形存储器的地址线,同时相位值又被送回全加器进行相位累加。
相位累加器流程图如图4.3所示 开 始 时钟上升沿到? NO YES
相位累加
累加值寄存
高W位输出
结 束 图4.3 相位累加器流程图
设计要求输出频率范围为1KHZ—10MHZ,频率步进为100HZ。根据第二章介绍最高输
出一般是系统时钟的40%。经过计算,设计选用系统时钟为30MHZ时能实现设计要求。
f30MHz40%12MHz10MHz
确定相位累加字长时,考虑到频率分辨率要等于或小于频率步进值,而且累加器字
长一般为8的整数倍。由第二章公式2.2计算后得出符合设计要求的累加器字长为N=24。
图4.4 相位累加器模块
fminfclk30MHz1.788Hz100Hz2N224由上分析设计的相位累加器模块如图4.4所示。
K[23..0]为输入的频率字,EN为高电平使能,RESET是高电平清零,CLK为系统时钟
输入,DOUT[7..0]是相位累加器高8位输出,该输出将作为波形存储器地址线对波形ROM进行寻址。图4.5为该模块的时序仿真图。
图4.5 相位累加器进行累加、清零的时序仿真图
4.2.2 波形ROM的设计
这个模块是一个相对简单的模块。首先要确定波形ROM的地址线位数和数据的字长,根据噪声功率的角度看波形ROM的地址线位数应该等于或略大于字长。由于设计选择的DAC位数为8,这样ROM的字长很明显该和DAC的字长相一致。而地址线的位数同样确定为8位。
波形存储器利用相位累加器输出的高8位作为地址线来对其进行寻址,最后输出该相
位对应的二进制正弦幅值。正弦数据的产生可采用如下办法:
在MATLAB中编辑程序:
>> clear tic; t=2*pi/256 t=[0:t:2*pi]; y=128*sin(t)+128; round(y); t =0.0245 ans
将得出的结果转化为8位的二进制数据,起幅值对应在00000000-11111111区间内。
最后利用得到的二进制数据用VHDL编写程序实现正弦ROM的设计。
图4.6 正弦波形ROM
图4.6为正弦波形ROM模块,该模块时序仿真如图4.7所示。
图4.7 波形ROM时序仿真图
4.2.3 频率控制模块的设计
设计要求频率步进为100HZ,但由于频率范围很宽,要求改变频率时如果跨度较大则
需要很长的时间通过频率步进端来改变输出频率。因此在实际频率控制模块中,增加了4个附加的频率步进按钮。分别为最小步进(100HZ)的10倍、100倍、1000倍和10000倍即1KHZ、10KHZ、100KHZ和1MHZ。这样从大到小地利用频率步进值便可很快地调到所需要的频点。
实现这个设计的方法也很简单,由第二章公式 f0kfc/2N可以看出,当fc/2N确
定后f0与K成正比关系。计算出输出频率f0100HZ时K的值,则这个K的值就是频率字步进100HZ时频率字K的增量,记为K。要成倍地增加步进频率,则只需以相同的倍数增加K的值。
将f0100HZ,fC30MHZ,N=24 带入f0kfc/2N得到100HZ步进时K值为
56。则实现1KHZ、10KHZ、100KHZ和1MHZ的步进K的增量分别为10K、100K、1000K和10000K。
由于设计要求频率输出范围为1KHZ-10MHZ,则K值的最小值为560,最大值为5600000。
设系统其始和复位时K的初值为560,即初始化频率为1KHZ。然后再根据所要输出的频率调整相应的步进量。图4.9为频率控制模块流程图。
图4.8为VHDL设计的频率控制模块
模块各引脚说明如下: RESET为频率字复位端,高电平有效。CLK接入的是系统时钟,目的是驱动模 块内部延时计数器,该计数器的作用是:当进行频
率操作时,频率的增、减确认信号必须在按键状 图4.8 频率控制模块 态稳定后才能进行,所以加入一定的延时。同时
还可以达到按键去抖动的效果。STEP1[4..0]:频率步进“增”操作端,各端口分别为STEP1(4)步进100HZ,STEP1(3)步进1KHZ,STEP1(2)步进10KHZ,STEP1(1)步进
100KHZ,STEP1(0)步进1MHZ。STEP2[4..0]:频率步进“减”操作端,各端口对应操作值同上。
KOUT为输出频率字,送至DDS主模块。
开 始
频率字赋初值 有键按下? N Y Y
复位键? N 频率增操作? N Y 频率减操作 增加对应值 减少对应值
频率字输出 结 束 图4.9 频率控制模块流程图
频率控制模块时序仿真如图4.10所示。
图4.10 频率控制模块时序仿真图
4.3 外围硬件设计
4.3.1 显示模块
该模块与频率控制模块有直接的联系,其功能就是显示输出频率值,显示方式为十进制数。由于最大频率值为10MHZ为8位数,则需要8个数码管做为频率值显示。又最小频率步进为100HZ,则只需要设计六位十进制加、减法计数器进行从百位到十兆位的频率的增、减操作,个位和十位数据恒定为零。
图4.11 频率值计数输出模块
,
图4.11为计数输出模块,与频率控制模块类似,RESET端为频率初始化,CLK为接入系统时钟,STEP1、STEP2分别为频率增、减控制端,KOUT为显示数据输出。该模块时序仿真图如图4.12所示
图4.12 频率值计数模块
图4.13为输出频率译码扫描显示模块,其功能为将计数模块输出的频率值译成七段
码并扫描显示。DATA1[3..0]到DATA6[3..0]为频率数据百位至十兆位BCD码输入端,SCAN[7..0]是输出扫描信号,DISPOUT[6..0]则为数据七段码输出。
图4.13 译码扫描显示模块
图4.14 译码扫描显示模块
频率计数模块和译码扫描显示模块共同组成信号发生器的频率显示模块,它与频率
控制模块的操作是同步进行的。数码管所显示的数值就是信号发生器输出的正弦波频率值。
4.3.2 D/A转换器
实现数字量转化为模拟信号的转换电路称为D/A转换器(DAC)。
D/A转换器是把数字量转换成模拟量的线性电路器件,已做成集成芯片。由于实现这种转换的原理和电路结构及工艺技术有所不同,因而出现各种各样的D/A转换器。目前,国外市场已有上百种产品出售,他们在转换速度、转换精度、分辨率以及使用价值上都各具特色。
衡量一个D/A转换器的性能的主要参数有:
(1)分辨率:是指D/A转换器能够转换的二进制数的位数,位数多分辨率也就越高。 (2)转换时间:指数字量输入到完成转换,输出达到最终值并稳定为止所需的时间。电流型D/A转换较快,一般在几ns到几百ns之间。电压型D/A转换较慢,取决于运算放大器的响应时间。
(3)精度:指D/A转换器实际输出电压与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位。
(4)线性度:当数字量变化时,D/A转换器输出的模拟量按比例关系变化的程度。理想的D/A转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。
目前,D/A转换器芯片种类较多,对于一般的使用者而言,只需掌握DAC芯片性能及
其与计算机之间接口的基本要求,就可根据应用系统的要求合理选用DAC芯片,并配置
适当的接口电路。
设计要求输出最高频率为10MHZ,在选择D/A转换器的时需要充分考虑到D/A转换器的转换速率,在本次设计中选择了ADV7120芯片
[19]
,它是一个高速D/A转换COMS芯
片,耗电小,同时考虑到实验室的焊接工具的现状,是否完全兼容TTL电平标准,它有DIP双列直插式封装的型号。同时根据设计的不同,这种芯片有三种速度等级分别为30MHz、50MHz和80MHz级的,因为它的高速处理性能,它被广泛应用于视频、图像等对数据实时处理和吞吐量比较大的领域。同时作为它的功能之一就是用于DDS的高速数模转换。
图4.15 ADV7120芯片内部原理图
上图4.15为该芯片的内部原理图,由于它是专业级的视频通道高速数模转换芯片,故有很多用于视频的功能引脚。但是在本次设计中,只借助它的高速8bit数模转换功能,故有些引脚不要用到,但是根据CMOS结构的特性,对于不用的引脚不能让它悬空。要对它做如下的适当处理:
Description: VIDEO IOC(mA): video+9.05 IOR,IOB(mA): video+1.44 REF WHRITE: 0
SYNC: 1 BLANK: 1
2
DAC Input Data: data
这是对于输入引脚的处理,对不用的通道的处理如下图4.16所示。
图4.16单通道处理
在处理好不需要用的功能对应的引脚后,还要将D/A转换部分的工作电压和转换的参考电压确定,具体的连接如图4.17所示。
图4.1数模转换参考电路
根据ADV7120的输出特性,每一个通道都可以等效为一个高内阻抗电流源,输出端可以直接驱动37.5Ω的负载。此外它的模拟参数输出是电流输出,需要用一定的电路来实现电流信号到电压信号的转变。电路如图4.18所示。
图4.18 D/A输出缓冲电路
接下来是计算输出的电压信号跟输出的数字量的联系:
VREF1.235V,得出IREF4mA
IOUTDINIREF 28Z1) Z2VAD848IOUTZS(1其中DIN为输入ADV7120的二进制8bit数组,ZS=75,而Z1和Z2有自己根据所需增益的大小而确定,VAD848为AD848运放输出的电压值。
ADV7120芯片的功能引脚对应的实际引脚参考图4.19。
图4.19 ADV7120引脚图
4.3.3 滤波及放大电路
在由数字信号至模拟信号这一过程转换好以后,得出的信号仍然是在时间上离散的点,需要将其用低通滤波器进行平滑处理,滤除高次频率的杂波,得到平滑标准的正弦波。
由这次设计的正弦波频率范围可知。所要求的低通滤波器的截止频率为10.5MHz,这次用到的为LC低通滤波器(电路图参考图4.20)。设L1取2.2微亨。则C1的取值为:
C11fL12c2418(PF)
由于频率输出覆盖范围广,且设计要求输出电压峰-峰值VPP1V。由于放大器需在宽带范围内有稳定的增益,所以不能采用只对单一频率有较大增益的LC谐振放大器,而采用宽带放大器,原理图参考图4.20。通过调整发射极的旁路电容和集电极的电感可以使宽带放大的频率输出覆盖范围达到1KHz-10MHz。放大器增益与带宽成反比关系,所以单级宽带放大器的增益不大。但由于正弦波输出波形幅度峰-峰值已有零点几伏,经单级宽带高频晶体管放大后峰-峰值已超过2V。采用的是 2SC3555的晶体管,通过改变基极对地的可调电阻可以使三极管工作在线性放大区,又由于在发射极加对地电阻引入直流负反馈从而稳定Q点。因为AvfRLRE3所以我们取RL1K,RE0.2K。所输出电压的幅度已达到要求。同时在后级还加入了射级跟随器,减小后级负载的大小对前级放大倍数的影响。在电源部分引入了电感和电容组成的π型网络何以消除寄生振荡。
图4.20 宽带放大和低通滤波
结束语
信号发生器是科研及工程实践中最重要的仪器之一,以往多使用硬件组成,随着信息技术高速发展,集成电路的大规模使用,电子系统已经进入了一个高速发展的全新时段。特别是EDA技术的日趋成熟的今天,通过计算机辅助设计,可以很好地完成电子设计的自动化。在设计过程中,可根据需要随时改变器件的内部逻辑功能和管脚的信号方式,EDA技术借助于大规模集成的FPGA/CPLD和高效的设计软件,用户不仅可通过直接对芯片结构的设计实行多种数字逻辑系统功能,而且由于管脚定义的灵活性,大大减轻了电路图设计和电路板设计的工作量及难度,同时,这种基于可编程芯片的设计大大减少了系统芯片的数量,缩小了系统的体积,提高了系统的可靠性。
基于DDS的信号发生器是最为理想的信号产生模型,DDS系统有着其他信号发生器所无法比拟的优势。今天DDS广泛用于接受机本振、信号发生器、仪器、通信系统、雷达系统等,尤其适合跳频无线电通信系统。
基于FPGA的正弦信号发生器结合了的EDA技术和DDS理论,在EDA技术高速、高效、高可靠性的前提下得到了更优的设计效果。但是系统的功能还没有得到完全利用,由于DDS技术是利用查表法来产生波形的,则在基于FPGA设计时只要把ROM改成RAM变可实现任意波形的产生。
本次设计在总体上符合设计要求,能较好的实现设计功能。其中也存在有不足之处。第一,在累加器设计中,没有采用流水先设计。因而累加器系统工作频率没能得到提高,性能不够优越。第二,设计波形ROM是没有很好地利用正弦信号的对称性来设计波形数据,对系统输出信号的精度有一定的影响。第三,外围电路没有设计键盘输入模块,使得操作不够直观灵活。以上的几点不足,自己希望在今后的再次设计中都能得到完善的弥补。
参考文献
[1] 左磊、连小珉、班学钢、蒋孝煌. 双RAM直接数字合成任意波形发生器微机插卡研制[J] . 清华大学学报. 1999年第39卷第2期 90-93 [2] 陈世伟. 锁相环路原理及应用[M]. 兵器工业出版社. 1990
[3] 张玉兴. DDS高稳高纯频谱频率源技术[J]. 系统工程与电子技术. 1997(2)24-28 [4] 白居玉. 低噪声频率合成[M]. 西安交通大学出版社. 1995年5月第1版 [5] 郑宝辉. 直接数字频率合成器相位截断误差分析[J]. 无线电工程.1998(6)1-5 [6] 高玉良,李延辉,俞志强.现代频率合成与控制技术.北京:航空工业出版社,2002, 15-150
[7] 潘松,黄继夜. EDA技术实用教程[M]. 科学出版社 .2005年第2版1-25 [8] 辛春艳. VHDL硬件描述语言[M]. 国防工业出版社,2002(1)
[9] 林明权. VHDL数字控制系统设计范例[M]. 电子工业出版社.2003. 224-241
[10] 卢毅、赖杰. VHDL与数字电路设计[M]. 科学出版社.2003(10)31-38
[11] 褚振勇、翁木云. FPGA设计与应用[M]. 西安电子科技大学出版社.2002(7)35-49 [12] 徐志军、徐光辉. CPLD/FPGA的开发与应用[M].电子工业出版社.2002. 65-98 [13] 赵限光、郭万有、杨颂华. 可编程逻辑器件原理、开发与应用[M]. 西安电子科技大学出版社. 2000. 117-119
[14] 黄智伟. FPGA系统设计与实践[M]. 电子工业出版社.2005(1)33-35
[15] 冯 程. 用直接数字频率合成器产生正弦波[J]. 华中科技大学本科生论文. 2003. 7-27
[16] 周国富. 利用FPGA实现DDS专用集成电路[J]. 电子技术应用. No.2.1998. 18-20 [17] Altera Corporation.Altera Digital Library 2002. 12-20 [18] B&K Precision Model 4070A User' s Manual, 2002. 25-15
[19] DATA sheets CMOS 80 MHz, Triple 10-Bit Video DAC ADV7120,Analog Devices, Inc.1996.
致 谢
在本课题的完成中,我得到了很多人的帮助,在此表示衷心的感谢!
首先感谢我的导师刘XX老师,我的课题是在他的指导和帮助下完成的,他深厚的理论功底和严谨的治学态度以及高度的敬业精神使我受益非浅,对我课题的完成起到了至关重要的作用。
同时感谢我的同学对我无私的帮助。感谢给予我理论帮助的各位参考文献的作者。 最后感谢我的家人对我的支持和理解。
XXX
2007年6月
附录A 信号发生器顶层电路图
图1 正弦信号发生器顶层模块
--相位累加器 LIBRARY IEEE;
附录B 源程序清单
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY LEIJIA IS
PORT(K:IN STD_LOGIC_VECTOR (23 DOWNTO 0); EN: IN STD_LOGIC; RESET: IN STD_LOGIC; CLK: IN STD_LOGIC;
DOUT: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END;
ARCHITECTURE BEHAV OF LEIJIA IS
SIGNAL TEMP: STD_LOGIC_VECTOR(23 DOWNTO 0); BEGIN
PROCESS(CLK,EN,RESET) IS BEGIN
IF RESET='1' THEN
TEMP<=\"000000000000000000000000\"; ELSE
IF CLK'EVENT AND CLK='1'THEN IF EN='1' THEN TEMP<=TEMP+K; END IF; END IF; END IF;
DOUT<=TEMP(23 downto 16); END PROCESS; END BEHAV;
--波形ROM
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ROM IS
PORT(ADDER:IN STD_LOGIC_VECTOR(7 DOWNTO 0); DAOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ENTITY ROM;
ARCHITECTURE ART OF ROM IS BEGIN
PROCESS(ADDER) IS BEGIN
CASE ADDER IS
when\"00000000\"=>DAOUT<=\"10000000\"; when\"00000001\"=>DAOUT<=\"10000011\"; when\"00000010\"=>DAOUT<=\"10000110\"; when\"00000011\"=>DAOUT<=\"10001001\"; when\"00000100\"=>DAOUT<=\"10001101\"; when\"00000101\"=>DAOUT<=\"10010000\"; when\"00000110\"=>DAOUT<=\"10010011\"; when\"00000111\"=>DAOUT<=\"10010110\"; when\"00001000\"=>DAOUT<=\"10011001\"; when\"00001001\"=>DAOUT<=\"10011100\"; when\"00001010\"=>DAOUT<=\"10011111\"; when\"00001011\"=>DAOUT<=\"10100010\"; when\"00001100\"=>DAOUT<=\"10100101\";
when\"00001101\"=>DAOUT<=\"10101000\"; when\"00001110\"=>DAOUT<=\"10101011\"; when\"00001111\"=>DAOUT<=\"10101110\"; when\"00010000\"=>DAOUT<=\"10110001\"; when\"00010001\"=>DAOUT<=\"10110100\"; when\"00010010\"=>DAOUT<=\"10110111\"; when\"00010011\"=>DAOUT<=\"10111010\"; when\"00010100\"=>DAOUT<=\"10111100\"; when\"00010101\"=>DAOUT<=\"10111111\"; when\"00010110\"=>DAOUT<=\"11000010\"; when\"00010111\"=>DAOUT<=\"11000100\"; when\"00011000\"=>DAOUT<=\"11000111\"; when\"00011001\"=>DAOUT<=\"11001010\"; when\"00011010\"=>DAOUT<=\"11001100\"; when\"00011011\"=>DAOUT<=\"11001111\"; when\"00011100\"=>DAOUT<=\"11010001\"; when\"00011101\"=>DAOUT<=\"11010100\"; when\"00011110\"=>DAOUT<=\"11010110\"; when\"00011111\"=>DAOUT<=\"11011000\"; when\"00100000\"=>DAOUT<=\"11011011\"; when\"00100001\"=>DAOUT<=\"11011101\"; when\"00100010\"=>DAOUT<=\"11011111\"; when\"00100011\"=>DAOUT<=\"11100001\"; when\"00100100\"=>DAOUT<=\"11100011\"; when\"00100101\"=>DAOUT<=\"11100101\"; when\"00100110\"=>DAOUT<=\"11100111\"; when\"00100111\"=>DAOUT<=\"11101001\"; when\"00101000\"=>DAOUT<=\"11101010\";
when\"00101001\"=>DAOUT<=\"11101100\"; when\"00101010\"=>DAOUT<=\"11101110\"; when\"00101011\"=>DAOUT<=\"11101111\"; when\"00101100\"=>DAOUT<=\"11110001\"; when\"00101101\"=>DAOUT<=\"11110010\"; when\"00101110\"=>DAOUT<=\"11110100\"; when\"00101111\"=>DAOUT<=\"11110101\"; when\"00110000\"=>DAOUT<=\"11110110\"; when\"00110001\"=>DAOUT<=\"11110111\"; when\"00110010\"=>DAOUT<=\"11111001\"; when\"00110011\"=>DAOUT<=\"11111010\"; when\"00110100\"=>DAOUT<=\"11111010\"; when\"00110101\"=>DAOUT<=\"11111011\"; when\"00110110\"=>DAOUT<=\"11111100\"; when\"00110111\"=>DAOUT<=\"11111101\"; when\"00111000\"=>DAOUT<=\"11111110\"; when\"00111001\"=>DAOUT<=\"11111110\"; when\"00111010\"=>DAOUT<=\"11111111\"; when\"00111011\"=>DAOUT<=\"11111111\"; when\"00111100\"=>DAOUT<=\"11111111\"; when\"00111101\"=>DAOUT<=\"11111111\"; when\"00111110\"=>DAOUT<=\"11111111\"; when\"00111111\"=>DAOUT<=\"11111111\"; when\"01000000\"=>DAOUT<=\"11111111\"; when\"01000001\"=>DAOUT<=\"11111111\"; when\"01000010\"=>DAOUT<=\"11111111\"; when\"01000011\"=>DAOUT<=\"11111111\"; when\"01000100\"=>DAOUT<=\"11111111\";
when\"01000101\"=>DAOUT<=\"11111111\"; when\"01000110\"=>DAOUT<=\"11111111\"; when\"01000111\"=>DAOUT<=\"11111110\"; when\"01001000\"=>DAOUT<=\"11111110\"; when\"01001001\"=>DAOUT<=\"11111101\"; when\"01001010\"=>DAOUT<=\"11111100\"; when\"01001011\"=>DAOUT<=\"11111011\"; when\"01001100\"=>DAOUT<=\"11111010\"; when\"01001101\"=>DAOUT<=\"11111010\"; when\"01001110\"=>DAOUT<=\"11111001\"; when\"01001111\"=>DAOUT<=\"11110111\"; when\"01010000\"=>DAOUT<=\"11110110\"; when\"01010001\"=>DAOUT<=\"11110101\"; when\"01010010\"=>DAOUT<=\"11110100\"; when\"01010011\"=>DAOUT<=\"11110010\"; when\"01010100\"=>DAOUT<=\"11110001\"; when\"01010101\"=>DAOUT<=\"11101111\"; when\"01010110\"=>DAOUT<=\"11101110\"; when\"01010111\"=>DAOUT<=\"11101100\"; when\"01011000\"=>DAOUT<=\"11101010\"; when\"01011001\"=>DAOUT<=\"11101001\"; when\"01011010\"=>DAOUT<=\"11100111\"; when\"01011011\"=>DAOUT<=\"11100101\"; when\"01011100\"=>DAOUT<=\"11100011\"; when\"01011101\"=>DAOUT<=\"11100001\"; when\"01011110\"=>DAOUT<=\"11011111\"; when\"01011111\"=>DAOUT<=\"11011101\"; when\"01100000\"=>DAOUT<=\"11011011\";
when\"01100001\"=>DAOUT<=\"11011000\"; when\"01100010\"=>DAOUT<=\"11010110\"; when\"01100011\"=>DAOUT<=\"11010100\"; when\"01100100\"=>DAOUT<=\"11010001\"; when\"01100101\"=>DAOUT<=\"11001111\"; when\"01100110\"=>DAOUT<=\"11001100\"; when\"01100111\"=>DAOUT<=\"11001010\"; when\"01101000\"=>DAOUT<=\"11000111\"; when\"01101001\"=>DAOUT<=\"11000100\"; when\"01101010\"=>DAOUT<=\"11000010\"; when\"01101011\"=>DAOUT<=\"10111111\"; when\"01101100\"=>DAOUT<=\"10111100\"; when\"01101101\"=>DAOUT<=\"10111010\"; when\"01101110\"=>DAOUT<=\"10110111\"; when\"01101111\"=>DAOUT<=\"10110100\"; when\"01110000\"=>DAOUT<=\"10110001\"; when\"01110001\"=>DAOUT<=\"10101110\"; when\"01110010\"=>DAOUT<=\"10101011\"; when\"01110011\"=>DAOUT<=\"10101000\"; when\"01110100\"=>DAOUT<=\"10100101\"; when\"01110101\"=>DAOUT<=\"10100010\"; when\"01110110\"=>DAOUT<=\"10011111\"; when\"01110111\"=>DAOUT<=\"10011100\"; when\"01111000\"=>DAOUT<=\"10011001\"; when\"01111001\"=>DAOUT<=\"10010110\"; when\"01111010\"=>DAOUT<=\"10010011\"; when\"01111011\"=>DAOUT<=\"10010000\"; when\"01111100\"=>DAOUT<=\"10001101\";
when\"01111101\"=>DAOUT<=\"10001001\"; when\"01111110\"=>DAOUT<=\"10000110\"; when\"01111111\"=>DAOUT<=\"10000011\"; when\"10000000\"=>DAOUT<=\"10000000\"; when\"10000001\"=>DAOUT<=\"01111101\"; when\"10000010\"=>DAOUT<=\"01111010\"; when\"10000011\"=>DAOUT<=\"01110111\"; when\"10000100\"=>DAOUT<=\"01110011\"; when\"10000101\"=>DAOUT<=\"01110000\"; when\"10000110\"=>DAOUT<=\"01101101\"; when\"10000111\"=>DAOUT<=\"01101010\"; when\"10001000\"=>DAOUT<=\"01100111\"; when\"10001001\"=>DAOUT<=\"01100100\"; when\"10001010\"=>DAOUT<=\"01100001\"; when\"10001011\"=>DAOUT<=\"01011110\"; when\"10001100\"=>DAOUT<=\"01011011\"; when\"10001101\"=>DAOUT<=\"01011000\"; when\"10001110\"=>DAOUT<=\"01010101\"; when\"10001111\"=>DAOUT<=\"01010010\"; when\"10010000\"=>DAOUT<=\"01001111\"; when\"10010001\"=>DAOUT<=\"01001100\"; when\"10010010\"=>DAOUT<=\"01001001\"; when\"10010011\"=>DAOUT<=\"01000110\"; when\"10010100\"=>DAOUT<=\"01000100\"; when\"10010101\"=>DAOUT<=\"01000001\"; when\"10010110\"=>DAOUT<=\"00111110\"; when\"10010111\"=>DAOUT<=\"00111100\"; when\"10011000\"=>DAOUT<=\"00111001\";
when\"10011001\"=>DAOUT<=\"00110110\"; when\"10011010\"=>DAOUT<=\"00110100\"; when\"10011011\"=>DAOUT<=\"00110001\"; when\"10011100\"=>DAOUT<=\"00101111\"; when\"10011101\"=>DAOUT<=\"00101100\"; when\"10011110\"=>DAOUT<=\"00101010\"; when\"10011111\"=>DAOUT<=\"00101000\"; when\"10100000\"=>DAOUT<=\"00100101\"; when\"10100001\"=>DAOUT<=\"00100011\"; when\"10100010\"=>DAOUT<=\"00100001\"; when\"10100011\"=>DAOUT<=\"00011111\"; when\"10100100\"=>DAOUT<=\"00011101\"; when\"10100101\"=>DAOUT<=\"00011011\"; when\"10100110\"=>DAOUT<=\"00011001\"; when\"10100111\"=>DAOUT<=\"00010111\"; when\"10101000\"=>DAOUT<=\"00010110\"; when\"10101001\"=>DAOUT<=\"00010100\"; when\"10101010\"=>DAOUT<=\"00010010\"; when\"10101011\"=>DAOUT<=\"00010001\"; when\"10101100\"=>DAOUT<=\"00001111\"; when\"10101101\"=>DAOUT<=\"00001110\"; when\"10101110\"=>DAOUT<=\"00001100\"; when\"10101111\"=>DAOUT<=\"00001011\"; when\"10110000\"=>DAOUT<=\"00001010\"; when\"10110001\"=>DAOUT<=\"00001001\"; when\"10110010\"=>DAOUT<=\"00000111\"; when\"10110011\"=>DAOUT<=\"00000110\"; when\"10110100\"=>DAOUT<=\"00000110\";
when\"10110101\"=>DAOUT<=\"00000101\"; when\"10110110\"=>DAOUT<=\"00000100\"; when\"10110111\"=>DAOUT<=\"00000011\"; when\"10111000\"=>DAOUT<=\"00000010\"; when\"10111001\"=>DAOUT<=\"00000010\"; when\"10111010\"=>DAOUT<=\"00000001\"; when\"10111011\"=>DAOUT<=\"00000001\"; when\"10111100\"=>DAOUT<=\"00000001\"; when\"10111101\"=>DAOUT<=\"00000000\"; when\"10111110\"=>DAOUT<=\"00000000\"; when\"10111111\"=>DAOUT<=\"00000000\"; when\"11000000\"=>DAOUT<=\"00000000\"; when\"11000001\"=>DAOUT<=\"00000000\"; when\"11000010\"=>DAOUT<=\"00000000\"; when\"11000011\"=>DAOUT<=\"00000000\"; when\"11000100\"=>DAOUT<=\"00000001\"; when\"11000101\"=>DAOUT<=\"00000001\"; when\"11000110\"=>DAOUT<=\"00000001\"; when\"11000111\"=>DAOUT<=\"00000010\"; when\"11001000\"=>DAOUT<=\"00000010\"; when\"11001001\"=>DAOUT<=\"00000011\"; when\"11001010\"=>DAOUT<=\"00000100\"; when\"11001011\"=>DAOUT<=\"00000101\"; when\"11001100\"=>DAOUT<=\"00000110\"; when\"11001101\"=>DAOUT<=\"00000110\"; when\"11001110\"=>DAOUT<=\"00000111\"; when\"11001111\"=>DAOUT<=\"00001001\"; when\"11010000\"=>DAOUT<=\"00001010\";
when\"11010001\"=>DAOUT<=\"00001011\"; when\"11010010\"=>DAOUT<=\"00001100\"; when\"11010011\"=>DAOUT<=\"00001110\"; when\"11010100\"=>DAOUT<=\"00001111\"; when\"11010101\"=>DAOUT<=\"00010001\"; when\"11010110\"=>DAOUT<=\"00010010\"; when\"11010111\"=>DAOUT<=\"00010100\"; when\"11011000\"=>DAOUT<=\"00010110\"; when\"11011001\"=>DAOUT<=\"00010111\"; when\"11011010\"=>DAOUT<=\"00011001\"; when\"11011011\"=>DAOUT<=\"00011011\"; when\"11011100\"=>DAOUT<=\"00011101\"; when\"11011101\"=>DAOUT<=\"00011111\"; when\"11011110\"=>DAOUT<=\"00100001\"; when\"11011111\"=>DAOUT<=\"00100011\"; when\"11100000\"=>DAOUT<=\"00100101\"; when\"11100001\"=>DAOUT<=\"00101000\"; when\"11100010\"=>DAOUT<=\"00101010\"; when\"11100011\"=>DAOUT<=\"00101100\"; when\"11100100\"=>DAOUT<=\"00101111\"; when\"11100101\"=>DAOUT<=\"00110001\"; when\"11100110\"=>DAOUT<=\"00110100\"; when\"11100111\"=>DAOUT<=\"00110110\"; when\"11101000\"=>DAOUT<=\"00111001\"; when\"11101001\"=>DAOUT<=\"00111100\"; when\"11101010\"=>DAOUT<=\"00111110\"; when\"11101011\"=>DAOUT<=\"01000001\"; when\"11101100\"=>DAOUT<=\"01000100\";
when\"11101101\"=>DAOUT<=\"01000110\"; when\"11101110\"=>DAOUT<=\"01001001\"; when\"11101111\"=>DAOUT<=\"01001100\"; when\"11110000\"=>DAOUT<=\"01001111\"; when\"11110001\"=>DAOUT<=\"01010010\"; when\"11110010\"=>DAOUT<=\"01010101\"; when\"11110011\"=>DAOUT<=\"01011000\"; when\"11110100\"=>DAOUT<=\"01011011\"; when\"11110101\"=>DAOUT<=\"01011110\"; when\"11110110\"=>DAOUT<=\"01100001\"; when\"11110111\"=>DAOUT<=\"01100100\"; when\"11111000\"=>DAOUT<=\"01100111\"; when\"11111001\"=>DAOUT<=\"01101010\"; when\"11111010\"=>DAOUT<=\"01101101\"; when\"11111011\"=>DAOUT<=\"01110000\"; when\"11111100\"=>DAOUT<=\"01110011\"; when\"11111101\"=>DAOUT<=\"01110111\"; when\"11111110\"=>DAOUT<=\"01111010\"; when\"11111111\"=>DAOUT<=\"01111101\"; when others=>DAOUT<=(others=>'0'); END CASE; END PROCESS;
END ARCHITECTURE ART;
--频率控制模块 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY STEP IS
PORT (
RESET,CLK:IN STD_LOGIC;
STEP1,STEP2:in std_logic_vector(4 downto 0);
KOUT: OUT STD_LOGIC_VECTOR(23 DOWNTO 0)); END;
ARCHITECTURE DDS OF STEP IS SIGNAL EN,EN1: STD_LOGIC; BEGIN
EN1<=STEP1(4) OR STEP1(3) OR STEP1(2) OR STEP1(1) OR STEP1(0) OR STEP2(4) OR STEP2(3) OR STEP2(2) OR STEP2(1) OR STEP2(0);
PROCESS(EN1,CLK)
VARIABLE Q:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF EN1='1' THEN Q:=Q+1;ELSE Q:=\"000\";
END IF;
END IF; EN<=Q(2); END PROCESS;
PROCESS(RESET,EN,STEP1,STEP2)
VARIABLE K:STD_LOGIC_VECTOR(23 DOWNTO 0); BEGIN
IF RESET='1' THEN K:=\"000000000000001000110000\";
ELSIF EN'EVENT AND EN='1' THEN
CASE STEP1 IS
WHEN \"10000\" => IF K<5599945 THEN K:=K+56;END IF;
WHEN \"01000\" => IF K<5599441 THEN K:=K+560;END IF; WHEN \"00100\" => IF K<5594401 THEN K:=K+5600;END IF; WHEN \"00010\" => IF K<5544001 THEN K:=K+56000;END IF; WHEN \"00001\" => IF K<5040001 THEN K:=K+560000;END IF;
when others=>null; END CASE; CASE STEP2 IS
WHEN \"10000\" => IF K>616 THEN K:=K-56;END IF;
WHEN \"01000\" => IF K>1120 THEN K:=K-560;END IF; WHEN \"00100\" => IF K>6460 THEN K:=K-5600;END IF; WHEN \"00010\" => IF K>56560 THEN K:=K-56000;END IF; WHEN \"00001\" => IF K>560560 THEN K:=K-560000;END IF; when others=>null; END CASE; END IF; KOUT<=K; END PROCESS; END;
--频率计数器模块 IBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DISP1 IS PORT (
RESET,CLK:IN STD_LOGIC;
STEP1,STEP2:in std_logic_vector(4 downto 0);
KOUT: OUT STD_LOGIC_VECTOR(23 DOWNTO 0)); END;
ARCHITECTURE DDS OF DISP1 IS SIGNAL EN,EN1,C: STD_LOGIC;
SIGNAL DAT:STD_LOGIC_VECTOR(23 DOWNTO 0):=\"000000000000000000000001\"; BEGIN
EN1<=STEP1(4) OR STEP1(3) OR STEP1(2) OR STEP1(1) OR STEP1(0) OR STEP2(4) OR STEP2(3) OR STEP2(2) OR STEP2(1) OR STEP2(0);
PROCESS(EN1,CLK)
VARIABLE Q:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF EN1='1' THEN Q:=Q+1;ELSE Q:=\"000\";
END IF;
END IF; EN<=Q(2); END PROCESS;
PROCESS(RESET,EN,STEP1,STEP2) BEGIN
IF RESET='1' THEN DAT<=\"000000000000000000000000\"; ELSIF EN'EVENT AND EN='1' THEN CASE STEP1 IS
WHEN \"10000\" => IF DAT<629146 THEN DAT<=DAT+1;
IF DAT(3 DOWNTO 0)>8 THEN
DAT(3 DOWNTO 0)<=\"0000\";END IF;END IF;
WHEN \"01000\" => IF DAT<629137 THEN DAT<=DAT+16;
IF DAT(7 DOWNTO 4)>8 THEN
DAT(7 DOWNTO 4)<=\"0000\";END IF;END IF;
WHEN \"00100\" => IF DAT<628993 THEN DAT<=DAT+256;
IF DAT(11 DOWNTO 8)>8 THEN
DAT(11 DOWNTO 8)<=\"0000\";END IF;END IF;
WHEN \"00010\" => IF DAT<626689 THEN DAT<=DAT+4096;
IF DAT(15 DOWNTO 12)>8 THEN
DAT(15 DOWNTO 12)<=\"0000\";END IF;END IF;
WHEN \"00001\" => IF DAT<589825 THEN DAT<=DAT+65536;
IF DAT(19 DOWNTO 16)>8 THEN
DAT(19 DOWNTO 16)<=\"0000\";C<='1';END IF;END IF; when others=>null; END CASE; CASE STEP2 IS
WHEN \"10000\" => IF DAT>0 THEN DAT<=DAT-1;
IF DAT(3 DOWNTO 0)<1 THEN
DAT(3 DOWNTO 0)<=\"0000\";END IF;END IF;
WHEN \"01000\" => IF DAT>15 THEN DAT<=DAT-16;
IF DAT(7 DOWNTO 4)<1 THEN
DAT(7 DOWNTO 4)<=\"0000\";END IF;END IF;
WHEN \"00100\" => IF DAT>255 THEN DAT<=DAT-256;
IF DAT(11 DOWNTO 8)<1 THEN
DAT(11 DOWNTO 8)<=\"0000\";END IF;END IF;
WHEN \"00010\" => IF DAT>4095 THEN DAT<=DAT-4096;
IF DAT(15 DOWNTO 12)<1 THEN
DAT(15 DOWNTO 12)<=\"0000\";END IF;END IF;
WHEN \"00001\" => IF DAT>65534 THEN DAT<=DAT-65536;
IF DAT(19 DOWNTO 16)<1 THEN
DAT(19 DOWNTO 16)<=\"0000\";C<='0';END IF;END IF; WHEN OTHERS=>NULL; END CASE; END IF; KOUT<=DAT; END PROCESS; END;
--扫描显示模块 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity disp is port(clk:in std_logic; data1,data2,data3,data4,
data5,data6:in std_logic_vector(3 downto 0); scan:out std_logic_vector(7 downto 0); dispout:out std_logic_vector(6 downto 0));
end;
architecture one of disp is
signal cnt8:std_logic_vector(2 downto 0); signal data:std_logic_vector(3 downto 0); begin p1:process(clk) begin
if clk'event and clk='1' then cnt8<=cnt8+1; end if; end process p1; p2:process(cnt8) begin case cnt8 is
when \"000\"=>scan<=\"00000001\";data<=\"0000\"; when \"001\"=>scan<=\"00000010\";data<=\"0000\"; when \"010\"=>scan<=\"00000100\";data<=data1; when \"011\"=>scan<=\"00001000\";data<=data2; when \"100\"=>scan<=\"00010000\";data<=data3; when \"101\"=>scan<=\"00100000\";data<=data4; when \"110\"=>scan<=\"01000000\";data<=data5; when \"111\"=>scan<=\"10000000\";data<=data6; when others=>null; end case; end process p2; p3:process(data) begin case data is
when \"0000\" => dispout <=\"0111111\"; when \"0001\" => dispout <=\"0000110\"; when \"0010\" => dispout <=\"1011011\"; when \"0011\" => dispout <=\"1001111\"; when \"0100\" => dispout <=\"1100110\";
when \"0101\" => dispout <=\"1101101\"; when \"0110\" => dispout <=\"1111101\"; when \"0111\" => dispout <=\"0000111\"; when \"1000\" => dispout <=\"1111111\"; when \"1001\" => dispout <=\"1101111\"; when \"1111\" => dispout <=\"0000000\"; when others=>null; end case; end process p3; end;
因篇幅问题不能全部显示,请点此查看更多更全内容