目录

  • 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)相关推荐

  1. 基于FPGA的直接数字频率合成器的的设计和实现设计和实现

    摘要 :直接数字频率合成技术是一种先进的频率合成技术.本文介绍了直接数字合成( DDS )的组成及工作原理,给出了基于公司的 FPGA 实现多波形信号发生器的设计过程,设计在 Quartu s Ⅱ 中 ...

  2. FPGA学习之 状态机实现数码管的数字时钟

    FPGA学习之 状态机实现数字时钟 开发板型号:EP4CE6F17C8 六位数码管原理图: 由图可知,数码管段选和片选均为低电平有效. 由于人眼的视觉残留,我们控制一定频率对每一位数码管进行刷新,就能 ...

  3. ★教程2:fpga学习教程入门100例目录

    1.订阅本教程用户可以免费获得本博任意2个(包括所有免费专栏和付费专栏)博文对应代码: 2.本FPGA课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用.未经本人允 ...

  4. 【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  5. FPGA学习及设计中的注意事项

    为什么80%的码农都做不了架构师?>>>    FPGA学习及设计中的注意事项 1.基础问题 FPGA的基础就是数字电路和HDL语言,想学好FPGA的人,建议床头都有一本数字电路的书 ...

  6. FPGA学习笔记(七): DSB调制解调的仿真

    笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...

  7. 数字信号处理——DDS模块设计(3)

    引言 本篇仍然基于LUT查找表,设计DDS,思路与上篇基本一致.不同点: 1.LUT深度变为之前的1/4,存储1/4波形. 2.使用双口ROM替代两个单口ROM. 此文在前文基础上改进,请先查阅前文. ...

  8. [笔记]|[FPGA]|[寄存器]|[模拟信号数字信号]《FPGA学习之道》学习笔记(1)

    [笔记]|[FPGA]|[寄存器]|[模拟信号数字信号]<FPGA学习之道>学习笔记(1) 笔记为笔者学习狄超所著**<FPGA之道>**时所写 –仅作为自己后续查看的笔记 文 ...

  9. 入行10年后,我总结了这份FPGA学习路线

    最近我收到很多同学的提问,让我介绍一下FPGA怎么学习.怎么进阶,有什么推荐的材料或者学习资源. 在给我留言和私信的朋友里,有在校的大学生,需要学FPGA做数电实验.参加竞赛.进实验室,或者只求水过这 ...

最新文章

  1. java 月第一天_java获取当前月第一天和最后一天
  2. JS仿淘宝关闭二维码案例
  3. php模拟getua_php实现进行远程抓取百度网页内容,并伪装服务器端ip
  4. openfire 打包发布
  5. 复旦大学张奇组:对话摘要数据不足?对话数据、文档摘要数据,我全都要!...
  6. boost::fusion::hash_value用法的测试程序
  7. 《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-5
  8. 佳能MP258mp259清零软件
  9. qtp如何软件测试,QTP测试流程
  10. FinalShell下载安装教程
  11. #项目的编译和发布 #静态发布新浪云 #node服务器发布新浪云 #nodejs服务器部署数据库 #新浪云前后端结合
  12. 在android手机上运行PHP 1
  13. 与Anthony Baldino一起塑造声音
  14. HTML5+CSS3小实例:黏性小球loading动画
  15. MacPorts 初装后提示 command not found: port 解决方案
  16. 工作中提高工作效率的几个思维模式
  17. 【TSP问题】基于蜜蜂算法求解旅行商问题附matlab代码
  18. 倍福EL6021使用Modbus RTU通信例程
  19. python 使用excel画图
  20. 【J1】【队列】报数游戏

热门文章

  1. 什么是舆情监控,舆情监控是什么?
  2. 【PTA】名人堂与代金券
  3. IDL的参数传递(五)
  4. CG原画绘画教程之人物-张聪-专题视频课程
  5. xp系统为何无法登陆服务器,xp系统怎么登陆云服务器
  6. 如何在桌面版linux怎么安装360安全卫士?
  7. 非常不错的地区三级联动,js简单易懂。封装起来了(转)
  8. python请输入星期几的第一个字母来判断_【Python 实例】面向对象 | 请输入一周中某天的名称的第一个字母来判断以下是星期几,如果第一个字母一样则继续判断第二个字母...
  9. c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数
  10. 三中新教学楼信息系统集成方案