目录

  • 原理
  • 实现

原理

dds信号发生器:以rom为核心,外围控制输出地址,达到输出不同频率和相位或者幅度的结构。(这里不考虑ad转换和滤波)
这里以正弦信号为例,用专用软件或者matlab生成一组正弦信号值的文件,这里使用quartus自带的ip核,将文件读入rom。
剩下的就是控制输出地址来达到改变频率、相位和幅度的目的。

实现

这里分为3个模块
一个模块实现按键消抖
一个模块实现dds具体功能
一个模块为rom例化

按键消抖模块
使用2个按键,模块消抖后输出高电平有效

module key_debounce #(parameter KEY_W = 2,TIME_20MS = 1000_000)(input                  clk     ,input                  rst_n   ,input      [KEY_W-1:0] key_in  ,output reg [KEY_W-1:0] key_out  //检测到按下,输出一个周期的高脉冲,其他时刻为0
);//信号定义reg     [19:0]      cnt     ;wire               add_cnt ;wire               end_cnt ;reg                    add_flag;reg        [KEY_W-1:0] key_r0  ;//同步按键输入reg        [KEY_W-1:0] key_r1  ;//打拍wire   [KEY_W-1:0] nedge   ;//检测下降沿//计数器  检测到下降沿的时候,开启计数器延时20msalways @(posedge clk or negedge rst_n)begin if(!rst_n)begin cnt <= 0;endelse if(add_cnt)begin if(end_cnt)cnt <= 0;else cnt <= cnt + 1;end          end assign add_cnt = add_flag;assign end_cnt = add_cnt && cnt == TIME_20MS-1;//检测到下降沿的时候,拉高计数器计数使能信号,延时结束时,再拉低使能信号always @(posedge clk or negedge rst_n)begin if(!rst_n)begin add_flag <= 1'b0;end else if(nedge)begin add_flag <= 1'b1;end else if(end_cnt)begin add_flag <= 1'b0;end end //同步按键输入,并打一拍,以检测下降沿always @(posedge clk or negedge rst_n)begin if(!rst_n)begin key_r0 <= {KEY_W{1'b1}};key_r1 <= {KEY_W{1'b1}};end else begin key_r0 <= key_in;//同步key_r1 <= key_r0;//打拍end endassign nedge = ~key_r0 & key_r1;//延时20ms结束的时钟周期,输出按键的状态,若按下输出一个周期的高脉冲,否则输出0always@(posedge clk or negedge rst_n)begin if(~rst_n)begin key_out <= 0;end else begin key_out <= end_cnt?~key_r1:0;end end endmodule 

dds模块

这里输入一个设置按钮和设置完成按钮
按下设置按钮,临时频率步长寄存器加1,
按下设置完成按钮,将频率步长加上临时频率步长寄存器的值
最后一个always块一直将频率赋值给相位控制器(实际上就是rom地址)

module dds(input             clk     ,input          rst_n   ,input           freq_set,input           set_done,output [9:0]    addr
);
//信号定义
reg [7:0] freq_tmp;//频率控制字
reg [7:0] freq;reg [9:0] phas_add ;//相位累加器//频率控制字变化
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginfreq_tmp <= 8'd0;endelse if(freq_set == 1'b1)beginfreq_tmp <= freq_tmp + 1'd1;endelse if(set_done)beginfreq_tmp <= 8'd1;end
endalways@(posedge clk or negedge rst_n)beginif(!rst_n)beginfreq <= 1'b1;endelse if(set_done)beginfreq <= freq + freq_tmp;end
endalways@(posedge clk or negedge rst_n)beginif(!rst_n)beginphas_add <= 1'b0;endelse beginphas_add <= phas_add + freq;end
end
assign addr = phas_add;
endmodule

顶层

module dds_top(input             clk         ,input          rst_n       ,input  [1:0]   key_in      ,output     [7:0]   dout
);wire [1:0] key_out;
//参数定义
key_debounce #(.KEY_W(2)) u_key(.clk        (clk        ),.rst_n        (rst_n      ),.key_in   (key_in     ),.key_out  (key_out    ) //检测到按下,输出一个周期的高脉冲,其他时刻为0
);
wire [9:0] addr;
dds u_dds(.clk      (clk        ),.rst_n        (rst_n      ),.freq_set (key_out[0] ),//频率控制字.set_done  (key_out[1] ),.addr     (addr       )
);rom1  rom1_inst (.address     ( addr  ),.clock        ( clk   ),.q            ( dout  ));endmodule

signal tap调试

总结:原理不难,就是实现的时候思路不容易清晰,这里只实现了频率的改变,还可以实现相位的改变,如在dds模块中加一个相位寄存器就行,加一个相位按钮,按下相位就加90度,其实就是加整个正弦数据地址的1/4,我这里是1024长度,就可以设置为256,幅度的话,可以将rom输出的值直接改变。更复杂的话,我就不知道了。

dds信号发生器 fpga实现相关推荐

  1. 基于FPGA的简易DDS信号发生器的设计与验证

    基于FPGA的简易DDS信号发生器的设计与验证 一,理论介绍 补充:举例理解 二,代码实现 1,实验目标 2,MATLAB代码 3,verilog代码及实现思路 一,理论介绍 DDS 是直接数字式频率 ...

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

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

  3. 基于FPGA的DDS信号发生器

    基于FPGA的DDS信号发生器     两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...

  4. 基于FPGA的简易DDS信号发生器的设计(一)

    写这篇文章的本意不是为了探讨AD9767怎么使用,因为9767的控制实在是太简单了,准备好数据直接输出即可,和网上大多数的并行DA输出基本上一模一样,更麻烦的反而是硬件方面.发文的原因是最近一位很细心 ...

  5. 国产紫光FPGA实现DDS信号发生器

    前言 随着信息技术的迅速发展,FPGA作为半定制电路具有可重复编程.计算能力强等优势,进入人们的视野,并在未来将发挥出越来越重要的作用. 作为电子专业的大三学生,我们小组在老师的带领下对现有国产FPG ...

  6. FPGA之简易DDS信号发生器设计

    文章目录 前言 一.DDS信号发生器 1.DDS是什么 2.DDS工作原理 二.模块代码 1.调用rom模块储存波形图 2.按键控制模块 2.按键消抖模块 3.DDS生成模块 4.顶层模块 5.RTL ...

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

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

  8. 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)

    简介 本文主要根据利用紫光同创软件联合ModelSim对DDS信号发生器进行仿真.前序步骤(DDS实现过程)见 国产紫光FPGA实现DDS信号发生器_窃听龙吟的博客-CSDN博客 该博客. 一.创建仿 ...

  9. 【FPGA实例】基于FPGA的DDS信号发生器设计

    原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...

最新文章

  1. Fedora 31 没被砍掉,或将在2020年11月底发布
  2. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
  3. python项目飞机大战
  4. 三十九、Vue项目上手 | 用户管理系统 实现添加用户功能(中篇)
  5. P4332 [SHOI2014]三叉神经树(LCT)
  6. 谁知道这个代码片段干嘛的
  7. CLR线程概览(一)
  8. o型圈沟槽设计软件_265 电机壳体上轴承室和轴承外圈增加的O型圈工艺对轴承外圈(防蠕动)作用有多大?...
  9. pc控制iphone的软件_嗑技热点 | 苹果M1芯片:对PC行业的降维打击
  10. 生命的书写,梦想的呈现
  11. Android 高仿微信支付密码输入控件
  12. 修改表字段长度的操作,对业务是否有影响?
  13. apk 反编译工具及使用
  14. NXP MPC574X eTimer
  15. 差别-request.getParameterValues与request.getParameter
  16. 弄清楚这个三角关系,工作效率提高50%
  17. [IOS] Storyboard全解析-第二部分
  18. mysqladmin的用法简介
  19. 使用ajax发送数组请求,Ajax请求传递数组参数
  20. 对话蔡报永:看Commvault 如何玩转数据管理

热门文章

  1. 山东大学计算机考研资料汇总
  2. 2022年多益网络秋招笔试
  3. HDU 2520 JAVA
  4. Java解决主从数据库延迟问题_MySQL主从数据库同步延迟问题解决
  5. 访学案例|经济学老师加急英签如期出国
  6. Java内存溢出(OOM)分析
  7. Photoshop 去掉图片上的文字的几个方法
  8. 车辆遇险有eCall,eCall是什么?
  9. 动态二进制插桩原理与实战
  10. 如果经验有用 读书干嘛