1 项目背景 源码下载技术交流群:544453837 暗号:fpga1.1 信号发生器 信号发生器又称信号源或振荡器,是一种能提供各种频率、波形和输出电平电信号的设备,在测量各种电信系统或电信设备的振幅特性、频率特性、传输特性及其它电参数时,以及测量元器件的特性与参数时,用作测试的信号源或激励源,在生产实践和科技领域中有着广泛的应用。 直接数字式频率合成器(DDS)是将先进的数字处理理论与方法引入频率合成的一项新技术,它把一系列数字量形式的信号通过数/模转换器转换成模拟量形式的信号。
上图是一个典型的DDS工程。DDS一般可分为相位累加器、信号转换器和DAC。 DDS的输入是频率控制字,它用来控制相位累加器每次增加的相位值,相当于一个步进值。 相位累加器:每来一个时钟脉冲,就会在原来相位值的基础上,加上频率控制字的值,得到最新的相位值,将相位值将输出给信号转换器。 信号转换器:一般转换器内部有一片ROM,事先保存了要产生波形的幅度值。根据输入的的相位值,就能输出该相位值所对应的信号幅度值。例如将一个完整周期的正弦波等距离分成128份,并保存到转换器的ROM当中。当相位值为0时,就输出相位为0所应对的幅度值;当相位为100时,就输出相位为100所对应的幅度值。 的具体工作过程是由N位相位累加器、N位加法器和N位累加寄存器组成。每来一个时钟脉冲,N位加法器将频率控制字K与N位累加寄存器输出的累加相位数据相加,并把相加后的结果送至累加寄存器的输入端。累加寄存器一方面将上一时钟周期作用后所产生的新的相位数据反馈到加法器的输入端,使加法器在下一时钟的作用下继续与频率控制字K相加;另一方面将这个值作为取样地址送入幅度/相位转换电路,幅度/相位转换电路根据这个地址输出相应的波形数据。最后经D/A转换器和 LPF将波形数据转换成所需要的模拟波形。
1.2 DA转换 明德扬教学板板载双通道、125MHz 转换速率、8bi的高速DA芯片,满足常用信号发生器、滤波信号输出等需求。实际位置如下所示:
芯片型号是AD9709,AD9709是一款双端口、高速、双通道、8位CMOS DAC,其中集成两个高品质8位TxDAC+®内核、一个基准电压源和数字接口电路,采用48引脚小型LQFP封装。它提供出色的交流和直流性能,同时支持最高125 MSPS的更新速率。
与FPGA相连的信号有:DA_CLKA、DA_CLKB、DAC_DB7~0、DAC_DA7~0,DAC_MODE、DAC_SLEEP、DA_WRA和DA_WRB。
1.3 AD9709的时序 AD9709的控制时序如下图
在双通道模式中,通道A和通道B就如两个独立的DA芯片。其中DA_CLKA、DAC_DA7~0、DAC_WR_A用于控制通道A,DA_CLKB、DA_DB7~0、DA_WRB用于控制通道B。 以控制通道A为例,时序图要求,要先将数据输出到DAC_DA7~0,然后经过ts时间后,将DAC_WRA和DA_CLKA变高,此时DAC就将数据锁住,经过一段时间后,就会输出数据所对应的电流,经过电路转换后就变成对应电压了。 时序图中要注意几点(数据手册有详细说明) 1. DA_CLKA并且超前于或者同时与DA_WRA由0变1。 2. 图中tS(DAC_WRA上升沿前数据保持不变的时间)、tH(DAC_WRA上升沿后数据保值不变的时间)、tLPW(DAC_WRA的高电平时间)、tCPW(DAC_CLKA的高电平时间)等参数,查询数据手册,可以得到如下参数表。从表中可以看到tS的时间至少是2ns;tH时间至少是1.5ns;tLPW、tCPW时间至少是3.5ns。图中规定了至少,只要大于要求都是可以的。
通道B的时序要求和通道A是相同的,仅是控制信号不同。 明德扬教学板的AD9709的两个通道,均支持0.48~2.2V的电压输出,这个输出电压与输入数据的关系,可用下面的公式表示: 通道A的输出电压 = -1.72 * (DAC_DA /255) + 2.2 V 通道B的输出电压 = -1.72 * (DAC_DB/255) + 2.2 V
由公式可见,输出电压与DAC_DA/B的值是成线性反比例关系,最低电压为0.48V,最高为2.2V。需要指出的是,由于电路原理图的原因才导致电压在此范围,不同电路实现是不相同的。 2 设计目标 本次案例将使用到采样率大于100M的示波器。将示波器和教学板上的通道1连接,如下图所
本案例是要让DA输出不同频率的正弦波。共输出方式如下: 1. 连续输出2个周期为6.25MHz的正弦波,其中每个正弦波输出16个采样点; 2. 连续输出2个周期为3.125MHz的正弦波,其中每个正弦波输出32个采样点; 3. 连续输出2个周期为1.5625MHz的正弦波,其中每个正弦波输出128个采样点; 4. 连续输出2个周期为781250Hz的正弦波,其中每个正弦波输出128个采样点; 5. 连续输出2个周期为390625Hz的正弦波,其中每个正弦波输出128个采样点; 6. 连续输出2个周期为195312.5Hz的正弦波,其中每个正弦波输出128个采样点。 重复以上的1~7的步骤。 正弦波的最高电压是2.2V,最低电压是0.48V 示波器的显示结果如下图
上图是整体效果图,每种频率的正弦波连续出现2次,并且正弦波的周期越来越大。 下图是捕捉到的,频率为6.25MHz的正弦波,最高电压是2.2V,最低电压是0.48V。 下图是捕捉到的,频率为3.125MHz的正弦波,最高电压是2.2V,最低电压是0.48V。 下图是捕捉到的,频率为1.5625MHz的正弦波,最高电压是2.2V,最低电压是0.48V。 下图是捕捉到的,频率为390625Hz的正弦波,最高电压是2.2V,最低电压是0.48V。 下图是捕捉到的,频率为195312.5Hz的正弦波,最高电压是2.2V,最低电压是0.48V。 3 设计实现3.1 顶层接口 新建目录:D:\mdy_book\dds_da。在该目录中,新建一个名为dds_da.v的文件,并用GVIM打开,开始编写代码。
我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A产生正弦波所对应的电压。为了控制AD9709的通道A,就需要控制AD9709的MODE、SLEEP、CLK1、WRT1、DB7~0P1管脚。根据设计目标的要求,整个工程需要以下信号: 1. 使用clk连接到晶振,表示50M时钟的输入。 2. 使用rst_n连接到按键,表示复位信号。 3. 使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。 4. 使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。 5. 使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。 6. 使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。 7. 使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。 综上所述,我们这个工程需要7个信号,时钟clk,复位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra和dac_da,其中dac_da是8位信号,其他都是1位信号。 下面表格表示了硬件电路图的连接关系。
将module的名称定义为dds_da,代码如下:
其中clk、rst_n是1位的输入信号,dac_da是8位的输出信号,dac_mode,dac_clka,dac_wra,dac_sleep是一位输出信号。
3.2 信号设计 我们先分析下DAC的输出。以频率为195312.5Hz的正弦波为例,如下图。频率为195312.5Hz,也就是一个正弦波的周期是5120ns。案例要求一个周期要输出128个点,那就是每隔5120/128=40ns要输出一个点。考虑到工程输入的时钟是50MHz,周期是20ns,那就意味着每隔2个时钟就要输出一个点。 综上所述,产生频率频率为195312.5Hz的正弦波,就是每隔2个时钟输出一个电压值,一共输出128个点,组成一个正弦波。我们要连续产生2个正弦波。 现在进一步分析下,这128个点所对应电压值是多少?由于教学板的输出电压在0.48~2.2V之间,最低值是0.48V,最高值是2.2V。 先将一个标准的正弦波向上平稳1个单位,使得范围变成0~2。然后等间隔取128个点(间隔为2*pi/128),获取其幅度值。我们再用8位信号sin_data表示这些幅度值,其表示方式为:
|