FPGA学习之 直接数字频率合成器(DDS)
目录
- FPGA学习之 直接数字频率合成器(DDS)
FPGA学习之 直接数字频率合成器(DDS)
DDS的原理:
直接数字频率合成器(Direct Digital Synthesizer, DDS)是一种把数字信号通过 D/A 转换成模拟信号的数字合成技术。它有查表法和计算法两种基本合成方法。由于查表法结构简单,只需要在 ROM中存放不同相位对应的幅度序列,然后通过相位累加器的输出对其寻址,经过数/模转换和低通滤波(LPF)输出便可以得到所需要的模拟信号。DDS系统主要有相位累加器、波形存储器、数模(D/A)转换器和低通滤波器等四大结构组成
这里,我们只通过改变频率控制字来达到控制波形频率的目的。
原理图:
代码部分:
顶层:
module dds_top(input clk ,input rst_n ,input [1:0] key_in ,output [7:0] dout //dds的输出);//信号定义wire [1:0] key_out ;wire clk_100m ;wire locked ;//模块例化key_debounce /*#(.KEY_W(2)) */u_key(.clk (clk ),.rst_n (rst_n ),.key_in (key_in ),.key_out (key_out ) //检测到按下,输出一个周期的高脉冲,其他时刻为0
);DDS u_DDS(.clk (clk_100m ),.rst_n (rst_n ),.freq_set (key_out[0] ),//设置频率控制字.set_done (key_out[1] ),//设置完成.dout (dout ) //输出数据);pll u_pll( //锁相环例化.areset (~rst_n ),.inclk0 (clk ),.c0 (clk_100m ),.locked (locked ));endmodule
DDS模块:
module DDS(input clk ,input rst_n ,input freq_set ,//设置频率控制字input set_done ,//设置完成output [7:0] dout //输出数据
);//信号定义reg [7:0] fcw_tmp ; //频率控制字 0--255reg [7:0] fcw ; //中间寄存控制字reg [9:0] phase_accum ; //相位累加器寄存器wire [7:0] q_out ;//fcw always @(posedge clk or negedge rst_n)begin if(!rst_n)beginfcw_tmp <= 0;end else if(freq_set)begin fcw_tmp <= fcw_tmp + 1;end else if(set_done)begin fcw_tmp <= 0;end endalways @(posedge clk or negedge rst_n)begin if(!rst_n)beginfcw <= 1;end else if(set_done)begin fcw <= fcw + fcw_tmp;end end//phase_accumalways @(posedge clk or negedge rst_n)begin if(!rst_n)beginphase_accum <= 0;end else begin phase_accum <= phase_accum + fcw;end end//dout assign dout = q_out;//正弦波数据查找表rom rom_inst (.address (phase_accum ),.clock (clk ),.q (q_out ));endmodule
按键消抖模块:
//按键消抖模块
module key_debounce(input clk,input rst_n,input [1:0] key_in,output reg [1:0] key_out);//parameter KEY_W = 2;parameter TIME_20MS = 100000;//当检测到下降沿之后,计数使能拉高,计数器开始计数计时20msreg [19:0] cnt;wire add_cnt;wire end_cnt;reg add_flag;wire nedge;reg [1:0] key_r0;reg [1:0] key_r1;always@(posedge clk or negedge rst_n)beginif(~rst_n)cnt <= 0;else if(add_cnt)beginif(end_cnt)cnt<=0;else cnt<=cnt+1;endendassign add_cnt = add_flag;assign end_cnt = add_cnt && cnt ==TIME_20MS - 1;//当检测到下降沿之后,使能信号拉高always@(posedge clk or negedge rst_n)beginif(~rst_n)add_flag <= 0;else if(nedge)beginadd_flag <=1;endelse if(end_cnt)beginadd_flag <=0;endend//进行同步打拍产生下降沿always@(posedge clk or negedge rst_n)beginif(~rst_n)beginkey_r0<=1;key_r1<=1;endelse begin key_r0 <= key_in;//同步key_r1 <= key_r0;//打拍end endassign nedge = ~key_r0 & key_r1;always@(posedge clk or negedge rst_n)beginif(~rst_n)key_out<=0;else key_out<=end_cnt?~key_r1:0;endendmodule
这里我们利用按键来控制频率控制字改变,两个按键,一个控制增加,一个将增加的值设置给频率控制字。通过频率控制字来改变寻址的地址,达到控制数据输出频率的目的。
上图就是我们要输出的波形,每个数据8bit,一共1024个。利用Mif_Maker2010软件画图并产生 .mif文件(存储图像中各点数据)。然后将其保存在ROM中,根据输入的地址读取相应的值。
signal tap仿真输出效果:
这是放大之后的图像,可以看到就是一个一个的点,我们控制步长(频率控制字)就可以改变它的频率
FPGA学习之 直接数字频率合成器(DDS)相关推荐
- 基于FPGA的直接数字频率合成器的的设计和实现设计和实现
摘要 :直接数字频率合成技术是一种先进的频率合成技术.本文介绍了直接数字合成( DDS )的组成及工作原理,给出了基于公司的 FPGA 实现多波形信号发生器的设计过程,设计在 Quartu s Ⅱ 中 ...
- FPGA学习之 状态机实现数码管的数字时钟
FPGA学习之 状态机实现数字时钟 开发板型号:EP4CE6F17C8 六位数码管原理图: 由图可知,数码管段选和片选均为低电平有效. 由于人眼的视觉残留,我们控制一定频率对每一位数码管进行刷新,就能 ...
- ★教程2:fpga学习教程入门100例目录
1.订阅本教程用户可以免费获得本博任意2个(包括所有免费专栏和付费专栏)博文对应代码: 2.本FPGA课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用.未经本人允 ...
- 【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- FPGA学习及设计中的注意事项
为什么80%的码农都做不了架构师?>>> FPGA学习及设计中的注意事项 1.基础问题 FPGA的基础就是数字电路和HDL语言,想学好FPGA的人,建议床头都有一本数字电路的书 ...
- FPGA学习笔记(七): DSB调制解调的仿真
笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...
- 数字信号处理——DDS模块设计(3)
引言 本篇仍然基于LUT查找表,设计DDS,思路与上篇基本一致.不同点: 1.LUT深度变为之前的1/4,存储1/4波形. 2.使用双口ROM替代两个单口ROM. 此文在前文基础上改进,请先查阅前文. ...
- [笔记]|[FPGA]|[寄存器]|[模拟信号数字信号]《FPGA学习之道》学习笔记(1)
[笔记]|[FPGA]|[寄存器]|[模拟信号数字信号]<FPGA学习之道>学习笔记(1) 笔记为笔者学习狄超所著**<FPGA之道>**时所写 –仅作为自己后续查看的笔记 文 ...
- 入行10年后,我总结了这份FPGA学习路线
最近我收到很多同学的提问,让我介绍一下FPGA怎么学习.怎么进阶,有什么推荐的材料或者学习资源. 在给我留言和私信的朋友里,有在校的大学生,需要学FPGA做数电实验.参加竞赛.进实验室,或者只求水过这 ...
最新文章
- java 月第一天_java获取当前月第一天和最后一天
- JS仿淘宝关闭二维码案例
- php模拟getua_php实现进行远程抓取百度网页内容,并伪装服务器端ip
- openfire 打包发布
- 复旦大学张奇组:对话摘要数据不足?对话数据、文档摘要数据,我全都要!...
- boost::fusion::hash_value用法的测试程序
- 《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-5
- 佳能MP258mp259清零软件
- qtp如何软件测试,QTP测试流程
- FinalShell下载安装教程
- #项目的编译和发布 #静态发布新浪云 #node服务器发布新浪云 #nodejs服务器部署数据库 #新浪云前后端结合
- 在android手机上运行PHP 1
- 与Anthony Baldino一起塑造声音
- HTML5+CSS3小实例:黏性小球loading动画
- MacPorts 初装后提示 command not found: port 解决方案
- 工作中提高工作效率的几个思维模式
- 【TSP问题】基于蜜蜂算法求解旅行商问题附matlab代码
- 倍福EL6021使用Modbus RTU通信例程
- python 使用excel画图
- 【J1】【队列】报数游戏
热门文章
- 什么是舆情监控,舆情监控是什么?
- 【PTA】名人堂与代金券
- IDL的参数传递(五)
- CG原画绘画教程之人物-张聪-专题视频课程
- xp系统为何无法登陆服务器,xp系统怎么登陆云服务器
- 如何在桌面版linux怎么安装360安全卫士?
- 非常不错的地区三级联动,js简单易懂。封装起来了(转)
- python请输入星期几的第一个字母来判断_【Python 实例】面向对象 | 请输入一周中某天的名称的第一个字母来判断以下是星期几,如果第一个字母一样则继续判断第二个字母...
- c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数
- 三中新教学楼信息系统集成方案