DDS信号发生器实现(DDS Compiler 6.0)
简单学习总结信号发生器实现原理。
首先放一个DDS信号发生器实现原理框图:
DDS信号发生器实现不同频率正弦信号输出的基本原理,简单总结是:将一个完整的正弦信号时域波形图进行时域幅度值的采样,将采样后的幅度值序列转化为二进制存储在一个ROM表中。(正弦ROM表中存在完整的正弦信号幅值序列,将正弦信号的一个周期按“相位———幅度数值”一一对应。)然后根据频率控制字(相位增量)不断累加产生一系列正弦ROM查找表的访问地址,通过控制ROM的读地址实现系统时钟下,采样输出对应的正弦信号幅值。最后将ROM中读出的幅值数字信号,通过外设D/A转换芯片,转换为模拟波形输出。(ROM表存储本质是完成正弦信号幅度值与频率的映射)。
DDS产生不同频率正弦信号,核心在于相位累加器和正弦ROM查找表。ROM的位宽和深度、系统时钟频率、相位累加器的宽度的参数选择是设计满足要求需要考虑的重要参数。(假设ROM表深度为9,相位累加器宽度为16,只需取地址的高9位作为ROM的输入地址,低位作为累积量。)相位调制器在每次给ROM的地址加上一个固定偏移量(相位控制字),其位宽和ROM的地址位宽相同即可。
了解基本原理后,接下来解决:具体怎样控制ROM的读地址?ROM的读地址和信号频率设置是什么样的映射关系?
1、首先对上述原理中,正弦信号时域采样和ROM数据存储进一步举例说明:
举例:
这里:K取2^7-1,A=2^7;t=[0:1/fs:(N-1)fs];fs是采样频率,fs=2^M;N为采样点数,N=2^M。
对一个完整周期的正弦信号进行2^M次采样,每次采样的幅度值转化为8bit存储在ROM表的一个地址单元中。故选取ROM的地址位宽为M(即ROM总存储深度为2^M),ROM中数据位宽为8(即一个地址单元中存储数据是8位宽的)。
2、频率控制字累加寄存器位宽和ROM表位宽的关系。
假设相位累加寄存器地址位宽N,波形ROM表地址位宽M。如果N=M,则系统时钟T_clk下每经累加器输出一个值,对应一个ROM表地址。若N>M,取N=32,M=12,频率控制字f_word设置为1。在系统时钟每个上升沿,相位累加器地址加1。取相位累加器寄存器的高12位作为ROM表地址,即M[11:0]<=N[31:20],则经2^20个时钟周期后ROM表的地址才进行加1。换句话说是对ROM中同一个地址的数据读取2^20次。故计算输出一个完整的正弦信号,持续周期为2^20*2^12*T_clk。同理若频率控制字f_word不为1,则相位累加器每次增加f_word,输出一个完整正弦信号周期为:(2^20*2^12*T_clk)/f_word。通过公式计算也可看出,频率控制字f_word的大小影响着输出信号频率的取值。
3、频率控制字和相位控制字的输入
频率控制字决定,相位累加器每次累加的大小,经相位累加器输出的数值叠加上一个恒定的相位控制字大小,形成ROM表的读地址。相位控制字的大小决定着正弦信号初始采样的位置(相当于在标准正弦信号的基础上加入初始相位)。
频率控制字计算输出频率公式:fout=(f_word*fclk)/2^N,fout为输出频率,fclk为系统时钟频率,N为相位累加器地址位宽(IP核参数设置时的相位位宽是ROM表的地址位宽M)。
4、本次实验直接调用xilinx官方的DDS Compiler 6.0IP核。xilinx官方提供的DDS Compiler(6.0)IP核,内部集成了相位发生器和SIN/COS查找表(相位到正弦值的转换)组成。编译器核心实现了高性能、优化的相位生成和相位到正弦电路,具有axi4流兼容接口。DDS由这些部件可以单独使用或组合使用。(关于IP核的详细介绍参考官方提供的产品手册PG141)
本次采用SIN COS LUT only模式(IP核提供了一个正弦信号幅值与频率映射ROM表,相当于省略了波形时域采样和ROM存储的过程。采样也可以利用matlab来做,然后生成.coe文件初始化到ROM IP核中去),此模式下,需要在verilog 代码中实现相位寄存器的累加操作。系统时钟为100MHZ(选择该模式下,系统时钟不需要在IP核配置界面中设置,时钟设置以代码中相位累加器的具体采样时钟为标准),phase Width为10(注意,这里设置的是ROM表的地址位宽,利用公式,计算输出频率时需要具体观察系统时钟下,ROM地址的递增情况)。输出位宽设置为16,
因为选择的SIN COS LUT only模式,故相位控制字和频率控制字的设置无需在IP核中进行设置。选择输出波形为sin and cosine模式,此时输出数据为32bit,输出数据的低16位为cos信号,高16位为正弦信号。
实验生成4MHZ的正余弦信号,相位累加器位宽取32,并将其高10位作为地址送入ROM中。频率控制字: freq word = 4MHZ*2^32/100MHZ。部分代码如下:
parameter FREQWORD =32'd171798692 ;// freq word = 4MHZ*2^32/100MHZ
always @(posedge aclk) begin
if(rst_n == 1'b0) begin
phase_add <=32'd0;
end
else begin
phase_add<=phase_add+FREQWORD;
end
end
always @(*) begin
ram_addr <= phase_add[31:22];//M=10,N=32,取N的高10位作为ROM表寻址。
end
assign sin={data[31],data[31:16]};
IP核例化:
dds_compiler_0 U_DDS (
.aclk(aclk), // input wire aclk
.s_axis_phase_tvalid(1'b1), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata({6'd0,ram_addr}), // input wire [15 : 0] s_axis_phase_tdata
.m_axis_data_tvalid(data_valid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(data) // output wire [31 : 0] m_axis_data_tdata
);
5、补充IP核配置界面相关介绍(下述描述和截图均参考的PG141手册)
IP核配置界面如下:
★ Configuration Options选项即DDS的构成,可以选择1、Phase Generator and SIN/COS LUT(DDS) IP核采用内部相位生成器和正弦查找表组合方式,只需要提供相位控制字和相位偏移数值大小即可。2、Phase Generator 3、SIN/COS LUT only模式下,内部IP核构成仅有一个正弦信号查找表,需要外部代码配合实现相位地址不断累加。
★ System Clock系统时钟频率,直接决定分辨率和输出正弦信号频率。(当选择SIN/COS LUT only模式时,系统时钟由外部代码中相位累加的参考时钟决定)
★ Number of Channels,通道数选择,可最多支持16通道的时间多路复用模式。若通道数选N,则每N个周期特定通道上产生一次输出。
★ 模式选择:标准模式下采用相位截断法产生波形。还有一个栅格模式。
★ Parameter Selection两种选择:1,系统参数,该选择产生输出信号频率更精准,需要填写两个参数:频率分辨率(HZ)和SFDR(一般选择输出位宽M*6dB)
- 硬件参数,需要给定相位位宽和输出位宽选择。
- 这里Phase Width的相位是存储正弦幅度采样数据ROM表的位宽M,若相位累加器位宽N>M,需要取N的高M位宽数据作为ROM表输入地址。N和M具体关系参考上述内容。
★ 噪声整形:是否使用相位截断、抖动或泰勒级数矫正。
频率控制字和相位偏移都可以选择固定模式、可编程模式和数据流模式。当两者同时选择数据流模式时,共同占用一个phase数据输入通道。当两者同时选择可编程模式时,共同占用一个config数据输入通道。
输入数据通道设置:
输出数据通道设置:
在DDS中设置“sine and cosine”输出时,sin和cos会共用数据总线,sin使用高字节,cos使用低字节。选定输出字节宽度后,多余位用符号位扩充。
输出字节宽度设置为11时,格式如下:
assign sin_data = {dds_axi_data[26],dds_axi_data[26:16]};
assign cos_data = {dds_axi_data[10],dds_axi_data[10:0]};
文章均是个人日常学习总结,如有理解不正确地方,欢迎指正。
更多推荐
所有评论(0)