50
基于FPGA的任意波形发生器的设计与实现
4.2.1 地址译码和控制数据寄存模块
任意波形发生器要正常工作,必须对PC机下发的各种控制命令进行寄存。而这些控制数据寄存器都是共享数据总线的,因此,为了对不同的寄存器进行操作,还需要有译码电路。
在设计USB与FPGA的接口时,采用了如下的方案:
在PC机向下发波形数据时,将CY7C68013的接口配置成从属FIFO方式,在这种方式下,CY7C68013的PB口和PD口是组合成16位数据线使用的;而在PC机下发控制命令时,将CY7C68013的接口配置成端口方式,在这种方式下,CY7C68013的PA、PB、PD口都可作为独立的IO口使用,这时,我们将PB口用作数据总线,PD口低四位作为地址总线,而将PA的低两位作为控制总线(写寄存器时钟脉冲和寄存器复位脉冲)。
在设计译码电路时,直接调用了Quartus II提供的LPM地址译码模块,使用
4了PB0~PB3四位地址线作为译码器的输入,共能得到2即16位译码器输出。如图4.2所示。
图4.2 四位地址译码器
CY7C68013的PB口作为数据总线使用时位数为8位,PC机在下发少于8位的控制数据时可以一次写入寄存器,而当控制数据大于8位时(例如频率控制字),则要分多次写入寄存器。下面以频率控制字寄存器为例说明这些控制数据寄存的设计。
在设计中,使用了32位的相位累加器,这样对于一个频率控制字,PC机要分4次分别写入4个字节。基于这种要求,我们设计了频率控制字寄存器模块如图4.3所示。
第四章 FPGA逻辑设计
51
图4.3 频率控制字寄存器
Din[7..0]是数据输入端,与CY7C68013的PB端相连。clk是写入时钟端,rst为高电平异步复位端,en为使能端,Dout[31..0]是寄存器32位频率输出端,Ready为频率字下载完成标志信号输出端。
该模块的工作过程是这样的,在en使能为高时,先由rst发一个高电平复位信号,然后在clk的上升沿逐次将数据线上的8bits数据移入寄存器,当4字节数据都写入寄存之后,ready输出一个高电平,标志频率字下载完毕,可以输出。图4.4是该模块的时序仿真。
图4.4 频率控制字寄存器模块时序仿真
从时序仿真来看,Dout输出的数据中间存在一些不稳定态,但这并不影响频率字寄存器的功能,因为频率控制字是在其稳定的时刻(ready为高电平)输出的。
4.2.2 移位寄存器控制逻辑
在第三章硬件电路设计中提到,DAC后端滤波器是通过继电器来选通的,而继电器的开断是由串行移位寄存器TPIC6B596来控制的,在设计中,并不是直接由PC机给TPIC6B596发送串行数据,而是先将控制继电器开断的并行数据下发给FPGA内部的数据寄存器,然后由移位寄存器控制逻辑将并行数据转换成串行数据输出到TPIC6B596。所设计的移位寄存器控制逻辑及时序仿真分别如图4.5和图4.6所示。
图4.5 移位寄存器控制逻辑
52
基于FPGA的任意波形发生器的设计与实现
图4.6移位寄存器控制逻辑时序仿真
从图4.6可以看出,这部分的功能是产生8个移位时钟srck,将Din[7..0]拆分成8个串行数据在移位时钟的控制下从ser_in输出,在8个串行数据输出完毕后,在rck端输出一个正脉冲将TPIC6B596移位寄存器的数据送到其输出寄存器启动开关。
4.2.3 数字电位器控制逻辑
设计中,波形发生器的输出信号的直流偏置电压是通过数字电位器X9C103来调节的(关于X9C103内部结构,请参考图3.17)。X9C103的控制逻辑及时序仿真如图4.7和图4.8所示。
图4.7 X9C103控制逻辑
图4.8 X9C103控制逻辑时序仿真
图4.7中,dir是滑动端方向控制信号,inc是滑动端动作启动信号,inc每输出一个负脉冲,数字电位器的滑动端朝dir指定的方向滑动一次。
该逻辑的工作方式是:每次rst高电平复位信号发出后,先由dir输出高电平,同时inc输出100个负脉冲,将X9C103的触点位置(VW端)滑动到其最上端(VH端),然后将dir输出改为低电平,同时根据输入Din[7..0]决定inc输出负脉
第四章 FPGA逻辑设计
53
冲的个数(输出脉冲个数=Din/2,其中Din为十进制表示的输入值),此时,可以将触点位置从X9C103的最上端(VH端)朝其最下端(VL端)移动到指定位置。
4.2.4 相位累加器的设计
在利用FPGA设计DDS电路时,相位累加器是决定DDS电路性能的一个关键部分之一,小的累加器可以利用Cyclone II器件的进位链得到快速高效的电路结构,而过长的进位链会制约整个系统速度的提高。
在时序电路设计中,一种提高速度的办法是采用流水线技术[28],即把要在一个时钟周期内完成的逻辑操作拆分成几步较小的操作,并插入几个时钟周期来提高系统的工作频率。
按设计要求,任意波形发生器采用的系统时钟是200MHz,要达到0.05Hz的频率分辨率,按照式?f?fc/2N,相位累加器的位数至少为32位。虽然Quartus II单元库中提供了32位LPM累加器模块,但是通过仿真,在EP2C5上实现该累加模,其最大工作频率只能达到159.36MHz,不满足200MHz系统时钟要求,因此在设计中并没有直接调用这个模块,而是采用了如图4.9的设计。
图4.9 采用了一级流水线的32位累加器
我们是这样设计的:将32位的累加器拆成了2个16位的累加器,中间插入一级流水线,将高16位累加器相对于低16位累加器延迟一个时钟周期做累加,这样等高16位累积器进行累加的时候,低16位的累加器已经算出了进位结果,这时再将该进位作为高16位累加器的进位输入进行累加,同时为了保证输出结果的正确性,低16位累加器的计算结果必须延迟一个时钟周期才输出,这样就使得高16位累加器和低16位累加器的累加结果在同一时刻输出。这样的结果是,采用了一级流水线的32累加器要比没有采用流水线的32位累加器延迟一个时钟周
54
基于FPGA的任意波形发生器的设计与实现
期才输出结果。但这并不影响DDS相位累加器的工作,DDS输出的相位序列除了有一个时钟周期的延迟之外结果并没有发生任何变化,但累加器的速度确提高了。仿真证明,采用了一级流水线技术后,累加器的工作最高工作频率能达到223.05MHz。我们做了一个对比,直接调用Quartus II单元库中提供的32位LPM累加器模块资源消耗是33个逻辑单元(LE),而所设计的采用一级流水线的累加器资源消耗是67个LE,可见工作速度的提高是以资源消耗换来的,这就是FPGA设计中“面积换速度”的原则。虽然使用更多级的流水线能进一步提高累加器的速度,但是为了节省资源,在一级流水线能满足要求的前提下,没有多级流水线的设计。图4.10是一级流水线相位累加器时序仿真。从仿真图来看,相位累加器的输出端数据也会存在一些不稳定状态,因此在设计中要注意调整累加器后级寄存器的采样时钟,使其对准数据稳定的数据状态。
图4.10 一级流水线相位累加器时序仿真
4.2.5 波形存储器的设计
EP2C5总共内嵌了26个M4K RAM块,总比特数达119,808bits,这为我们设计波形存储器提供了方便,因此并没有使用片外存储器。这些嵌入式RAM块可以配置成只读存储器(ROM)或随机存储器(RAM),但是要实现任意波形发生功能,必须能实时更新波形存储器内的波形数据,故设计中将这些嵌入式RAM块配置成了RAM。由于硬件电路设计中选用的DAC芯片位数为10位,因此RAM的字长应该设置为10bits,根据第二章的分析,从噪声功率的角度来看,波形RAM的地址线位数位要等于或者略大于DAC位数加2,即使用12位的地址线,那么RAM的存储深度为212,存储容量为212?10bits=40960bits。在设计中,我们总共使用2个这样的RAM,一个用于存储载波数据,另外一个用于存储调制波数据。那么消耗的总的M4K RAM资源为81920bits。RAM的设计我们直接调用了单元库中提供的LPM RAM模块[28],只要设置相应参数即可,其结构如图4.11。 图4.11所示是一个双端口RAM,读和写的地址、时钟和数据线都被分开来。读时钟由系统参考时钟提供,读地址由相位累加器输出的的高12位数据提供,读数据线与后级调幅模块相连;写时钟由USB接口同步时钟提供,写地址由专门的写地址发生模块提供,写数据线与USB接口的数据总线相连。在下载波形数据时,USB接口方式配置成了从属FIFO方式,其数据总线为16位,因此只有其中的低