(一)分频器相关原理1.DDS原理任意分频原理起源于DDS(Direct Digital Synthesizer,直接频率合成法)的原理,DDS是重要的频率合成方法,在波形发生器中占有举足轻重的地位。DDS是一种从相位概念出发,直接合成所需要的波形的频率合成技术,其实质是以基准频率源(系统时钟)对相位进行等间隔采样。对于正余弦类型的频率合成,DDS基本上等效于NCO加上DA实现。DDS由相位累加器和波形存储器、数模转换器(DAC)以及模拟低通滤波器(LPF)三部分组成,实现原理与NCO完全一致,只是存储的ROM由NCO替代为需要发生的波形文件,并通过数模转换器转换为模拟信号,最后由具有内插作用的LPF将其平滑转化为连续的正弦波形以输出。一个典型的DDS硬件结构如图1‑75所示图1‑75典型的DDS硬件结构2.任意分频发生器的实现直接频率合成法通过相位累加原理,实现了通过步长可配置的任意波形输出。根据这个原理,通过对相位累加的地址进行处理,可以直接计算得到相应的频率。这一原理应用于VerilogHDL中,理论上也能实现任意频率的分频电路。设计实现的框图如图1‑76所示。图1‑76相位累加原理的实现框图假定FPGA基准时钟为100MHz,即基准时钟为:fc=100x106Hz同时规定计数器的位数N2=32,K为频率控制字,则相位累加后输出的最大频率与最小频率分别为:            21(.)变换公式,可以计算得到固定基准频率下每增/减1Hz的频率控制字K的大小,如下所示:            22(.)由此公式可知,每增、减1Hz,K的步进为42.949 672 96。另外,与前面的分析一致,最大的频率、最小频率(频率分辨率)分别为:            23(.)根据以上公式可以得到固定基准时钟下的任意频率发生器,其精度为0.0232831Hz。不过相位累加器得到的只是cnt累加的结果,为了得到频率,还需要对相位累加值cnt进行一定的处理,即采用类似于AD9850内DDS核的比较器,来实现方波à频率的转换。3.实验验证假定FPGA基准时钟为100MHz,即基准时钟为:fc=100x106Hz当使用UART时,波特率BPS=115200 bps。(一)直接分频法一个位的周期= 1 / bps= 1/ 115200= 0.000086805555555555555555555555555556传输一位数据占用 0.000086805555555555555555555555555556s 时间。如果是一帧11 位的数据,就需要0.000086805555555555556 x 11 = 0.00095486111111111111111111那么一秒钟内可以传输1 / 0.00095486111111111111111111 = 1047.27272727272727272727394591741047.2727272727272727272 个帧数据。如果用100Mhz 的时钟频率去量化的话:( 1/115200 ) / (1/100E+6) = 8.68E-6 / 20E-9= 868.05555555555555555555555555556≈868计数上限为整数,将此值反馈代入输出频率计算式,如下:            24(.)现在要将基准时钟进行751分频(特殊才具有说明意义),产生的频率为:            25(.)由该公式可知,结果与预期的数据相差了近 10 Hz。不管这是否在波特率的允许误差范围内,用FPGA分频得到误差如此之大的频率误差简直让人无法接受。(二)任意分频发生器实现“任意频率发生器”方法:首先计算频率控制字,如下所示:            26(.)由于在FPGA中不能进行浮点运算,所以K取整数6597070。将此值反馈代入输出频率计算式,如下图所示:            27(.)最终输出的频率所产生的误差为:            28(.)由公式课件,尽管取K为整数,但最终产生的频率误差也在小数点后10位,这已经是一个非常理想的结果了。而UART转串口芯片一般允许一定的误差,如CH340 TXD的允许波特率误差小于0.3%,RXD的允许波特率误差不小于2%。因此,在可允许的范围内还有很大的余量。按照上述分析进行分频器的设计:(1)新建precise_divider的模块,其模块框图如图1‑77所示,端口定义如表1‑32所示。图1‑77任意分频模块框图表1‑32任意分频模块端口列表

端口名 位宽 输入/输出 说明
clk 1 Input 全局时钟信号
rst_n 1 Input 全局复位信号
divide_clk 1 Output 分频时钟信号
divide_clken 1 Output 使能时钟信号

(2)相位计数器-32位K步计数器,如下所示:代码1‑632位K步计数器

1.//------------------------------------------------------  2.//RTL1: Precise fractional frequency for uart bps clock   3.reg [31:0]  cnt;  4.always@(posedge clk or negedge rst_n)  5.begin  6.    if(!rst_n)  7.        cnt <= 0;  8.    else  9.        cnt <= cnt + DEVIDE_CNT;       10.end  

如上所示,在全局时钟驱使下,进行K步计数,cnt可以理解为0~232-1的地址。类似于AD9850,可以通过计数器来实现跳跃寻址。其中DEVICE_CNT是一个在接口中经过宏定义的16倍波特率(9600x16)的分频参数,方便文件在例化时可以直接修改分频参数。(3)合成频率:方波的生成在上一步完成0~232-1寻址后,需要对地址进行比较、划分,得到一个方波信号。这类似于AD9850内部的比较器,通过输出的正弦波于门限电压做比较,得到一定频率下的方波。这里设计的Verilog HDL代码如下:代码1‑7方波的生成

1.//------------------------------------------------------  2.//RTL2: Equal division of the Frequency division clock  3.reg cnt_equal;  4.always@(posedge clk or negedge rst_n)  5.begin  6.    if(!rst_n)  7.        cnt_equal <= 0;  8.    else if(cnt 9.        cnt_equal <= 0;  10.    else  11.        cnt_equal <= 1;  12.end  

32’h7FFF_FFFF为232-1的中点,因此它可以作为“门限电压”,来实现合成频率后的方波输出。(4)分频时钟使能信号的生成。在FPGA中,除了全局时钟外,不允许用其他门控时钟来驱动电路,不然不易于综合电路,而且也无法保证电路的稳定性。因此,为了便于后续模块的调用,需要生成使能时钟信号。这里采用 “边沿检测技术”。代码如下:代码1‑8分频时钟使能信号的生成

1.//------------------------------------------------------  2.//RTL3: Generate enable clock for clock  3.reg cnt_equal_r;  4.always@(posedge clk or negedge rst_n)  5.begin  6.    if(!rst_n)  7.        cnt_equal_r <= 0;  8.    else  9.        cnt_equal_r <= cnt_equal;  10.end  11.assign  divide_clken = (~cnt_equal_r & cnt_equal) ? 1'b1 : 1'b0;   12.assign  divide_clk = cnt_equal_r;  
这个分频器在后续使用中会慢慢验证,在此不会进验证(其实本人已经验证过了),有兴趣的可以自己编写程序进行验证。

完整的代码及调用方式如下代码1‑9完整的任意分频器设计代码

1.//****************************************************************************//  2.//# @Author: 碎碎思  3.//# @Date:   2017-04-22 16:50:30  4.//# @Last Modified by:   zlk  5.//# @WeChat Official Account: OpenFPGA  6.//# @Last Modified time: 2017-04-22 09:19:50  7.//# Description:   8.//# @Modification History: 2017-04-22 09:19:50  9.//# Date                By             Version             Change Description:   10.//# ========================================================================= #  11.//# 2017-04-22 09:19:50  12.//# ========================================================================= #  13.//# |                                                                       | #  14.//# |                                OpenFPGA                               | #  15.//****************************************************************************//  16.`timescale 1ns/1ns  17.module  precise_divider  18.#(  19.    //DEVIDE_CNT = 42.94967296 * fo  20.//  parameter       DEVIDE_CNT = 32'd175921860  //256000bps * 16  21.//  parameter       DEVIDE_CNT = 32'd87960930   //128000bps * 16  22.//  parameter       DEVIDE_CNT = 32'd79164837   //115200bps * 16  23.    parameter       DEVIDE_CNT = 32'd6597070    //9600bps * 16  24.)  25.(  26.    //global clock  27.    input           clk,  28.    input           rst_n,  29.      30.    //user interface  31.    output          divide_clk,  32.    output          divide_clken  33.);  34.  35.//------------------------------------------------------  36.//RTL1: Precise fractional frequency for uart bps clock   37.reg [31:0]  cnt;  38.always@(posedge clk or negedge rst_n)  39.begin  40.    if(!rst_n)  41.        cnt <= 0;  42.    else  43.        cnt <= cnt + DEVIDE_CNT;       44.end  45.  46.//------------------------------------------------------  47.//RTL2: Equal division of the Frequency division clock  48.reg cnt_equal;  49.always@(posedge clk or negedge rst_n)  50.begin  51.    if(!rst_n)  52.        cnt_equal <= 0;  53.    else if(cnt 54.        cnt_equal <= 0;  55.    else  56.        cnt_equal <= 1;  57.end  58.  59.//------------------------------------------------------  60.//RTL3: Generate enable clock for clock  61.reg cnt_equal_r;  62.always@(posedge clk or negedge rst_n)  63.begin  64.    if(!rst_n)  65.        cnt_equal_r <= 0;  66.    else  67.        cnt_equal_r <= cnt_equal;  68.end  69.assign  divide_clken = (~cnt_equal_r & cnt_equal) ? 1'b1 : 1'b0;   70.assign  divide_clk = cnt_equal_r;  71.  72.  73.endmodule  

代码1‑10调用完整的任意分频器设计代码示例

1.wire    divide_clken;  2.precise_divider   3.#(  4.    //DEVIDE_CNT = 42.94967296 * fo  5.      6.//  .DEVIDE_CNT (32'd175921860) //256000bps * 16      7.//  .DEVIDE_CNT (32'd87960930)  //128000bps * 16  8.//  .DEVIDE_CNT (32'd79164837)  //115200bps * 16  9.    .DEVIDE_CNT (32'd6597070)   //9600bps * 16  10.)  11.u_precise_divider  12.(  13.    //global  14.    .clk                (clk_ref),      //100MHz clock  15.    .rst_n              (sys_rst_n),    //global reset  16.      17.    //user interface  18.    .divide_clk         (divide_clk),  19.    .divide_clken       (divide_clken)  20.);  

推荐阅读

一天一个设计实例-Xilinx FPGA和Intel FPGA区别

一天一个设计实例-Xilinx FPGA主流芯片选型

一天一个设计实例-Intel FPGA主流芯片选型

一天一个设计实例-Intel FPGA主流芯片命名规则

一天一个设计实例-Xilinx FPGA命名规则

一天一个设计实例-FPGA开源网站和论坛

一天一个设计实例-FPGA设计流程

一天一个设计实例-PLL、DLL、DCM区别及应用

一天一个设计实例-计数器设计

一天一个设计实例-门控时钟和使能时钟

点击上方字体就可以阅读哟

最强理解

转了吗赞了吗在看吗

16 分频 32 分频是啥意思_一天一个设计实例任意分频器设计相关推荐

  1. 16 分频 32 分频是啥意思_Verilog中任意分频的实现

    在这里讲的是利用计数器进行对clk分频,在rtl code 设计中,由于各个ip的时钟频率不同,所以我们经常要对系统clk进行分频,下面是它的代码以及要实现的功能. //功能:对输入时钟clock进行 ...

  2. 16 分频 32 分频是啥意思_Verilog 数字分频器的设计及验证

    1.分频器的概念及应用 分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源, ...

  3. 16 分频 32 分频是啥意思_CD4017是什么?十进制计数器分频器CD4017的逻辑功能呢?...

    一.CD4017功能概述 CD4017是5位Johnson十进制计数器分频器,时钟输入端的斯密特触发器具有脉冲整形功能,对输入时钟脉冲上升和下降时间无限制,CD4017 提供了16 引线多层陶瓷双列直 ...

  4. arduino点阵声音频谱_音频跳动:制造32分频音频频谱点阵

    MAKER:Shajeeb/ 译:趣无尽 该项目通过 Arduino 和四块点阵屏,实现32分频的音频(音乐)频谱可视化显示. 这里用了大量篇幅对其原理做了解释(初学者理解起来开可能稍有难度),并且提 ...

  5. arduino点阵声音频谱_创客实战 | 制作一个随音乐跳动的32分频音频频谱显示器

    前言 这期作品是通过 Arduino 和四块LED点阵模块,实现32分频的音频频谱可视化显示,让LED随音乐跳动! 主要特点 1.使用简易安装的库 ArduinoFFT 和 MD_MAX72xx.2. ...

  6. arduino点阵声音频谱_Arduino实现32分频音频频谱显示器

    MAKER:Shajeeb/译:趣无尽 Cherry(转载请注明出处) 该项目通过 Arduino 和四块点阵屏,实现32分频的音频(音乐)频谱可视化显示. 这里用了大量篇幅对其原理做了解释(初学者理 ...

  7. 千元打造双千兆4盘位16核32线程家庭nas服务器,满足你的家庭 all in one方案!

    2023年 高性能框框之王! 小体积4盘位双千兆网卡 就是这么强! 更多NAS or 黑群晖方案 访问DIYNAS:DIYNAS - 家庭服务器构建基地,快速打造你的智能家庭生态圈! 介绍 在科技飞速 ...

  8. ASP.Net中MD5加密-16位32位

    public string md5(string str,int code) { if(code==16) //16位MD5加密(取32位加密的9~25字符) { return System.Web. ...

  9. 16位/32位中断机制比較

    16位/32位中断机制比較 原理: 16位中断机制:使用中断向量表 32位中断机制:使用中段描写叙述符表IDT 位置: 中断向量表的位置是固定的,位于内存的開始0x00000 中断向量符表位置不固定, ...

  10. 外设位宽为8、16、32时,CPU与外设之间地址线的连接方法

    有不少人问到: flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位.为什么要偏1位? 从软件和CPU的角度而言,一 ...

最新文章

  1. python 服务器端_python实现服务器端
  2. Eclipse设置背景色、字体大小
  3. AGI:走向通用人工智能的【生命学哲学科学】第二篇——思维、生命科学、客观世界
  4. XML基本知识(三)
  5. Linux DNS | resolv.conf 配置dns解析,重启network丢失
  6. mysql root 注入_sql注入入门之mysqlroot权限下的注入利用方式
  7. [csu/coj 1632]LCP
  8. Jfinal的七牛云存储插件:qiniuPlugin for jfinal.
  9. 中国互联网公司大盘点
  10. html 广告弹窗代码,广告弹窗.html
  11. Java Email——使用Java程序收发电子邮件
  12. 基于华为云服务器Docker nginx安装和配置挂载
  13. 时光飞逝,思考,实践,伴我一生的经验
  14. java—员工的工资
  15. 帮我写一篇,3000字的关于对外汉语线上教学平台的论文
  16. 6.3.2 延迟操作与延迟缓存
  17. matlab把向量转化为矩阵,MATLAB小函数:将列向量转化为0-1矩阵
  18. 【Office】Excel如何导出宏
  19. Mysql读写分离插件简化版
  20. 2008年4月计算机网络原理答案,全国2008年4月高等教育自学考试4741计算机网络原理试题及答案...

热门文章

  1. java list indexof_Java LinkedList indexOf()方法
  2. STORM的DRPC通讯
  3. 手机浏览器自动播放视频video(设置autoplay无效)的解决方案
  4. java:eclipse:windows开发环境log4j系统找不到指定的路径
  5. node-cookie- session
  6. webpack编译流程漫谈
  7. 时刻牢记“我是谁、为了谁、依靠谁” 始终践行党的群众观点和群众路线
  8. Oracle中使用批处理文件批量建表
  9. redis持久化方法
  10. redis 经典36问