一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4621|回复: 1

任意分频的verilog语言实现

[复制链接]
发表于 2012-2-11 21:02 | 显示全部楼层 |阅读模式
任意分频的verilog语言实现# A5 S9 v9 q( ]9 _, S$ i/ ?

网上看到的,很有帮助,zz与此

现来说说分频原理吧,原理通了,什么都好办了。

1. 偶数倍(2N)分频

使用一模N计数器模块即可实现,即每当模N计数器上升沿从0开始计数至N时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,以此循环即可。偶数倍分频原理示意图见图1。

2. 奇数倍(2N+1)分频

(1)占空比为X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器模块可以实现。取0至2N之间一数值X(0<x<2n),当计数器时钟上升沿从0开始计数到X值时输出时钟翻转一次,在计数器继续计数达到2N+1时,输出时钟再次翻转并对计数器置一复位信号,使之从0开始重新计数,即可实现。</x<2n)

(2)占空比为50%的分频,设计思想如下:基于(1)中占空比为非50%的输出时钟在输入时钟的上升沿触发翻转;若在同一个输入时钟周期内,此计数器的两次输出时钟翻转分别在与(1)中对应的下降沿触发翻转,输出的时钟与(1)中输出的时钟进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。当然其输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理示意图见图2。(这也是许多公司常出的面试题,^_^,是不是很简单?)

3. N-0.5倍分频

采用模N计数器可以实现。具体如下:计数器从0开始上升沿计数,计数达到N-1上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历0.5个周期时,计数器输出时钟必须进行再次翻转,即当CLK为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到N而复位为0重新开始计数同时输出时钟翻转。这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的触发时钟每经历N-0.5个周期就翻转一次。N-0.5倍:取N=3,分频原理示意图见图3。

6 t) e1 R7 {0 f

对于任意的N+A/B倍分频(N、A、B∈Z,A≦B)

- L+ k! e! G. O) _5 C& @. c

分别设计一个分频值为N和分频值N+1的整数分频器,采用脉冲计数来控制单位时间内两个分频器出现的次数,从而获得所需要的小数分频值。可以采取如下方法来计算个子出现的频率:


7 m. q  Y0 h: d; M4 w

设N出现的频率为a,则N×a+(N+1)×(B-a)=N×B+A 求解a=B-A; 所以N+1出现的频率为A.例如实现7+2/5分频,取a为3,即7×3+8×2就可以实现。但是由于这种小数分频输出的时钟脉冲抖动很大,现实中很少使用。

http://space.ednchina.com/Upload/Blog/2008/4/16/dd3e4984-96b0-4a82-b83e-73160bb4f4c1.jpg


) Z0 l8 T0 ^0 C! o
0 r% e) O& A5 D! E

//很实用也是笔试面试时常考的,已经经过仿真

占空比要求50%和不要求占空比差别会很大,先看一个占空比50%的描述
  j9 g2 R& C" R1 n6 ~module div3(CLKIN,CLKOUT,RESETn); + b  c/ \8 d, T4 x, e; K2 @
input CLKIN,RESETn;
! u' C( |* V4 K& s) w7 {output CLKOUT; ' L2 `+ b4 [4 _5 k
  , |( Y0 |+ E. K: }7 z7 |% m
//internal counter signals 3 r3 \* A2 u7 a( ?- V
reg[1:0] count_a;
0 F, z2 o4 x7 V  R+ `reg[1:0] count_b; ! ?* X4 E- H3 y) Y6 f% S' T  \+ U
reg      CLKOUT;
' x9 {+ |/ B+ m  E! X6 ^  
+ V5 E( V" y3 L* `$ d0 I- X7 @always @(negedge RESETn or posedge CLKIN) ( C/ O( N+ Z2 V5 B* ~+ q
begin 8 B& w5 o$ U# W1 Q
    if (RESETn==1'b0)
4 u3 |; u; k' r7 W4 z9 w7 x        count_a<=2'b00;
# v: `2 h. n/ [  @: @, T8 U    else
. M6 ]2 r- B# a: o$ {8 R        if (count_a==2'b10) . l" H) o3 O% }1 S' ?
            count_a<=2'b00; - K# X- c! _8 C" G" x$ ~. W
        else : [' W) X5 t+ g0 w1 K
            count_a<=count_a+1;
! _# d/ k6 B/ t6 h$ Z& m3 c7 rend % o- j- q8 {5 K  k0 _
  
7 e. b9 p8 ?$ `* F  Z  K  aalways @(negedge RESETn or negedge CLKIN)
. c% W5 V2 X( i; ^$ bbegin
# W. z: F3 R2 B  k1 z; Z    if (RESETn==1'b0)
/ Y8 q. {2 s9 j- E; ^6 C4 K        count_b<=2'b0;
0 X6 _& A# N+ G7 G. F- o" D    else
' C8 N, v1 @4 I% z8 F        if (count_b==2'b10) & P% R! F, B4 I; \, }. A+ ?' X
            count_b<=2'b00;
8 T' h# u3 I6 ]        else
, @. ?$ F3 D: ]            count_b<=count_b+1;
3 m1 ]) C7 d  n# J1 Rend
, M, `  h: `. W0 y4 ?0 Q* q  $ O+ H. g. x! ]. U! K; p6 z
always @(count_a or count_b or RESETn)
' L/ Y) ^# R1 Fbegin 3 V1 f& U5 p3 U! I
if (RESETn==1'b0) , h  |. M- K. j$ K' E) }5 c/ P
   CLKOUT=1'b0; 7 f3 b" N* _9 h
else if((count_a+count_b==4)||(count_a+ count_b==1)) : f: V) e# p$ Z& z" D$ |& u' t
   CLKOUT=~CLKOUT; 9 b3 w4 P& U; f4 s! _
end
- s9 T) s! y8 k" k: V7 E5 q  
  b1 D6 y2 f. F% R  4 W5 s  u6 o. x% o
endmodule
4 ^: O7 A9 y/ P1 G7 ^  A  
# g; Y3 ?* ]! p+ C9 t, j2 W% E: i0    1     2     0     1     2
) U" P& {) F8 N' a\  /    /  \     \   /     /  \ 8 N0 H& i8 x' Y- ?  G
  0     1     2     0     1     2 * k9 D: ^! `, R  m5 E
  $ t$ ^2 d0 _6 D$ s( a9 B& m
下面是一个非50%的描述,只用了上升沿 ; m1 K+ c( w# G+ ]' e& k- A7 Z1 ~
  
% i! r: p' z; `2 i: Z: rmodule div3(CLKIN,CLKOUT,RESETn);
; K- G6 r/ w! J5 X, I- ^$ f$ I! \7 minput CLKIN,RESETn; $ Q) R7 j  i7 _6 [& d' `/ x
output CLKOUT;
) I4 z; j5 G6 z' s5 _  
' W; K+ M  Z! ?1 K. G/ D  
2 ^! V+ P$ S( f! V  ^' h% Rwire d; 1 D' C: W  P3 O+ ^  \: H9 {/ N
reg     q1,q2;
1 v7 k9 U. f& vwire         CLKOUT;
% o& g3 Y: S% z7 _  
1 V8 J) A$ @4 P. w7 Q4 c" Y: a6 N& w0 \" ~always @(negedge RESETn or posedge CLKIN) - Z0 L" }0 T6 ]6 e5 O* C1 P: C8 B% K+ i
begin 0 ~( G' i! U! p5 A
    if (RESETn==1'b0) ; l% Y4 F1 m- m$ b1 f
        q1<=1'b0;
7 s1 u( o; B4 l8 U    else , w1 e6 q5 M7 Z, p+ z; E' P4 v" P
        q1<=d;
- {- z+ h% `- l& h1 p8 u- ^; y: }8 Nend 9 t( L% d4 R3 O
  
0 E9 E9 n  J" b! g2 D2 }always @(negedge RESETn or posedge CLKIN) : z4 r  o; W6 G& g
begin 3 S3 U; ^7 N7 Q/ r5 c8 J1 n- R8 ~
    if (RESETn==1'b0)
/ n; B5 o9 e' g# p1 F9 j        q2<=1'b0;
0 `+ L1 Z- x4 E# G! @    else
- u8 y9 Y3 C0 x        q2<=q1; ; B0 ]) X2 S+ U+ U: n
end # y- ^8 b6 V+ ?. w$ U3 R
  . T2 b: c# m1 X4 d
assign d=~q1 & ~q2; : V- x3 z7 ~2 C
  9 ]+ P2 ^3 K& h# b- G1 q
assign CLKOUT=q2;
8 p) l. o: k  G6 h+ H& x  _3 {  4 N0 j' ?. J  c$ E
endmodule
) m: L8 [2 s/ l6 z0 N+ H9 C- @  
) w; q  Y# ]/ R( Q" F2 x  % k# p! \# h2 r; e$ F5 R. _1 Y& I
占空比不是50%,只用了单沿触发器,寄存器输出。

至于其他奇数要求50%的或者不要求的占空比的,都可以参照上面两个例子做出。/ g. H6 u4 ~7 h
占空比为50%的一个更好的实现。   
4 v; `) o# S+ \6 t& Xmodule div3(CLKIN,CLKOUT,RESETn); % Q- p2 c: r- G; c( D
input CLKIN,RESETn; 2 G- q  W5 e/ M" a- ^
output CLKOUT;
2 u7 o$ d! _+ M9 o) b//internal counter signals
2 ]  O2 ?( z& Z  I5 Mreg[1:0] count_a;
- p7 _3 V$ S, c) breg            b,c; / U8 E4 s" N" |/ K$ e/ V+ g- O
//reg        CLKOUT;
6 Y: z$ A  l9 Cwire CLKOUT; 6 e; @9 S. l' A7 a/ b+ ?
always @(negedge RESETn or posedge CLKIN) 8 [  ?. M* w% d
begin 5 s  m& R) }: B" f" q1 k
    if (RESETn==1'b0) ; i' T$ _7 z( s. S
        count_a<=2'b00; 8 ?1 e  y: I2 P6 T/ a
    else % l% u1 ?/ _# M. ?3 y; @1 u
        if (count_a==2'b10)
& k! i3 k& _4 Z) k            count_a<=2'b00; $ q" v4 I, I! T6 W5 [0 R
        else
2 I$ R/ ?+ p/ ~7 J& n            count_a<=count_a+1; 6 d+ r; G$ u/ Q$ d
end ! f2 U' k- J  l/ g- p# C
always @(negedge RESETn or negedge CLKIN)
# g& n4 O( o8 ^1 Jbegin - Y7 b: [& v9 x6 C) L& g3 ~
    if (RESETn==1'b0) ; k! ~) o" C+ K
        b<=1'b0;
7 G- C" r6 n& o" U: Z0 u4 Y5 P    else
0 Z% U  K; G+ b4 v, p0 S$ K        if (count_a==2'b01) 9 [2 w6 s4 n; `; W
            b<=2'b0; 2 n: R  w- y4 e, m$ w
        else
+ t1 I  w$ u  g7 n  f  `! V            b<=1'b1;
2 G4 Y9 s0 C8 U, }1 kend 7 m; d0 n$ T/ l3 T/ N* N2 K- F$ b
always @(negedge RESETn or posedge CLKIN) % o4 p) t- ?+ f0 g1 C% s
begin
  f9 f) I2 T- ~" {    if (RESETn==1'b0)
! {! I& n0 k. U: V3 A6 m        c<=1'b0; , ]( g1 @# l$ m# w, K
    else
( o3 A- J' N  w; [        if (count_a==2'b10) 6 G# W5 {. r; @$ K: _5 o
            c<=1'b1;
6 v7 ~- Y, M! I" ]( v7 M9 B        else if (count_a==2'b01)
% y) \7 c% G2 A% \            c<=1'b0; % ?6 M+ C* g/ i6 {7 T+ R) g
end ( o: U4 W! \8 g+ w' ?0 m3 F' R
assign          CLKOUT=b & c;

endmodule

1 l5 \4 _0 ]* t9 Z6 `
/ Z) y* Y4 m" f5 H  Q3 ]

任意奇数分频

//改变FRE_COF即可改变分频系数,这里为7分频

module div7(
8 F4 P+ S( f  X& O. [        clk,' n4 [: W; n7 f2 x
        rst_n,
1 L5 s6 f( q% Z: H: x        clkout,
) \# E$ n9 q$ n        clkout1,8 r2 j) R* P' v, o5 U
        clkout2);

input     clk,rst_n;
; H, X% L5 Q# e' Ioutput    clkout,clkout1,clkout2;

reg       clkout1,clkout2;
; g! l5 l! ]" A2 a3 Z( q) Jreg[2:0]  cnt1,cnt2;

parameter   FRE_COF=3'b111;           //更改分频比,偶数不成立
7 g. R( z: P7 ?! J0 \. k! h- v, nparameter   STOP=FRE_COF-1;      . n' a5 Q+ k2 F9 j2 o
parameter   THRESHOLD=FRE_COF-1>>1;    //除2操作

assign    clkout=clkout1|clkout2;                  //相或
2 M% \7 K! y: j3 }( x' T/ d% J
3 H. L0 R  D% p7 A) ~always @(posedge clk or negedge rst_n)begin          //正沿触发5 R, n5 F/ m9 T) L$ ?; ^) d4 D
  if(!rst_n)
; n! b! i4 y3 j* \1 f; B        begin
$ `4 [$ l: w3 [& ?1 H2 D         cnt1<=0;
0 V9 F" d. \* j         clkout1<=0;, D4 n% B& X$ l, i3 o) N0 s
        end
0 |) m$ F; P! E. C1 S! E# F  else begin& A. ^" ^+ K& x. ~  p; o9 x
    if(cnt1==STOP)
. h0 ?: B9 x: p, b% f* y        begin# {7 c) U! p1 x5 ]- R
         cnt1<=0;+ e! ?9 z, F0 d% ?! b- i4 J. Y
         clkout1<=~clkout1;/ F" v0 z/ |9 }& U% S+ E" y- k
        end
7 C! P, _) C. }. e  T    else begin
* ^1 Y' H6 t/ p- X0 G       cnt1<=cnt1+1;: f4 B. ^2 V5 x% l: B
       if(cnt1==THRESHOLD)# }: I: j/ c# ~) W9 B
         clkout1<=~clkout1;) n$ A. s0 ?- ?% J+ B7 e
       else% R/ X% \( p1 G6 s4 \
         clkout1<=clkout1;
7 L5 I2 Z! ], p" `7 `& ~    end
# _! N* k+ c, D, a0 b7 J   end
5 b/ c$ v" c: Y end

always@(negedge clk or negedge rst_n)begin        //负沿触发0 K) O% I& {3 i, @
if(!rst_n)begin
' y* p! P: D0 ^# y% h% c8 {      cnt2<=0;$ q! T8 U+ ~% F9 U
      clkout2<=0;6 p4 y% P$ t* H* ^- V) ^; _
       end, Z' l) D6 a& ]- a* G, C
  else begin
% r  t5 B1 R0 |0 o2 y& c    if(cnt2==STOP)& e4 d+ f4 L) I
      begin, @1 J/ P4 q2 t9 S# }& ]2 f
       cnt2<=0;  Y  u, }9 \0 r1 ]0 _
       clkout2<=~clkout2;7 q1 x  F4 A, M2 _8 Y! @2 D4 t
     end
- ?) B' O5 ^: w  else begin
9 `; I6 L* _- }- `7 l8 {      cnt2<=cnt2+1;8 z2 m* E/ a; `- L; v# h, m
       if(cnt2==THRESHOLD)
( I+ p1 {" }4 ]' z         clkout2<=~clkout2;
" |1 S% E7 o3 T      else' r, M. d- C+ L7 L
      clkout2<=clkout2;3 O2 _4 r" I. j5 ^. c/ E) k3 z
    end
7 d5 T+ K+ N7 w/ e   end8 ]3 X( s' |  X- T) x
end   

endmodule

 楼主| 发表于 2012-2-11 21:05 | 显示全部楼层
分频.jpg
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 12:03 , Processed in 0.037266 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表