基于FPGA的DDS设计

文章目录

目标一、DDS电路核心RTL

1.设计一个DDS的核心RTL代码。

2.使用Matlab生成DDS的波表ROM

3.验证

目标二、DDS开发板测试平台

1.使用Quartus的Signal TAP 观察DDS的输出波形

2.导出 Signal TAP 的捕获数据至电脑(生成List文件)

3.用UltraEdit的列操作模式编辑数据格式。(matlab变量定义)

4.使用Matlab分析DDS生成的正弦信号的频谱纯度。


目标一、DDS电路核心RTL

1.设计一个DDS的核心RTL代码。

///参考代码///
module dds_core_sin(
  CLK   ,   // clock, posedge valid
  RST   ,   // reset, high level reset
  FWEN  ,   // frequency word update enable, high level enable
  FWIN  ,   // input frequency word
  CLKOUT,   // output clock
  SINOUT);  // sine signal output, 2's complement format

input           CLK;
input           RST;
input           FWEN;
input [32-1:0]  FWIN;
output[12-1:0]  SINOUT;
output          CLKOUT;

parameter FW_WL = 32;   // frequency word word length in bit
parameter RA_WL = 10;   // rom address word length in bit
parameter RD_WL = 12;   // rom data  word word length in bit

reg   [FW_WL -1:0]  fwin_R;     // freq word DFF
reg   [FW_WL -1:0]  acc_R;      // phase ACC DFF
reg   [RA_WL -1:0]  addr_R;     // rom address DFF
reg   [RD_WL -1:0]  sinout_R;   // sin wave output DFF
wire  [RD_WL -1:0]  romout_W;   // rom data output wire

always @ (posedge CLK or posedge RST) begin
  if(RST) begin
    fwin_R   <= 0;
    acc_R    <= 0;
    addr_R   <= 0;
    sinout_R <= 0;
  end
  else begin
    // update fwin_R DFF
    if(FWEN)
      fwin_R <= #1 FWIN;
    else
      fwin_R <= #1 fwin_R;
    
    // update acc_R
    acc_R <= #1 fwin_R + acc_R;
    // update addr_R, the acc_R high RA_WL is rom address
    addr_R <= acc_R[FW_WL-1:FW_WL-1-(RA_WL-1)];     

    // update output DFF
    sinout_R <= #1 romout_W;
  end
end

DDS_CORE_ROM u_sinrom(
  .CLK    (CLK      ),  // clock
  .RA     (addr_R   ),  // read address
  .RD     (romout_W )); // read data

assign SINOUT = sinout_R;
assign CLKOUT = CLK;

endmodule // module dds_core

2.使用Matlab生成DDS的波表ROM

%%//参考代码//
function generate_DDS_rom()
clc;
close all;
disp('##########################################');
disp('# generate_DDS_rom() RUN');
disp('##########################################');

%%///
%   set your rom config here
rom_word_len = 12;  % rom data word length in bit
rom_addr_len = 10;  % rom address word length in bit
rom_file_name = 'DDS_CORE_ROM.v';  % rom file name
rom_file_dir  = './';  % rom file dir path
description   = 'DDS CORE ROM FILE' % rom description
%%///

rom_vec_len = 2^rom_addr_len;
index = [0:rom_vec_len-1] .';
rom_data_vec_float = sin(2*pi*index/rom_vec_len);
figure; plot

你可能感兴趣的:(verilog,fpga)