0

FPGA实现基于LUT(查找表)的DDS的设计(含matlab和verilog源码)

基于LUT的DDS的设计
DDS(Direct Digital Synthesis)直接数字频率合成技术由USA J.Tierncy首先提出。它是一种以数字信号处理理论为基础,从相位概念出发直接合成所需波形的一种新的全数字技术的频率合成方法。DDS主要出现在数字混频系统中。在数字混频中,通过DDS产生正交的本地振荡信号即正、余弦信号与输入信号相乘实现频谱搬移,如通信系统的调制、解调。目前FPGA实现DDS有三种途径:基于IIR滤波器的实现方法、基于查找表LUT的实现方法以及基于CORDIC算法的实现方法。其中采用LUT的方法较为通用且比较容易实现。

1 基于LUT的DDS理论

一个典型的基于LUT的DDS系统由相位累加器和波形存储器两部分构成,如图1所示。图中相位累加器的位宽为nbit,步进值为μ,LUT的深度N为2n,宽度为Lbit。LUT中依相位顺序存储一个周期的波形数据。

图1 基于LUT的DDS架构.png
图1 基于LUT的DDS架构

2 matlab 仿真

图2 相位累加器位宽为4bit时LUT地址与存储数据的对应关系.png
图2 相位累加器位宽为4bit时LUT地址与存储数据的对应关系
如图2所示,我们要制作地址位宽为10bit数据位宽为32bit的LUT查找表。Matlab源码如下:

clear all
close all
clc

FS = 44100;%采样率
fc = 1000;
N  = 1024;%1024点一个正玄周期

t =0:2*pi/(N-1):2*pi;

sin_dds = sin(t);

figure,
hold on
plot(t,sin_dds,'*');
legend('sin');
grid;
hold off

图3 matlab 1024点1个周期的正弦波.png
图3 matlab 1024点1个周期的正玄波

3 FPGA仿真

整个仿真结构如图1所示,由相位累加控制器和sin波形存储器组成。仿真生成采样率为44.1KHZ @1KHZ正玄波和余弦波(相位相差90度)。

tb_dds源码:

`timescale 1ns / 1ps  
`define NULL 0  
module tb_dds();  

   parameter KHZ1 =44;  
   parameter KHZ2 =22;  
   parameter KHZ4 =11;  
   reg clk;   
   initial begin   
  clk = 0;   
  #313333 clk = 0;   
  forever #11.072 clk = ~clk;   
end//45.1584MHZ  

reg reset_n;   
initial begin   
  reset_n = 1;   
  #10000 reset_n = 0;   
  #100000 reset_n = 1;   
end   

reg [9:0] addr;  
reg [9:0] cnt;  
reg [31:0] k;  
integer fb;  

wire signed [31:0]     sin;  
wire signed [31:0]     cos;  

//Phase accumulation controller  
always @(posedge clk or negedge reset_n) begin  
  if(!reset_n) begin  
      addr <= 0;  
      cnt  <= 0;  
    end  
  else if(cnt == KHZ1-1) begin  
    cnt <= 0;  
    addr <= addr +10'd1;  
  end  
  else begin  
    cnt <= cnt + 1;  
    addr <= addr;  
  end  
end  

//reg [8:0] i;//88.2khz  
reg [9:0] i;//44.1khz Sample rate  
reg signed [31:0] sin_slow;  
reg signed [31:0] cos_slow;  

always @(posedge clk or negedge reset_n) begin  
  if(!reset_n) begin  
    i <= 0;  
    sin_slow <= 0;  
    cos_slow <= 0;  
    k <=0;  
    fb = $fopen("sin.dat","w");  
    if(fb == `NULL) begin  
      $display("Can not open sin.dat");  
      $finish;  
    end   
  end  
  else begin  
    i <= i+1;  
    if(i == 0) begin  
      sin_slow <= sin;  
      cos_slow <= cos;  
      k <= k +1;  
      $display("time=[%d],%d",$realtime,sin);  
      $fwrite(fb,"%d\n",sin);  
      if(k == 4096) begin   
        $fclose(fb);  
        $stop;  
    end  
    end  
  end   
end   



dds_rom U_dds_rom(   
       .clk(clk),  
       .addr(addr),//0-1023 1T  
       .sin(sin),  
       .cos(cos)  
       );  
endmodule

仿真结果:
生成Sample rate 44.1KHZ@1KHZ的正玄和余弦波相位相差90°。
图4 modelsim 仿真结果.png
图4 modelsim 仿真结果

4 Matlab FFT分析:

图5 FFT分析结果.png

图5 FFT分析结果
由图5可知产生的正玄波频率为1KHZ。基于LUT的DDS设计完成,此节将是后期基于FPGA数字信号处理的基础和关键。

完整源码见下面第一个回答

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名

想向站长提问,微信扫码立刻加入! shawn的FPGA圈.png
1
  答案登陆可见 做站不容易,小伙伴支持一下我们吧!
编辑 标为违禁 删除 链接 更多选项...
inner 头像

评论

为什么我将频率控制字改小后输出信号的频率却变大了

233333 头像233333 ( 2020-05-26 20:21:46 +0800 )编辑
0

新人报到,无名留帖!

编辑 标为违禁 删除 链接 更多选项...
Cryingcat 头像
登录/注册后进行回答