RTL可拓展设计:VerilogHDL实现数据深度与位宽可配置的DDS发生器

RTL可拓展设计:VerilogHDL实现数据深度与位宽可配置的DDS发生器

参考资料

Github仓库地址

使用方法

文件构成

  • trigonometric_function/dds/dds.v:主模块文件
  • trigonometric_function/cos_function/Makefile:用于测试的make脚本文件
  • trigonometric_function/cos_function/testbench.sv:测试激励文件
  • trigonometric_function/cos_function/python/gen_cos_data.py:用于生成余弦函数数据的python脚本

需要注意的是,DDS发生器依赖于COS函数发生器,使用了其ROM资源优化版本。

主模块信号及其参数配置

// trigonometric_function/dds/dds.v
module dds #(
    parameter DEPTH_BITWIDTH = 8,
    parameter DATA_BITWIDTH  = 8
) (
    input clk,
    input rstn,

    input [DEPTH_BITWIDTH-1:0] pword,
    input [DEPTH_BITWIDTH-1:0] fword,

    output [DATA_BITWIDTH-1:0] cos,
    output [DATA_BITWIDTH-1:0] sin
);

以下是参数的相关解释:

参数备注
DEPTH_BITWIDTHDDS发生器地址深度
DATA_BITWIDTH输出的数据位宽

这两个参数实际上与COS函数发生器的参数一致,用于配置地址宽度与数据深度。

以下是信号的定义:

方向位宽信号备注
输入1clk系统时钟信号
输入1rstn同步复位信号,低有效
输入DEPTH_BITWIDTHpwordDDS相位字
输入DEPTH_BITWIDTHfwordDDS频率字
输入DATA_BITWIDTHcos余弦函数输出
输入DATA_BITWIDTHsin正弦函数输出(比cos输出超前∠90°)

信号时序

请添加图片描述

频率字fword就是cos发生器相位在一个时钟周期递增的幅度,相位字pword就是每一个时钟周期cos发生器相位的偏移幅度。

设计原理

很简单的令cos函数发生器相位递增就可以了,如下:

// trigonometric_function/dds/dds.v
module dds #(
    parameter DEPTH_BITWIDTH = 8,
    parameter DATA_BITWIDTH  = 8
) (
    input clk,
    input rstn,

    input [DEPTH_BITWIDTH-1:0] pword,
    input [DEPTH_BITWIDTH-1:0] fword,

    output [DATA_BITWIDTH-1:0] cos,
    output [DATA_BITWIDTH-1:0] sin
);

  reg [DEPTH_BITWIDTH-1:0] cosf_cos_pword;

  cos_function_x1 #(
      .DEPTH_BITWIDTH(DEPTH_BITWIDTH),
      .DATA_BITWIDTH (DATA_BITWIDTH)
  ) cos_function_inst_cos (
      .clk (clk),
      .rstn(rstn),

      .pword(cosf_cos_pword + pword),
      .cos  (cos)
  );

  wire [DEPTH_BITWIDTH-1:0] cosf_sin_pword = cosf_cos_pword + 2 ** (DEPTH_BITWIDTH - 2);
  cos_function_x1 #(
      .DEPTH_BITWIDTH(DEPTH_BITWIDTH),
      .DATA_BITWIDTH (DATA_BITWIDTH)
  ) cos_function_inst_sin (
      .clk (clk),
      .rstn(rstn),

      .pword(cosf_sin_pword + pword),
      .cos  (sin)
  );

  always @(posedge clk) begin
    if (!rstn) begin
      cosf_cos_pword <= {DEPTH_BITWIDTH{1'b0}};
    end else begin
      cosf_cos_pword <= cosf_cos_pword + fword;
    end
  end

endmodule  //dds

补充说明

一般IDE都会有DDS的软IP(紫光同创除外,此处着重提醒),用IDE自带的那个软IP肯定比自己写的好用,这个DDS其实演示意义大于实际意义。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值