verilog 任意比例分频电路的实现_FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频...

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖最后由 lifree 于 2020-1-20 17:51 编辑& a8 w2 i0 y" p

, N6 G8 x; ~. |( n9 Z4 {一、为啥要说任意分频也许FPGA中的第一个实验应该是分频实验,而不是流水灯,或者LCD1602的"Hello World"显示,因为分频的思想在FPGA中极为重要。当初安排流水灯,只是为了能让大家看到效果,来激发您的兴趣(mcu的学习也是如此)。$ [0 l7 r- i+ t

在大部分的教科书中,都会提到如何分频,包括奇数分频,偶数分频,小数分频等。有些教科书中也会讲到任意分频(半分频,任意分数分频)原理,用的是相位与的电路,并不能办到50%的占空比,也不是很灵活。4 S" l6 \9 A; A

但没有一本教科书会讲到精准,浅显易懂的高精度任意分频原理(至少Bingo没看到过),同时也没有一种设计能用同一个电路实现任意频率的控制。Bingo对于当年做的任意波形发生器时候的相位累加器原理,从中受到启发,总结出高精度任意频率合成的重要思维,在此贡献给大家,希望对大家有用。二、任意分频原理以及性能

5 A1 n8 l. g: g6 m/ M3 L+ k9 q6 Y$ b1. DDS相位累加器

2 q. p4 L3 m5 {% T% b6 i* c) N8 j

(1)DDS合成流程首先讲诉DSS(直接频率合成法)的原理。DDS是重要的频率合成方法,在波形发生器中有极其重要的应用。DDS主要由以下几部分组成:a) 相位累加器b) RAM数据读取c) D/A转换器d) 低通滤波器见如下流程图:直接频率合成法的流程图,有固定模块,输入频率控制器,输出固定频率的波形。# Q4 u5 K! F0 }0 D' P, m: ~

, h8 S% g) l1 g: G) h

) p+ a0 l5 f  Q5 q, C

# M/ Y8 P# e* D- |3 q2 {

, y4 W7 w+ p, J& i8 g( a

6 @* F9 R; J% }

, }' |* S: G  ]1 h8 e4 M此电路最主要模块是相位累加器,通过相位累加器循环计数,循环读取RAM的数据,从而得到固定频率的波形数据。

, ]& }* r2 ?$ W8 O& `

+ m! |* W+ I* d: g" N9 @% u) \- H( h  s; Y, W

(2)相位累加器原理

5 ]- w4 M5 |5 b4 M! ]  ^9 Z9 D2 ]1 \1 G  y6 `9 T/ X

+ v' v% M+ i7 _) T' ]7 M# c/ D9 T5 I( G& q0 z9 x

3 n  Q4 d9 G' u! s, p

/ W+ Z4 B. ?- X3 u' G% n

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

; p4 C; _' C- \; }输入频率控制字,根据算法,来实现相位的变化,分析如下所示:假定FPGA基准频率为50MHz,即基准频率:5 n2 E* p1 y/ d8 ]. p8 V3 [

9 W2 z" f& k$ Y0 x

* I: T8 i3 C3 t! |

4 g$ K9 K8 d3 P0 ]0 i" \1 t2 }7 C* p2 L3 M

# C8 y$ o1 ~6 `4 l(MHz) 假定计数器为32位计数器,即. z5 U) {9 \1 P" {3 R6 e% [

# e5 H' t) h* I! C+ `& e; _

& r/ O( H. j5 u2 ?( O

* S! O7 ?. o  l4 q8 K2 t% J, Q9 g* s  h& H

;K为频率控制字,则相位输出的频率为:

* e: O  y1 U: V  B" Q; q+ N1 N3 w

5 f! K! t: ]" V/ t' F  A* J# p7 s' I' ]0 v/ e

- z, T( b0 D- m- [! \+ W4 I

! V3 z# R- _/ E) g' [(1)即+ V, G  v- `0 p  O4 |

- s  O& T6 u! ~4 W% F3 Y2 {0 ]* w0 @4 ~' V  d. Q; p

(2) 根据相位累加原理,以及RAM缓存读取数据,每一次

; U! d0 t$ a! h9 S1 T- F4 N1 ^  ]1 V0 X8 W  a  C

, Z' W: |5 t! \" B3 [' q, E* @0 Q

. o' I9 Y9 ^9 v  ]2 q% W6 n* H8 C2 s( H. c; j1 i) `* v* L

的循环,RAM数据间隔K读取一次。4 b0 z6 z; d; J

: [0 H0 }5 X( l7 a  T$ T3 O

6 `: B' K% N: D, D9 Q* K* n当K=1的时候,公式能输出最小频率,根据公式(1):% g* N- I9 U0 u( d( w; x

0 W4 V9 q9 J0 ]" u

4 P5 M: k6 G+ l0 k* f4 `所以,最小波形频率步进为0.011655Hz。当fo=1Hz的时候,根据公式(2)

! ?, \2 \5 C8 x/ {

: s. B2 q/ |  E! h5 _, G& \1 {$ v$ L9 ~  U0 y# p

所以,每Hz的增减,K的步进为85.90。9 T. F4 H0 o/ O; v0 N' S" u3 X

当K=N/2的时候,公式能输出最大频率(因为每个CLK跳变一次),此时,根据公式(1),得到

) f+ T; y7 g) n) @8 E

/ H! Q8 [8 ?/ k; |) o* m6 X7 g& e- O2 v! \: |' |

# E, O. Y& x/ J6 B

/ \  J& g1 h; ?4 l) B

7 F, {7 o/ R8 \# w& L/ y因此,根据频率控制字K的变化,能输出及固定频率的波形。! V) @  x) e6 ?, [1 l

. C4 C8 r6 s9 X( o6 i0 f3 H( \4 x  }9 {0 }1 T/ B& |

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

: i6 V' }' v. R! t1 C

1 w; @9 T3 i- ^% A6 g0 M2 W: M& S+ S" Z3 Y0 F4 r+ i) l9 c

7 V  R& d% z  F9 c# A1 W

- O' U3 o; F! A+ [" ^1 T( Z0 G7 h* d/ E

) r7 B8 q) T( f! }& s我们规定,对Cnt进行对半50%拆分,具体如下:

& f9 z0 m# b) V# \% ~1 a7 U(1)当# n7 t5 s) x# r2 u7 S

0 ]: }& o- |5 X8 F

1 i4 z0 ]  u3 S) q0 k的时候,# X6 n; x1 R8 O/ h9 p; W# |

# `2 C1 X7 g( U; C7 `  _

- m/ z: m7 Q; f5 F2 w,即低电平; (2)当

% H" q; w2 v+ ^. r

2 P+ o/ ]: M# G) V- {$ q8 @: l$ ^4 h7 `

的时候,fo=1,即高电平。同上:

0 |3 E: v& h+ U+ X% O

t, n  ^, M7 S6 I. D, F0 c" G2 `% Q6 n* H

0 A- q1 x# f$ e# l

9 f+ p5 P" H! y- t

8 n4 z' R9 u$ Z( V( A

# \/ u6 d( o: o# g

6 R' W" @! {( x; K

' v- p$ |2 d/ ?! u* T2 K' r( M% h2 d3 C; z& c  R: V8 v0 V" L" I7 p

* v% ~! q7 t' V/ \. z+ B' S+ k

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

( X4 _) @0 o# m7 J" K7 n- }/**************************************************** 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^6fo = 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, //50MHzinput rst_n, //clock resetoutput reg clk_out);//--------------------------------------reg [31:0] max_value;always@(posedge clk or negedge rst_n)beginif(!rst_n)max_value <= 1'b0;elsemax_value <= max_value + FREQ_WORD;end//--------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)clk_out <= 1'b0;elsebeginif(max_value < 32'h7FFF_FFFF)clk_out <= 1'b0;elseclk_out <= 1'b1;endendendmodule本代码由 从DDS相位累加器中,相应移植总结出来的任意频率分频原理,本模块应用在多个对频率精准度要求比较高的工程中(如UART中,要得到115200Hz的bps,用这种任意分频的原理来得到精准的方法,一定程度上能够提高数据传输的准确率)。

1 V3 H  c1 _! y# r+ d- V

( k7 e7 i% S3 U4 J- O4 Q# G, Z' s# E4 ]' X0 ^. X0 Q

在DDS中的相位累加器的任意分频原理,在一般工程中同样可以应用。在某些应用场合,还是值得考虑的。7 ]# E! p. j$ t5 n1 H. g

; }. \- Z; m8 y7 f; E9 E% s5 W# R& x

2 e8 f: T. j& |: b5 U3 d/ c

" C8 r: E. T' k- ~『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值