dds信号发生器 fpga实现
目录
- 原理
- 实现
原理
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实现相关推荐
- 基于FPGA的简易DDS信号发生器的设计与验证
基于FPGA的简易DDS信号发生器的设计与验证 一,理论介绍 补充:举例理解 二,代码实现 1,实验目标 2,MATLAB代码 3,verilog代码及实现思路 一,理论介绍 DDS 是直接数字式频率 ...
- FPGA—DDS信号发生器笔记
使用软件: Vivado DDS信号发生器 基本原理 DDS基本原理 DDS模块 ROM IP的使用 波形数据存储器 代码及仿真 verilog代码 仿真代码(Fword有值,Pword=0时) 仿真 ...
- 基于FPGA的DDS信号发生器
基于FPGA的DDS信号发生器 两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...
- 基于FPGA的简易DDS信号发生器的设计(一)
写这篇文章的本意不是为了探讨AD9767怎么使用,因为9767的控制实在是太简单了,准备好数据直接输出即可,和网上大多数的并行DA输出基本上一模一样,更麻烦的反而是硬件方面.发文的原因是最近一位很细心 ...
- 国产紫光FPGA实现DDS信号发生器
前言 随着信息技术的迅速发展,FPGA作为半定制电路具有可重复编程.计算能力强等优势,进入人们的视野,并在未来将发挥出越来越重要的作用. 作为电子专业的大三学生,我们小组在老师的带领下对现有国产FPG ...
- FPGA之简易DDS信号发生器设计
文章目录 前言 一.DDS信号发生器 1.DDS是什么 2.DDS工作原理 二.模块代码 1.调用rom模块储存波形图 2.按键控制模块 2.按键消抖模块 3.DDS生成模块 4.顶层模块 5.RTL ...
- CASE_05 基于FPGA的DDS信号发生器
该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 DDS原理与方案 2.1 方案一:基于CORD ...
- 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)
简介 本文主要根据利用紫光同创软件联合ModelSim对DDS信号发生器进行仿真.前序步骤(DDS实现过程)见 国产紫光FPGA实现DDS信号发生器_窃听龙吟的博客-CSDN博客 该博客. 一.创建仿 ...
- 【FPGA实例】基于FPGA的DDS信号发生器设计
原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...
最新文章
- Fedora 31 没被砍掉,或将在2020年11月底发布
- MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
- python项目飞机大战
- 三十九、Vue项目上手 | 用户管理系统 实现添加用户功能(中篇)
- P4332 [SHOI2014]三叉神经树(LCT)
- 谁知道这个代码片段干嘛的
- CLR线程概览(一)
- o型圈沟槽设计软件_265 电机壳体上轴承室和轴承外圈增加的O型圈工艺对轴承外圈(防蠕动)作用有多大?...
- pc控制iphone的软件_嗑技热点 | 苹果M1芯片:对PC行业的降维打击
- 生命的书写,梦想的呈现
- Android 高仿微信支付密码输入控件
- 修改表字段长度的操作,对业务是否有影响?
- apk 反编译工具及使用
- NXP MPC574X eTimer
- 差别-request.getParameterValues与request.getParameter
- 弄清楚这个三角关系,工作效率提高50%
- [IOS] Storyboard全解析-第二部分
- mysqladmin的用法简介
- 使用ajax发送数组请求,Ajax请求传递数组参数
- 对话蔡报永:看Commvault 如何玩转数据管理