波形发生器是一种数据信号发生器,在调试硬件时,常常需要加入一些信号,以观察电路工作是否正常。用一般的信号发生器,不但笨重,而且只发一些简单的波形,不能满足需要。例如用户要调试串口通信程序时,就要在计算机上写好一段程序,再用线连接计算机和用户实验板,如果不正常,不知道是通讯线有问题还是程序有问题。用E2000/L的波形发生器功能,就可以定义串口数据。通过逻辑探勾输出,调试起来简单快捷。任意波形发生器是目前电子测量仪器中发展最为快速的产品之一。它既可输出标准函数信号,也可以产生由用户定义的非标准函数波形(任意波形)信号,并且有丰富的模拟调制(AM,FM,PM)和数字调制(FSK,PSK)功能,能为不同的应用领域提供各种标准或非标准信号,尤其在水下声纳、通信、雷达导航、电子对抗等装备的研制、生产、维修中,是必不可少的信号发生器。
1 任意波形发生器的FPGA实现
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA.因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。
系统框架如图1所示,上位机产生任意波形数据,经USB2.0控制器CY7C68013A与FPGA(现场可编程门阵列)相连。将数据下载到FPGA的RAM当中,再通过硬件电路依次从波形存储器中读取出来,经D/A转换及滤波后得到所需信号波形输出。
关于DDS的基本原理与结构在这里就不再加以阐述,用FPGA按照DDS的基本原理和结构设计和实现一个任意波形发生器,所以DDS的几个基本部分都是应当具备的。实现任意波形发生的关键在于把存放波形量化表的ROM换成了可以改写的RAM,这样通过与RAM的接口可以改变存放在波形RAM中的数据从而实现任意波形发生。这里主要介绍控制部分、相位累加器、波形RAM几个模块来叙述任意波形发生器的实现。
1.1 控制部分
这个部分主要是要解决DDS模块与单片机的接口问题。在FPGA的实现中,主要设计了2个模块,一个是输入寄存器模块,为了接收单片机写入的频率控制字。另外一个是地址分配模块,这样单片机就可以通过不同的地址来选通FPGA各个模块工作。设计中DDS采用了32位的相位累加器。这样对于一个频率控制字,单片机要分4次分别写入4个字节;基于这样的要求,设计了输入寄存器模块如图2,这个部分主要是要解决DDS模块与单片机的接口问题。
din[70]是该模块与单片机数据线的接口,clr是低电平异步清零,en是高电平使能,elk为数据写入时钟,dout[31O]是寄存器输出的32位频率控制字。该模块工作过程为:当en为高电平,clr也为高电平时,elk的上升沿将输入的8位数据锁存进该模块中,当锁存完4个字节的数据后,自动将该4个字节的数据按照先写入的在高位的顺序组合成一个32 bit的数据输出到dout[310].
该模块的功能仿真图如图3所示,看到当clr='1'并且en='1'时,经过4个时钟,dout上将前4个时钟的值'00'、'01'、'02'、'03'组成32位的'00010203'数值输出在dout上。
地址分配模块采用一个3/8译码器来实现地址选通的功能,如图4所示。
由于累加器的清零是当"clr"=1的时候,所以在与门后加一个反相器,而频率寄存器清零的条件是"clr"=0,所以,就可以直接与门后相连即可。3/8译码器的使能端接VCC,G2AN和G2BN连起来接CS,作为整个任意波形发生器模块的片选信号,当低电平的时候选中,各模块才开始工作。
地址锁存模块主要解决单片机P0口的分时复用问题。本设计选用的单片机为51系列单片机,其PO口既作为数据口,又作为地址总线的低8位,因此在使用时,需要将地址信号从分时复用的地址/数据总线中分离出来。本设计选用8D锁存器7415373来作为地址锁存器。当74LS373用作为地址锁存器时,应使OEN为低电平导通输出,此时,锁存使能端G为高电平时,输出Q1~Q8状态与输入D1~D8状态相同;当G发生负跳变时,输入端数据D1~D8锁入Q1~Q8.因此在使用74LS373时,51单片机的ALE信号可以直接与74LS373的G相连。
1.2 相位累加器设计
在运算器中,累加器是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器。能进行加、减、读出、移位、循环移位和求补等操作。是运算器的主要部分。在中央处理器CPU中,累加器(accumulator)是一种暂存器,它用来储存计算所产生的中间结果。如果没有像累加器这样的暂存器,那么在每次计算(加法,乘法,移位等等)后就必须要把结果写回到内存,然后再读回来。然而存取主内存的速度是比从数学逻辑单元(ALU)到有直接路径的累加器存取更慢。
相位累加器用于对输入频率控制字进行累加运算,输入频率控制字决定输出信号的频率和频率分辨率。因此相位累加器是整个DDS性能的关键部分。传统的相位累加器是用1个加法器加1个D触发器组成,调用其中的1个宏模块设置成32位数据相加,再加另一个32位的宏模块,就可以组成相位累加器。它在QuartusII软件中的最高编译频率只有262.12 MHz,显然不能满足设计要求。其时序仿真如图5所示。
通过仿真,当直接采用32 bit累加器的时候系统时钟最大只能达到大约25 MHz,显然是达不到要求的。从设计上看,它实质上是一个带反馈的32位加法器,把输出数据作为另一路输入数据和从单片机传来的频率控制连续相加,产生有规律的32位相位地址码。一般位数小的累加器可以通过FPGA中的进位链得到快速高效的电路,但是进位链必须位于临近的LE(逻辑单元)或LAB(逻辑阵列块)中,长的进位链会减少供其他逻辑使用的布线资源,同时过长的进位链也会制约系统频率的提高,所以进位链不能太长。因此,在相位累加器的设计中,要解决的难题是设法提高工作速度。为了解决速度难题,需从两个方面进行改进。
1.2.1 改进的流水线结构
在时序电路设计中为了提高速度,流水线结构是一种常用的设计方法。对于累加器来讲,流水线结构就是把一个位数很长的加法拆分成N个位数较短的加法,在N个时钟周期内做完然后输出运算结果,N就是流水线的级数。采用流水结构以后由于加法器的字长变短了,对于FPGA来讲加法器字长变短对工作频率的提高是相当可观的。当然,流水结构的使用并不能无限制地提高电路的工作速度。因此对于不同的器件来说,采用多少级流水对性能的提升比较大这个要经过仿真实验才能得到一个比较肯定的值。
本文运用流水线结构对相位累加器进行设计,当m=8、n=4的情况下,相位累加器的工作频率是最高的,达到了约70 MHz.但是为了进一步提高工作频率,还需要结合下面的并行进位方法。
1.2.2 并行进位加法器
加法器是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。常用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用。在电子学中,加法器是一种数位电路,其可进行数字的加法计算。在现代的电脑中,加法器存在于算术逻辑单元(ALU)之中。 加法器可以用来表示各种数值,如:BCD、加三码,主要的加法器是以二进制作运算。由于负数可用二的补数来表示,所以加减器也就不那么必要。
DDS累加器电路的设计采用了流水线结构,由8级4位加法器完成对32位控制字的累加。32位累加器的结果在送入相位幅度变化电路时,进行了高位截断,只取高12位数据进行查表。因而,在8级的流水线结构中,前5级4位加法器实际上只贡献了进位,在设计时,前4级加法器采用了超前进位链,而高位加法器不仅要给出进位值,还要获得加法的结果,因此采用了QuartusII自带的宏模块结构。通过每一位的Pi、Gi和Ci-1值很容易求得该位进位值Ci.再与该位的和(Ai+Bi)相异或就得到最后的结果Si.即
采用上述结构,极大地提高了累加器的工作速度,其功能仿真图如图6所示,从图中可以看出,此4 bit超前进位加法器完全满足4位全加器的逻辑功能。
下面就将前5级采用超前进位加法器的32位累加器和宏模块中调用的4位全加器组成的32位相位累加器性能进行比较。
普通流水线累加器的模块是由4位D触发器,5位D触发器和4位全加器作为基本元件,采用原理图输入的方法设计FPGA的流水线累加器。该模块的设计参照流水线累加器结构进行,不同之处在于:由于相位累加器只用高位寻址,所以低位上为了和高位结果同时输出而做延时作用的D触发器件均被去掉了。这样做的结果是,相位累加器输出的低20位会因为提前输出而混乱,但是由于高12位的输出一定是正确的,这样做既节省了资源,对结果又没有任何影响。仿真结果证明假如不用流水线结构,32 bit相位累加器工作频率最高达到约25 MHz.消耗的资源是82个LEs,而用了8级流水线结构后,编译工作频率最高达到了约317.79 MHz,资源消耗为186个LEs.可见在资源上的消耗换来了在性能上的极大提高。
流水线累加器的时序仿真如图7所示:可以看出当输入数据确定后,输出结果要经过8个时钟周期的延时后输出,这是因为采用了8级流水结构。采用多少级流水结构,输出就会延时多少个周期。同时也说明,对于输入数据切换来说,该系统会有8个时钟周期的延时,这是累加器采用流水线结构所不可避免的后果。事实上目前许多DDS专用芯片由于也采用流水线结构,所以本身也存在这样的问题。由于8个时钟周期的延时与系统时钟相比,实际上还是很小的,在一般的应用场合下也是可以接受的。由于输出的低20位未用,被省略了,只用了输出的高12位,所以仿真波形中只有高12位的输出结果。从输出结果来看,高12位的输出值是没有错误的,与设计思想吻合。
下面介绍超进位流水线累加器的构成,比较流水线累加器内部结构图和超前进位加法器的32位相位累加器的结构图,可以看出两个图的区别,经过编译以后的报告如图8所示,可以看出经过改进后,编译的最大工作频率提高到了336.7 MHz.比单纯的流水线累加器提高了将近20 MHz.
图9是其时序仿真图,从图上可以看出,其值完全和功能仿真一致。
1.3 双口RAM设计
双口RAM 是在一个SRAM存储器上具有两套完全独立的数据线、地址线和读写控制线,并允许两个独立的系统同时对该存储器进行随机性的访问。即共享式多端口存储器。双口RAM最大的特点是存储数据共享。一个存储器配备两套独立的地址、数据和控制线,允许两个独立的CPU或控制器同时异步地访问存储单元。因为数据共享,就必须存在访问仲裁控制。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。双口RAM可用于提高RAM的吞吐率,适用于作于实时的数据缓存。
在设计波形存取电路时,首先应确定波形RAM的深度和字长。波形RAM的深度和字长与很多因素有关系。存储器内部存储的是一个或N个整周期的标准波形数据,存储器容量越大,存储的被采样波形点数就越多,采样效果就越好。存储器的读取速度是产生高频波形的重要保证,读取速度必须满足相位累加器的累加速度,这样才能保证直接数字合成过程的正常进行。同时,为了保证整个速度的同步性,选用一种同步RAM也是很必要的。
首先要确定波形RAM的深度和字长,由于任意波形发生器设计中选择的DAC的字长是12位,很明显波形RAM的字长也应该是12位;由于选择的地址线位数为12位(即相位累加器输出的高12位),寻址空间为4 K(4 096)个单元,即RAM存储空间应为4 096x12 bit=49 152 bits,由于本设计所选择的FPGA内部RAM最大可配置为119 808 bits,完全可以满足49 152 bits的RAM空间设计。所以波形RAM设计为字长12位,地址线12位。针对任意波形发生器与普通DDS的不同,波形RAM的设计主要要求RAM具有读写两个端口,这样可以通过两套地址系统,方便地进行RAM内容更新,即对RAM的写操作;波形幅度量化数据的输出,即对RAM的读操作。结合ALTERA公司FPGA的特点,选择了EP2C5F256C6这个芯片内部的双口RAM来实现这个功能,如图lO所示。
芯片内部的双口RAM具有读地址和写地址两组地址线,数据线也分成了读数据线和写数据线两组。这样波形RAM的设计就非常简单了,将写数据线、写地址线和单片机的数据线、地址线相连,用单片机更新RAM中的数据;将读地址线和读数据线分别与相位累加器的输出和DAC的数据输入相连,读数据线上即输出了波形幅度量化数据。
2 结束语
本文详细阐述了产生任意波形数据和基于FPGA的硬件设计部分,以QuartusⅡ8.O软件平台作为开发工具,选用CycloneII系列的EP2C5-F256C6 FPGA芯片实现DDS结构中的数字部分,其中相位累加器是DDS的核心部件,重点阐述了相位累加器部分的设计,采用8级流水线结构借助前5级的超前进位模块,编译的最高工作频率,由317.97 MHz提高到336.7 MHz,采用此种设计方法,节约了成本,缩短了开发周期,具有可行性。