DDS设计

文章目录

  • DDS设计
    • RTL设计
      • DDS核心代码
      • RTL视图验证
      • 波形仿真验证
      • 问题总结
        • CLK频率、频率字与输出波形的频率
        • 补码与DAC,仿真工具的数据类型
        • 波表ROM的Verilog代码生成
        • ROM参数调节
        • 输出波形
    • 开发板测试
      • SignalTap采样测试
      • matlab频谱分析
        • 采样数据的保存
        • 频谱分析

RTL设计

DDS核心代码

module dds_core_sin(CLK   ,   // clock, posedge validRST   ,   // reset, high level resetFWEN  ,   // frequency word update enable, high level enableFWIN  ,   // input frequency wordCLKOUT,   // output clockSINOUT);  // sine signal output, 2's complement formatinput           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 bitreg   [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 wirealways @ (posedge CLK or posedge RST) beginif(RST) beginfwin_R   <= 0;acc_R    <= 0;addr_R   <= 0;sinout_R <= 0;endelse begin// update fwin_R DFFif(FWEN)fwin_R <= #1 FWIN;elsefwin_R <= #1 fwin_R;// update acc_Racc_R <= #1 fwin_R + acc_R;// update addr_R, the acc_R high RA_WL is rom addressaddr_R <= acc_R[FW_WL-1:FW_WL-1-(RA_WL-1)];     // update output DFFsinout_R <= #1 romout_W;end
endDDS_CORE_ROM u_sinrom(.CLK    (CLK      ),  // clock.RA     (addr_R   ),  // read address.RD     (romout_W )); // read dataassign SINOUT = sinout_R;
assign CLKOUT = CLK;endmodule // module dds_core

本设计加入了额外的D触发器流水线以减小ROM的I/O延迟带来的影响。

#表延迟。

#1 a=1;延迟一个时间单位后执行a=1;语句。

RTL视图验证

如图,代码中的#1被编译成D触发器,在电路结构中即为流水线结构。

波形仿真验证

输出为正弦波采样点序列,近似正弦波。

波形渣是因为流水线的输出不同时导致的,即之前的实验中分析过的不同通道输出不同步产生的毛刺。在仿真这里只要看一下大致的波形就可以了,实际还要看SignalTap采集的信号或者示波器显示。

问题总结

CLK频率、频率字与输出波形的频率

如何根据CLK频率和输入的频率字来设定输出波形的频率?

设输出正弦波频率为f1f_1f1​,电路系统时钟为 fsys=50f_{sys}=50fsys​=50MHz, 计数器步进增量为 CNT,计数器位宽为n。

由上文可以得知:ROM中128个存储空间存储着sin的一个周期128个采样点的值。计数最大值为2n2^n2n,遍历一遍会输出2nCNT\frac{2^n}{CNT}CNT2n​个点,需要2nCNT\frac{2^n}{CNT}CNT2n​个时钟周期,生成信号的一个周期对应2nCNT\frac{2^n}{CNT}CNT2n​个时钟信号周期,所以生成的信号频率就是clk时钟频率的2nCNT\frac{2^n}{CNT}CNT2n​分之一。即:
f1=fsys×CNT2nf_1=f_{sys}\times\frac{CNT}{2^n} f1​=fsys​×2nCNT​
当取CNT为1时,可得最低的输出波形频率为:
f1max=fsys2nf_{1_{max}}=\frac{f_{sys}}{2^n} f1max​​=2nfsys​​
如果需要更低的频率,那么可以提高计数器位宽n并对数据进行截断,取高位送入ROM。这样就可以提高n,从而降低输出波形的频率。

补码与DAC,仿真工具的数据类型

补码格式能够直接送给DAC吗?

有符号数的补码要将最高位取反后送入DAC。有符号数的补码正数符号位为0,负数符号位为1。其他位正数为2进制,负数为2进制取反加1。将最高位取反之后正好是从小到大映射到无符号数范围内,即可实现生成无符号数的正弦波。如图,这里代表的仅仅是电平的相对值,实际输出还要看DAC芯片是否有直流偏置、基准电压等。

仿真工具里在数据类型中有多种选项,可以根据需要选择自己想要查看的数据类型。

波表ROM的Verilog代码生成

波表ROM的Verilog代码太长了,如何快速完成ROM的代码?

可以使用matlab或其他编程工具编程输出。

ROM参数调节

如何调节ROM的空间地址容量和数据字长?调节这些参数有什么意义和代价?

调节地址容量:更改RA_WL,RA_WL为ROM地址数据长度。降低地址容量会使能生成的最低频率升高,但ROM所需的存储空间也变少。增加地址容量可以生成更低频率的信号。但增加地址容量如果超过了目前ROM的存储范围,就需要扩充ROM的存储值,就需要更长的代码和更多的存储空间。

调节数据字长:更改RD_WL,RD_WL为ROM输出数据长度。增加字长则会提高精度,但需要更多的端口,如果字长超过了目前ROM的存储字长则需要提高ROM存储值的精度,同时也要求更多的存储空间。缩短字长会降低精度,但也减少了对端口的使用量。

输出波形

如何评价输出波形的质量?

可以通过示波器进行观察,也可以通过matlab进行波形频谱的分析。频谱分析在下面将会继续展开说明。

开发板测试

SignalTap采样测试

使用按键来控制频率字的改变。

设定频率的UP和DOWN按键,让DDS轮流输出1MHz,2MHz,…10MHz的时域波形。

使用Quartus的Signal TAP 观察DDS的输出波形,注意要调节Signal TAP的观察格式为“有符号数的曲线”模式。

频率为1MHz时:

频率为6MHz时:

频率10MHz时:

三个曲线虽然都有不同程度的失真,但都是对应所要生成的频率分量幅度最高,经过DAC和滤波滤去其他分量之后生成的模拟信号效果就会很好了。下面是频谱幅度分析。

matlab频谱分析

采样数据的保存

首先导出 Signal TAP 的捕获数据至电脑,生成List文件。

右键采集到的数据,选择Create SignalTap II List File,导出数据文件。

复制采样点数据。新建Excel,粘贴,上方选择数据栏,然后选择分列,并选择固定宽度分列。

选择采样点的十进制数据,复制数据保存并到matlab里进行频谱分析。

频谱分析函数属matlab编程,不再赘述。

频谱分析

频谱分析结果如图:

可见:在每个图中,所要生成的频率分量幅度都是最高的。其他频率分量都有至少50dB的衰减,信号底噪在-100dB左右。鉴于我在数字信号处理课程中学习设计的滤波器阻带衰减均在四五十dB左右,所以这个频谱纯度还可以吧。

[FPGA]DDS电路设计相关推荐

  1. FPGA—DDS信号发生器笔记

    使用软件: Vivado DDS信号发生器 基本原理 DDS基本原理 DDS模块 ROM IP的使用 波形数据存储器 代码及仿真 verilog代码 仿真代码(Fword有值,Pword=0时) 仿真 ...

  2. 【Xilinx DDS】Vivado代码实现FPGA DDS

    目录 实验目的 一.调用ROM IP核 二.生成顶层模块 三.仿真文件的编写 四.进行仿真验证 实验目的 本实验工程目的是实现输出数据位宽为16的正弦波形. 一.调用ROM IP核 打开vivado, ...

  3. 学java 开发会掉头_作为一个全新的开发人员,我会学到什么

    学java 开发会掉头 重点 (Top highlight) It's been five years since I learned to code and changed careers. 自从我 ...

  4. CASE_05 基于FPGA的DDS信号发生器

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 DDS原理与方案 2.1 方案一:基于CORD ...

  5. CASE_04 基于FPGA的电梯控制器

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2. 电梯控制器简介 2.1 电梯控制器的设计框图 ...

  6. CASE_02 基于FPGA的数字钟万年历

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 数字钟计数方案 2.1 计数方案一 2.2 计 ...

  7. CASE_01 基于FPGA的交通灯控制器

        该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 案例引导 1.1 硬件设计初窥 1.2 逻辑设计初窥 2 模块级逻 ...

  8. fpga供电电压偏低会怎样_[走近FPGA]之开发板介绍篇

    开发板概述 在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示.它使用的FPGA芯片型号为Xilinx Artix-7 XC7A ...

  9. 低调,中国的FPGA到底有多强?!

    来源:芯三板 前言:如果说,还有一种元器件贸易职业是有危险性的,那就是从事禁运芯片贸易:如果说这种禁运芯片里什么产品最昂贵,那一定是宇航级抗辐射FPGA.据公开资料,被美国FBI盯上和列入黑名单,并被 ...

最新文章

  1. 《笑傲网湖》第五回 状态检测防火墙
  2. 去IOE:去掉“IE”就Ok?
  3. 利用Simple-RTMP-Server搭建RTMP和HLS直播服务(上)
  4. 元类(metaclass)
  5. 信息学奥赛C++语言:社会实践任务
  6. Hibernate 注解 没有加@Column一样会在数据库创建这些字段
  7. fw313r虚拟服务器,迅捷FW313R无线wifi怎么设置上网 - falogincn登录页面
  8. flash位图技术研究篇(3):移动缓冲区域
  9. 【学习笔记】深入理解js原型和闭包(15)——闭包
  10. 世界上没有一模一样的东西_免费是世界上最昂贵的东西
  11. Flash MX 2004 编程(AS2.0)教程(五)
  12. Js 摄氏度和华氏度的转换
  13. vue 使用swper组件
  14. luogu2791 幼儿园篮球题 第二类斯大林数(特)卡常NTT
  15. 天津出差系列(七)----第七天
  16. 个人学习宋红康老师java入门记录的笔记,严禁商用.
  17. MP地面站二次开发教程(五)简易地面站多机控制系统框架
  18. 接口调用-【1】顺丰运单查询
  19. 行列式、逆矩阵、列空间和零空间(3Blue1Brown学习笔记)
  20. 负数modulo运算_Java Modulo Operator-Java中的Modulus运算符

热门文章

  1. 微服务 - 搭建Consul集群服务,Consul配置中心
  2. ITIL在数据中心运维中的应用
  3. 严肃科普:12306能扛得住明星并发出轨级的流量吗?
  4. win10设置一些exe软件的开机自启动
  5. js小技巧 转 js基础嘘唏
  6. 流体分离技术:乌兰察布市卷式MBR超滤膜设备特点
  7. java毕业设计网络办公系统mybatis+源码+调试部署+系统+数据库+lw
  8. 【重量级】揭秘移动网络的性能(在)--移动网络组件具体解释
  9. Python爬取NBA每日比赛比分
  10. 汽车行业PPM统计乱象