基于FPGA的DDS设计(原创)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
初始频率设置为7.3682307MHz,系统频率为100MHz,根据DDS输出频率公式能计算出相位累加字:
其中f为DDS输出频率;
fclk为DDS系统频率;
N为相位累加器的位数;
DATA为相位累加器的累加值。
要得到7.3682307MHz的输出频率,相位累加值
DATA=(100101101110011010111111110101101101111011100)2
FPGA采用Xilinx Spartan3E XC3S500E,IP核+VerilogHDL+Sch编程。下图为整个FPGA的原理框图:
DCM_100MHz
其中DCM_100MHz用了Spartan3E里面的DCM(时钟管理单元),由于输入的时钟为有正负的正弦波(100MHz 幅值5V 峰峰10V的正弦信号),所以经过DCM后,能得到一个很好的方波。输出100MHz给DA作为DA的时钟,其中还经过一个BUFG,目的是使ROM的正弦数据输出稳定后,时钟才到来,DA才能读入数字值,这可以参考AD9744的Datasheet
其中ts至少为2.0ns,如果少于2.0ns或时钟和DA数据同时甚至提前到达的话,DA输出的模拟值会出错。所以要加一个BUFG,但BUFG延时不太确定,.....(方面的我还不懂L)
MCU_FPGA
51单片机通过串口接受PC机给出的DATA(相位累加值),再通过与FPGA的通信,告诉FPGA相位累加模块(Accumulator)累加值。MCU_FPGA所做的工作是把收到的数据出入模块内的ROM里,使得改变模块里的ROM地址,就能改变输出的累加值。FPGA_MCU通信的时序为:
DIN:48位累加值串行输入
CLK_WR:输入写信号时钟,DIN的数据稳定后,CLK_WR上升沿写入FPGA内部的寄存器,寄存器的数据移位。
DIN_PRO:写保护,DIN_PRO=0时,模块内ROM的输出随地址变化而变化;DIN_PRO=1,模块内ROM的输出锁存,输出保持DIN_PRO=0时ROM地址所对应的ROM值。
WR:写信号,WR=1时,把FPGA内部寄存器的值写入此时ADDRESS[2:0]地址的ROM空间。
ADDRESS:ROM地址位,3根地址线决定ROM深度为8。ROM的大小为248x8 bit。
Accumulator
48位相位累加器。
Wire48_14
截取相位累加器的高14位作为存储正弦波数据的ROM的地址。
ROM
存取一个周期的正弦波数据,而这个正弦波数据应该是有水平移位的,最低点(270°)为0,最高点(90°)为1,直流偏移0.5。所要得到的数据有LabView编程得到。
DDS输出结果
没加滤波器
设计的输出频率为7.3682307MHz,但是示波器显示为7.599MHz,示波器显示的频率是不准确的,实际可以用频谱仪看输出的频率。
放大来看,可以看到正弦波是由一个台阶一个台阶组成的,这就是DA的模拟输出。
加低通滤波器
自己也设计了低通的椭圆滤波器,但实际焊接出来的椭圆滤波器达不到仿真效果,设计截止频率为10MHz,但实际在1~2MHz时幅值衰减就很大(大约1半),到5MHz时,就完全截止了,所以最后还是放弃自己设计的低通椭圆滤波器,选用商用的低通滤波器(minicircuits 公司SLP-10.7+)。
SLP-10.7+ DataSheet
SLP-10.7插入损耗与频率的关系 SLP-10.7回波损耗与频率的关系
在想要的频率(7.3682307MHz)上插入损耗越小越好,回波损耗越大越好,而在杂散或谐波频率(主要为14MHz这个2倍谐波)上则相反,目的是要把杂散和谐波分量都滤除。SLP-10.7截止频率为11MHz,对于我要的输出频率7.3682307MHz有很好的滤波效果。
下面是加上SLP-10.7低通滤波器后,示波器的输出。
可以看到台阶没有了,正弦波变得比较光滑,这是因为高阶的谐波分量都被滤除了J
文章评论(0条评论)
登录后参与讨论