基于FPGA的DDS设计说明.docx
《基于FPGA的DDS设计说明.docx》由会员分享,可在线阅读,更多相关《基于FPGA的DDS设计说明.docx(13页珍藏版)》请在冰豆网上搜索。
![基于FPGA的DDS设计说明.docx](https://file1.bdocx.com/fileroot1/2023-1/2/63153035-73d7-4fb1-9ee6-d4356f8a31e1/63153035-73d7-4fb1-9ee6-d4356f8a31e11.gif)
基于FPGA的DDS设计说明
一、实验名称:
基于FPGA的DDS信号源设计
二、技术规范:
1.实验目标:
设计一个直接数字频率合成(DDS,DirectDigitalSynthesis),DDS是一种新型的频率合成技术。
DDS技术是一种把一系列数字形式的信号通过DAC转换成模拟信号的合成技术。
DDS技术具有频率切换时间短,频率分辨率高,频率稳定度高,输出信号的频率和相位可以快速切换,输出相位可连续,并且在改变时能够保持相位的连续,很容易实现频率、相位和幅度的数字控制。
它在相对带宽、频率转换时间、相位连续性、高分辨率以及集成化等一系列性能指标方面远远超过了传统频率合成技术。
因此在现代电子系统及设备的频率源设计中,尤其在通信领域,直接数字频率合成器的应用越来越广泛。
2.实现功能:
本实验最后将设计出一个具有频率控制和相位移控制功能的DDS。
3.引脚:
本实验有三个输入端口,8位的频率控制字端口,分别接8个开关按键,8位的相位控制字端口,分别接另外的8个开关按键,系统时钟输入端口;一个8位输出端口,接D/A的输入端口。
FPGA板上的时钟频率为50MHz,本实验将其10分频后得到5MHz再使用。
三.总体设计方案;
1.DDS原理:
实验采用目前使用最广泛的一种DDS方式是利用高速存储器作查找表,然后通过高速DAC输出已经用数字形式存储的波形。
图1:
DDS系统的基本原理图
图1中虚方框部分是DDS的核心单元,它可以采用CPLD/FPGA来实现。
图中的相位累加器由N位全加器和N位累加寄存器级联而成,可对频率控制字的二进制码进行累加运算,是典型的反馈电路。
频率控制字M和相位控制字分别控制DDS输出正(余)弦波的频率和相位。
每来一个时钟脉冲,相位寄存器以步长M递增。
相位寄存器的输出与相位控制字相加,其结果作为正(余)弦查找表的地址。
正(余)弦查找表的数据存放在ROM中,内部存有一个周期的正弦波信号的数字幅度信息,每个查找表的地址对应于正弦波中0°~360°范围内的一个相位点。
查找表把输入的址信息映射成正(余)弦波的数字幅度信号,同时输出到数模转换器DAC的输入端,DAC输出的模拟信号经过低通滤波器(LPF),可得到一个频谱纯净的正(余)弦波。
DDS具体工作过程如下:
每来一个时钟脉冲clk,N位全加器将频率控制数据M与累加寄存器输出的累加相位数据N相加,把相加后的结果送至累加寄存器的输入端。
累加寄存器一方面将上一时钟周期作用后所产生的新的数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据M相加;另一方面将这个值作为取样地址值送入幅度/相位转换电路,此电路根据取样地址输出相应的波形数据。
最后经D/A转换器和低通滤波器将波形数据转换成所需要的模拟波形。
DDS输出信号的频率由下式决定:
q=(
)×clk(
代表取样点数,M为频率控制字、
代表存储器中存储数据的多少,N代表累加器的位数,clk代表基准时钟频率)。
调节M可以改变取样的点数,从而改变频率。
假定基准时钟为70MHz,累加器为16位,则clk=70MHz,Y=
=65536(N=16),设M=12则X=
=4096,所以q=(4096/65536)×70=4.375MHz。
可见,通过设定相位累加器位数N、频率控制字M和基准时钟的值,就可以产生任一频率的输出。
DDS的频率分辨率定义为:
q=clk/
由于基准时钟一般是固定的,因此相位累加器的位数就决定了频率的分辨率。
2.功能实现:
如果利用AT29C010芯片实验接线图如下:
图2:
DDS试验连线图
顶层模块图:
图3:
DDS顶层设计电路图
3.系统总体框图:
开关单元
ROM
D/A
示波器
相位累加器
图4:
总体框图
4.模块描述及功能实现(这里采用的是自己编的rom,没有用falsh芯片):
①顶层模块:
顶层模块主要用于分频,定义系统的输入和输出端口。
由于实验箱采用系统时钟位50MHz,本实验才有时钟频率为5MHz,所以本模块主要负责将时钟进行10分频。
模块将调用相位累加模块和rom模块。
模块端口有:
系统时钟输入端口(接系统时钟),8位频率控制字输入端口和8位相位控制输入端口(接16个开关按键),8位数据输出端口(接D/A的8位输入端口),复位输入端(接一个按键),分频后的时钟输出(接D/A的时钟输入)。
名称
方向
电平
位宽
功能
clk
input
3.3V
1
系统时钟信号,(50MHZ)
F
input
3.3V
8
频率控制字
reset
input
3.3V
1
复位信号
P
input
3.3V
8
相位控制字
sin_out
output
3.3V
8
正弦波数据
clk_5MHz
output
3.3v
1
分频后的时钟
②相位累加模块:
相位累加主要是利用频率控制字和相位控制字来累加出寻址地址,N=N+M;address=N+P;其中N位累加寄存器,初期为0;M位频率控制字;address为寻址地址。
模块端口有:
时钟输入端口(接顶层模块5MHz时钟),复位输入端口(接顶层模块复位端),8位频率控制字输入端口和8位相位控制输入端口(分别接顶层模块的8位频率控制字输入端口和8位相位控制输入端口),地址输出端口(将地址通过顶层模块传送给rom模块,8位)。
名称
方向
电平
位宽
功能
clk_5MH
Input
3.3V
1
分频后时钟(5MHz)
M
Input
3.3V
8
频率控制字
reset
Input
3.3V
1
复位信号
data_PM
Input
3.3V
8
相位控制字
data_out
Output
3.3V
13
rom的地址
③rom模块:
首先利用MATLAB生成一个.HEX文件,.HEX文件存储的是一个深度为8192,宽度为8的正弦波形数字信号(数据不能超过255)。
代码为:
depth=8192;%存储单元数;
widths=8;%数据宽度为8位;
N=0:
1:
8192;
s=sin(pi*N/125);%计算0~pi/2的Sin值;
fidc=fopen('dds.hex','wt');%以"wt"的形式打开,\n为换行
%写入sinrom.hex%
fprintf(fidc,'depth=%d;\n',depth);
fprintf(fidc,'width=%d;\n',widths);
fprintf(fidc,'address_radix=uns;\n');
fprintf(fidc,'data_radix=uns;\n');
fprintf(fidc,'ContentBegin\n');
for(x=1:
depth)
fprintf(fidc,'%d\n',round(125*sin(pi*(x-1)/4096)+125));
end
fprintf(fidc,'end;');
fclose(fidc);
然后在quartus下利用MATLAB生成的数据编写一个单口rom,并且生成对应的.V文件,即rom模块。
本模块的功能是通过传送过来的地址,查找地址所对应的数据,并将数据输出。
生成的模块端口:
地址输入端口(接相位累加模块传送过来的地址,13位),时钟输入端口(接分频后的5MHz时钟),数据输出端口(8位)。
名称
方向
电平
位宽
功能
clk
input
3.3V
1
分频后时钟(5MHz)
address
input
3.3V
13
寻址地址
q
output
3.3V
8
sin波形数据
实验结果及分析:
板子下载:
将数字输出接到DA转换芯片的8个输入脚,用示波器检测DA的模拟输出信号。
改变频率控制字和相位控制字(由于滤波器原因,改变相位控制字没有实际效果),观察波形的改变。
频率控制字为0
频率控制字为128
理论值:
q=(128/16384)×500k=3.90625kHz(500k为分频后的时钟)
频率控制字为64
理论值:
q=(64/16384)×500k=1.953kHz
频率控制字为32
理论值:
q=(32/16384)×500k=0.977kHz
频率控制字为16
理论值:
q=(16/16384)×500k=0.488kHz
频率控制字为8
理论值:
q=(8/16384)×500k=0.244kHz
频率控制字为4
理论值:
q=(4/16384)×500k=0.122kHz
频率控制字为1
理论值:
q=(1/16384)×500k=0.0305kHz
总结:
效果还不是很好,有点失真。
实际数据与理论有点偏差而且频率大偏差也有所增加,但是频率越高波形效果越好。
由于没有滤波器,毛刺问题没有得到很好的解决。
五.综合布局布线
顶层模块“DDS”:
地址累加器:
ROM:
综合布线:
注:
其实实验最后得到的效果比上面的波形好些,只是当时找不到小容量U盘所以没有把波形存下来。