基于FPGA的任意波形发生器设计与实现 下载本文

70

基于FPGA的任意波形发生器的设计与实现

对于-512~ -1之间的整数,我们是否也可以直接舍弃这高6位呢?事实证明我们的猜想是正确的,可以举个例:对于-111,16位补码表示为“1111111110010001”,截取低10位“1110010001”,这正是10位补码表示的-111。通过以上分析,我们可以得出结论:从计算机输出的16位波形数据,不需要经过特别的转换,只需要截取其低10位存入波形RAM即可。

5.4.4 参数提取和数据发送

任意波形发生器用户软件程序要实现对其硬件系统的控制,必须将波形数据和控制命令发送到FPGA当中,这其中首先要做的工作是将软件界面设置的各项参数通过计算转换为实际的控制数据。下面以频率控制字的计算为例说明控制数据的产生。

要计算频率控制字,首先要调用GetCtrlVal函数获得控件的设置的频率值及其单位,然后根据下式来计算频率控制字:

K?foN?2 式(5-1) fc在第四章我们将相位累加器和频率字寄存器都设计为32bits,因此频率字必须为32位的无符号整数。具体的频率参数处理语句如下:

freq_k=(unsigned int)(((freq*unit)/200000000.0)*4294967296);

其中freq_k为频率字,freq和unit分别是在操作面板设置的频率值和单位。 另外,频率字的处理要比其他参数的处理多注意一个地方,在第二章讨论DDS杂散抑制技术时,曾经提到如果将频率字强制为奇数,使其与2N互质,能将杂散改善约3.9dB,因此当计算出来的频率字不为奇数时,应该通过加1或者减1将其置为奇数,这当然是在对输出频率影响不大的情况下才采用的办法,比如在频率字比较大的时候,加1或减1对输出频率造成的影响可以忽略。

波形数据和控制数据最终发送给FPGA是通过调用Windows的API函数DeviceIOControl来实现的,该函数的定义如下: DeviceIOControl(

HANDLE hDevice, //设备句柄,由CreateFile函数产生 DWORD dwIoControlCode, //IOCTL,用于指定驱动程序完成的工作 LPVOID lpInBuffer, //输入缓冲区指针 DWORD nInBufferSize, //输入缓冲区大小 LPVOID lpOutBuffer, //输出缓冲区指针 DWORD nOutBufferSize, //输出缓冲区大小

第五章 任意波形发生器的软件设计

71

LPDWORD lpBytesReturned, //接收字节计数器指针 LPOVERLAPPED lpOverlapped //异步操作结构指针 );

其中IOCTL即IO控制代码,是在设备驱动程序中的宏定义,一种IOCTL对应一种功能。设计中用到了两种IOCTL:IOCTL_EZUSB_VENDOR_REQUEST和IOCTL_EZUSB_BULK_WRITE。前者用来传输控制数据,后者用来下载波形数据。任意波形发生器的数据发送流程如下:

开始提取用户界面参数N有无调制?Y内调制?Y下载波形数据下载载波数据下载调制波数据设置调制参数N下载载波数据打开采集通道设置频率及相位参数设置幅度及直流偏置选择滤波器发出启动输出命令结束

图5.6 任意波形发生器的数据发送流程图

第六章 系统性能测试

73

第六章 系统性能测试

在系统软硬件调试完成以后,根据设计指标对系统的性能进行了测试。 测试仪器:HH1713双路直流稳压电源,泰克TDS1002数字存储示波器,数字万用表。其中TDS1002为双通道数字存储示波器,带宽60MHz,2GS/s采样率。本设计最高输出频率为50MHz,因此TDS1002完全能满足要求。

图6.1是基于FPGA的任意波形发生器硬件平台实物图:

图6.1 任意波形发生器硬件平台

下面结合实验数据分析任意波形发生器输出信号的指标: (1)频率分辨率

在实现DDS时,我们设计的相位累加器位数为32位,系统参考时钟为200MHz,在理论上能达到的频率分辨率为46.57mHz,实测频率分辨率能达到47mHz;

(2)输出频率范围

采用200MHz参考时钟的DDS频率合成器工程上能输出的最高频率为80MHz,但是为了使输出波形具有良好的形状,本文将任意波形发生器的最高输出频率设置在了50MHz,即一个周期至少用四个点来恢复原始信号。测试表明,本文设计的任意波形发生器在输出50MHz正弦信号时仍能保持比较好的波形形状,而最低输出频率能达到47mHz;输出5MHz三角波频率仍能维持良好的波形形状,但是对于方波,输出频率到1MHz时已经出现了明显的过冲现象。

(3)频率准确度

频率准确度的测量是根据波形发生器的设定频率fo,实测频率fx,根据公式:

74

基于FPGA的任意波形发生器的设计与实现

a?fo?fx 式(6-1) fo计算得到的。具体数据如表6.1所示。

表6.1 频率准确度测量数据

设定频率(Hz) 实测频率(Hz) 频率准确度 503.500 503.000 -0.10% 6.600K 6.603K 0.04% 23.500K 23.512K 0.05% 484.100K 483.90K -0.04% 7.700M 7.704M 0.05% 33.600M 33.570M -0.08% 从表6.1的测试数据来看,基本上满足频率准确度≤±0.1%的指标。 (4)负载能力

测试方法:在波形发生器的输出端接上50Ω的负载电阻,观察输出信号的幅度是否出现较大变化。设置空载时输出信号峰峰值为5.40V,接上50Ω负载时输出信号峰峰值仍有5.4V,无变化,满足设计要求。

(5)输出信号幅度

由于放大电路的运算放大器采用?5供电电压,因此波形发生器的输出电压范围在-3V~+3V之间,经过测试满足要求。

(6)直流偏置

经过测试,直流偏至在-1.4V~1.4V之间以约30mV为步进可调。 (7)波形产生能力

以下所有实验结果均取自泰克数字存储示波器TDS1002的显示界面。

图6.2 10KHz正弦波 图6.3 50MHz正弦波

图6.4 50KHz占空比为50%的方波 图6.5 50KHz占空比为30%的方波