您的位置 首页 电子

【从零开始走进FPGA】教你什么才是真实的恣意分频

一、为啥要说任意分频也许FPGA中的第一个实验应该是分频实验,而不是流水灯,或者LCD1602的"Hello World"显示,因为分频的思想在FPGA中极为重要。当初

  一、为啥要说恣意分频

  或许FPGA中的第一个试验应该是分频试验,而不是流水灯,或许LCD1602的"Hello World"显现,由于分频的思想在FPGA中极为重要。最初组织流水灯,仅仅为了能让咱们看到作用,来激起您的爱好(MCU的学习也是如此)。

  在大部分的教科书中,都会说到怎么分频,包含奇数分频,偶数分频,小数分频等。有些教科书中也会讲到恣意分频(半分频,恣意分数分频)原理,用的是相位与的电路,并不能办到50%的占空比,也不是很灵敏。

  但没有一本教科书会讲到精准,深入浅出的高精度恣意分频原理(至少Bingo没看到过),一起也没有一种规划能用同一个电路完成恣意频率的操控。Bingo关于当年做的恣意波形发生器时分的相位累加器原理,从中遭到启示,总结出高精度恣意频率组成的重要思想,在此贡献给咱们,期望对咱们有用。

  二、恣意分频原理以及功能

  1. DDS相位累加器

  (1)DDS组成流程

  首先讲诉DSS(直接频率组成法)的原理。

  DDS是重要的频率组成办法,在波形发生器中有极其重要的使用。DDS主要由以下几部分组成:

  a) 相位累加器

  b) RAM数据读取

  c) D/A转换器

  d) 低通滤波器

  见如下流程图:直接频率组成法的流程图,有固定模块,输入频率操控器,输出固定频率的波形。

  

wps_clip_image-29375

 

  此电路最主要模块是相位累加器,经过相位累加器循环计数,循环读取RAM的数据,然后得到固定频率的波形数据。

  (2)相位累加器原理

  

wps_clip_image-29488

 

  相位累加原理流程如上所示:

  输入频率操控字,依据算法,来完成相位的改变,剖析如下所示:

  假定FPGA基准频率为50MHz,即基准频率:wps_clip_image-160(MHz)

 

  假定计数器为32位计数器,即wps_clip_image-24696;

 

  K为频率操控字,则相位输出的频率为:wps_clip_image-19237 (1)

 

  即wps_clip_image-17519(2)

 

  依据相位累加原理,以及RAM缓存读取数据,每一次wps_clip_image-25807的循环,RAM数据距离K读取一次。

 

  当K=1的时分,公式能输出最小频率,依据公式(1):

  

wps_clip_image-30306

 

  所以,最小波形频率步进为0.011655Hz。

  当fo=1Hz的时分,依据公式(2)

  

wps_clip_image-25409

 

  所以,每Hz的增减,K的步进为85.90。

  当K=N/2的时分,公式能输出最大频率(由于每个CLK跳变一次),此刻,依据公式(1),得到wps_clip_image-2765

 

  

wps_clip_image-4319

 

  因而,依据频率操控字K的改变,能输出及固定频率的波形。

  2. 恣意频率分频原理

  在FPGA中某些使用场合,对频率要求比较高的情况下,用相位累加器原理来生成固定频率的办法,未尝不可。

  

wps_clip_image-29426

 

  咱们规则,对Cnt进行对半50%拆分,详细如下:

  (1)当wps_clip_image-28816的时分,wps_clip_image-18980,即低电平;

 

  (2)当wps_clip_image-19540的时分,fo=1,即高电平。

 

  同上:

  

wps_clip_image-18030

 

  

wps_clip_image-3536

 

  

wps_clip_image-12165

 

  

wps_clip_image-22532

 

  

image

 

  在FPGA中使用,Verilog代码如下所示:

  /***************************************************

  * Module Name : clk_generator

  * Engineer : Crazy Bingo

  * Target Device : EP2C8Q208C8

  * Tool versions : Quartus II 9.1SP1

  * Create Date : 2011-6-25

  * Revision : v1.0

  * Description :

  **************************************************/

  /*************************************************

  fc = 50MHz 50*10^6

  fo = fc*K/(2^32)

  K = fo*(2^32)/fc

  = fo*(2^32)/(50*10^6)

  **************************************************/

  module clk_generator

  #

  (

  parameter FREQ_WORD = 32’d8590 //1KHz

  )

  (

  input clk, //50MHz

  input rst_n, //clock reset

  output reg clk_out

  );

  //————————————–

  reg [31:0] max_value;

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  max_value <= 1’b0;

  else

  max_value <= max_value + FREQ_WORD;

  end

  //————————————–

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  clk_out <= 1’b0;

  else

  begin

  if(max_value < 32’h7FFF_FFFF)

  clk_out <= 1’b0;

  else

  clk_out <= 1’b1;

  end

  end

  endmodule

  本代码由Bingo从DDS相位累加器中,相应移植总结出来的恣意频率分频原理,本模块使用在多个对频率精准度要求比较高的工程中(如UART中,要得到115200Hz的bps,用这种恣意分频的原理来得到精准的办法,必定程度上能够进步数据传输的准确率)。

  在DDS中的相位累加器的恣意分频原理,在一般工程中相同能够使用。在某些使用场合,仍是值得考虑的。本使用纯属Bingo个人片面使用,如有贰言,请联络自己。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/116934.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部