[转载] 任意频率分频原理

http://blog.chinaaet.com/detail/21535.html

 任意频率分频原理
任意频率分频原理

在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个人主观应用,如有异议,请联系本人。

原文地址:https://www.cnblogs.com/winkle/p/3440539.html