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- ~『本文转载自网络,版权归原作者所有,如有侵权请联系删除』