找回密码
 注册
关于网站域名变更的通知
查看: 601|回复: 3
打印 上一主题 下一主题

关于分频器的FPGA实现整理思路

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-24 10:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
8 ~- W% R! I! Q7 r$ R3 }0 h7 G: y
频器是用的最广的一种FPGA电路了,我最初使用的是crazybingo的一个任意分频器,可以实现高精度任意分频的一个通用模块,他的思想在于首先指定计数器的位宽比如32位,那么这个计数器的最大值就是2^32=4294967296,
4 W7 q  ?3 h+ I- j2 |- T. {4 T; v/ l# Z' Z* |0 W; A$ t
假设系统时钟为50MHz,那么假如要想实现输出频率为fout,那么可以使用的频率控制字为:' w1 W8 u) A) n( ~) `5 g

6 @4 s# r# N* Q+ r& ]K满足关系:
0 v3 M2 q$ M" ~; R7 A; o7 X0 A
$ D6 H4 c! o! H# t! o- ~那么设计计数器在每个时钟上升沿累加的值为K,当计数值为2^31时,clkout=1;否则clkout=0.最终即可以实现任意频率的输出,精度的计算方法为当K=1时,可以得到clkout=0.0116415321826934814453125Hz,也即是说可以输出的最小频率为0.011Hz
- r8 t7 F: k6 |& R- o
3 m( a# R2 S, h. N此外我们最为常见的分频器分为以下4种分析:
: P' V7 @; S: B( c2 B; {1 f. Y
) M8 ~" p! E4 b" _! T4 g4 h! P7 {1.偶数分频
5 q1 j9 q! m1 o% t" y% W0 i- z2 d6 S7 a' o* W! Y6 f% z
最简单,要想得到分频系数为N的频率输出,设定一个计数器,这个计数器从零开始加1,当加到N/2-1时计数器清零,或者clkout翻转,以此循环,即可实现偶数倍分频。
! l" g3 C% V8 T% W
4 t) S& c0 [9 Y+ ^3 ~- ^- v2.奇数分频(分占空比不确定以及占空比50%)
. P# |1 E/ h. m" z0 _0 Y' N9 x3 P! X
方法一:分频系数为N,占总比不确定:以三(N)分频为例,上升沿触发计数,计数器计数到1(N-1)/2时输出时钟翻转,计数到2(N-1)时再次翻转.代码为产生1/11占空比为十一分频时钟:在计数值为9和10时均反转时钟,是产生抽样脉冲的有效方法:7 g. Y4 H4 l. h7 C0 K

8 [4 B- F# K2 ^% ^- Ealways @(posedge clk or posedge rst) begin
% ]  g: x: R2 U6 A5 b8 G  M2 t: q              if(rst)begin   //复位
) z* }. R8 N  v; V$ P" F0 J                     cnt<=0;+ _; x7 s' _4 j& \8 o
                     clk_div11<=0;8 l! h. a) c- b% |$ @: `  k2 x
              end6 K4 p8 b7 g5 j2 A3 D, K$ L# }
              elseif(cnt==9) begin
. ~' V# ^0 v" C6 k. I3 s9 S                     clk_div11<=~clk_div11;   //时钟翻转
; d0 C+ Z5 Q- v2 C; `0 G                     cnt<=cnt+1;    //继续计数' S; \* D- K1 g) i% h
              end
  s9 S, \/ z: @  g5 ?) E1 V( Y6 c5 T              elseif(cnt==10) begin6 b7 R, u2 q) e  a3 R' w. \1 c3 n
                     clk_div11<=~clk_div11;   //时钟翻转# B6 E' L6 y8 c/ k$ V
                     cnt<=0;    //计数清零
2 A; G+ L; f1 j              end3 _* l: X( o/ V$ E# v
              else
4 d. [& ~# V2 z+ L                     cnt<=cnt+1;
" i& X5 ~  W% X" ~! N( \7 [       end
' {  l  Q$ }5 T; E1 W5 t2 {& \$ k
- S2 Y) y9 Q. \9 n7 x占空比50% ,则可以在上面的基础上,加上一个下降沿触发计数,然后将上升沿和下降沿产生的时钟进行相或运算,即可得到奇数分频输出。
) s9 o5 ^  Z2 z* U8 p$ O  y$ a8 S) j8 l1 S2 x4 H9 F9 V
reg clk1;
0 S: A; ?. P/ O4 r2 D+ ?       reg[1:0]cnt1;
% W. i7 L9 f. u      always@(posedge clk or posedge rst) begin  T2 `+ p3 U" |7 d1 [: P+ p
              if(rst)begin   //复位
0 f; M  d2 l5 i6 J- U2 D1 N                     cnt1<=0;
- o' p; c6 M! X% m( m8 M5 H                     clk1<=0;; }( f* `/ k# ^
              end
2 f# T% c8 O1 X' P& s7 S) b+ r9 R              elseif(cnt1==1) begin
0 I" e0 M$ D# C+ N. G: B                     clk1<=~clk1;   //时钟翻转$ d: c( X! H. _1 C
                     cnt1<=cnt1+1;    //继续计数
& y& ^) G$ R9 |1 H              end
4 U. H# y8 P6 o( Q3 ?              elseif(cnt1==2) begin$ N9 L  I, H" c& g  m% d) J6 U
                     clk1<=~clk1;   //时钟翻转; x! f; b1 [8 D2 y# R+ S  s  A1 S
                     cnt1<=0;    //计数清零
; l8 x5 l2 u# R& L5 b              end
" h' ^+ p# U6 m: d  [; B* ^+ |              else
; U8 |4 T2 {1 U1 p. G, @& k                     cnt1<=cnt1+1;
4 ]" `0 h0 @" f( w2 o& ^       end( b, c" }8 _. J$ k
& H5 O6 B% q" I3 j) c9 W! G
       reg clk2;5 S4 L* K& y% B* W! B
       reg[1:0]cnt2;
$ q; h9 e8 H( H' R6 z# h2 n      always@(negedge clk or posedge rst) begin
& K, I: x# ]8 @2 ~7 C              if(rst)begin   //复位6 H0 E) F# a1 Z$ F6 L7 {0 M
                     cnt2<=0;
8 e, A! p% y* r. X) W: W                     clk2<=0;: Q5 P0 P& I1 p, [
              end" A& |5 F% e% }
              elseif(cnt2==1) begin
0 R, n+ q4 Q, |# A. U& g                     clk2<=~clk2;   //时钟翻转, y0 I1 _& T/ ^  o5 B
                     cnt2<=cnt2+1;    //继续计数* m, \! f# ?! I; x0 q2 w
              end
6 {* f0 ~& K8 Y: ]  q: [              elseif(cnt2==2) begin# b. q; p% G0 Y+ z7 G; R
                     clk2<=~clk2;   //时钟翻转
3 E7 k" b: u* Y1 H* R& c                     cnt2<=0;    //计数清零
, ?- I! n5 M& g0 h& L  P# b$ r              end
5 {# I" \( i6 |* `& q              else
. r& t  ~( q/ a( n; u7 o. n) e                    cnt2<=cnt2+1;: G0 C* G9 ~3 Z, o* Z  h4 i7 F$ \
       end. _) z, j5 h+ E' ?
7 w' M1 V' n" i) h8 N" W' e
             assign clk_div3=clk1 | clk2;  //或运算
' D. j7 Z- a. k4 r2 i1 U
; j; }7 Y0 {7 `% o% h; }* a 2 s$ D) T1 r- R, g' W
图1 50%占空比的三分频电路原理图
4 `  r3 p4 T3 u% S. k
4 Z7 R5 M6 C3 W( L8 p
8 J9 ~+ G/ ]7 _, a: I4 F  a6 ]$ q  m* ^: u, m" e# `7 e
方法二:对进行奇数倍n分频时钟,先进行n/2分频,然后在二分频得到(这部分先讲半整数分频)
8 ~3 M1 T$ I2 n, w5 c$ P
3 v( r5 {) [& b' a7 ~+ i亲测有效代码:: ^8 U0 q, t3 K1 I

1 d/ {% i" c( T6 fmodule ModuloN_Cntr(input clk,rst,output clk_out);
& h# J9 M1 a& l3 b6 D" Sreg [1:0]cnt1;
0 q  U( s. i6 ureg [1:0]cnt2;1 J/ ?% j0 Y; l% H
reg temp1,temp2;
  Y. Y* r4 I2 r- h5 _* s0 i3 Zalways@(posedge clk or negedge rst)) b' A' v7 V; l/ R: I
begin
5 F/ W2 A% b3 f) V9 W+ c! s    if(~rst)
% N3 ^7 P# C1 K$ @4 V, v9 E    begin$ i5 u$ d; x1 ~" o6 `
        cnt1<=0;: V" R/ s* {* `
        temp1<=0;! g$ x/ E) K4 q5 d
    end
0 [0 M' I7 m: Q, k    else
4 J  U5 U) [3 f5 b5 F- r    begin
. j1 Z. i6 L! L) B) M- N  d" ?6 n7 ~8 v        if(cnt1==2)- W& I5 o/ u/ v: r/ a
        begin
& \# s# ~) ~3 ^* O" z6 @5 k$ g1 b6 _            temp1<=1;/ H# u3 x/ A. L0 O# h
            cnt1<=0;1 Q& |% K# d- F  H1 j/ s
        end
4 e, y% x2 [7 S, r; t        else( o4 S  [* T8 n
        begin
' E, H; Y/ R/ q, q            cnt1<=cnt1+1;
4 H% i0 @; T5 q            temp1<=0;
4 S) V( E3 e% E4 z. G        end        8 ]0 r( \- z/ W2 w
    end        ; ^+ ]9 N# U# |6 t# X, w3 c/ p  L% u
end, z/ i$ q; b$ B) }
always@(negedge clk or negedge rst)
4 m) B  Y7 A& R$ j) z/ k( ibegin
9 S* f& \! O  k! d/ P    if(~rst)
, ~; }3 h% Z& o# V# P8 O    begin6 ^9 j2 P$ l7 p: p
        cnt2<=0;
3 F+ V$ h% V3 r+ @, d5 `1 e9 d% p/ t, i        temp2<=0;
9 c& I2 {$ B4 b5 z    end
/ F' k" ?- _3 n9 c/ Q& C7 d    else + N5 y% D9 {) T' B. n9 _3 @
    begin) t7 ^0 z) I/ T$ U
        if(cnt2==2), \3 L" t7 d7 J6 w7 ~' C
        begin
$ I$ X+ U' y) f7 b            temp2<=1;
9 Q4 \0 h4 z, p" ^0 X3 k            cnt2<=0;
! K9 [' k/ ?4 M) T) o! S        end, H8 R, k8 _! z4 o
        else% e& T' [6 l  g/ [
        begin
" |/ t6 ?$ h* }+ S            cnt2<=cnt2+1;' {  u; |1 P' f+ {
            temp2<=0;  ^8 H1 s, Z8 K4 Z
        end        
5 ]. b* [7 Q) }& ?' `+ O    end        
8 r! ^3 F) x! Z9 o* R+ jend
* I  c  R/ E6 m! ]% kassign clk_out=temp1|temp2;
+ J' Y* v4 b" r, M3 e, Hendmodule; U1 R2 Z9 @6 g2 B* k4 n+ K& N
$ l) ~* h' U/ q+ V* x: V9 \0 g8 K, ^: ~
仿真波形:6 Z, e) D$ B, T8 C: u) X

3 e+ H: L# y; F/ {! H- t* d ( l& A2 E9 O- m( J

' b' Z5 q0 a! u5 _7 j7 t3.半整数分频" F8 E0 q9 @) v$ ~( ~

! @/ u2 T7 C4 {0 @半整数指的是N+0.5分频器设计:先进行模N+1计数,计数到N时输出时钟赋值为1,然后当计数到0时,输出时钟赋值为0,因此保持计数值为N的时间为半个时钟周期即为设计的关键,从中可以发现,计数器是在时钟的上升沿计数,那么我们可以让时钟在计数值为N时,将计数触发时钟翻转,时钟的下降沿变为上升沿,因此计数值为0,所以每产生一个N+0.5分频时钟周期,触发时钟都要翻转一次,以2.5分频为例程序如下:
' I3 T: h3 R% n+ [* W$ _% F: D" M0 X. S4 l, |& i# Q
//异或运算2 w5 ]" k0 \* m2 n

& `/ h" p" l$ P( D6 p0 M2 C! z       assignclk_in=clk^clk_div2;
( U* ?1 I6 ^- R1 q
* ]' M7 _* ]% s. l) k& _" ]+ I       //模3计数器, O: ]0 u6 [3 k  a  y5 i

  O$ ]. @& q8 Z  e6 |. j       reg clk_out;5 }- ]$ y% h& S/ D
3 o7 }+ `0 T; u9 Q
       reg [1:0]cnt;" Q& r8 Y0 _# W% }& Z0 {# f  Z+ I" i
# a5 ]( H3 O! Y" D0 q
       always@(posedge clk_in or posedge rst) begin
3 P$ X; Z: E# V+ s; s1 ]' F2 p+ z/ N" X; @$ y" u% J6 W) E3 G
              if(rst)begin   //复位
  A, b9 O( s9 W$ ]# j2 ?1 Y
. j2 L+ F6 ^- @0 c' n9 M                     cnt<=0;
! e. V6 A, o! s- x  |$ m, ?
2 d; N6 a8 H" T) s$ D* M  [                     clk_out<=0;# _6 E7 w' i/ L: H8 [' Q4 I
: \: H! q/ H' j  h: v/ m7 R
              end- Y, R( x1 t# z' d0 C& ^: W

; ]( Q# x7 s* X              elseif(cnt==1) begin) ~- U; Q* t  U4 |' {
4 ~( Y) I) `+ y4 p1 P) Y$ m8 a6 Z$ M
                     clk_out<=~clk_out;   //时钟翻转7 z! U( y! Q9 |# O1 S

: c8 L3 Z6 q1 ^: Q# i8 _                     cnt<=cnt+1;    //继续计数7 x' z5 k* k$ ?+ D9 L" b

+ k- P) }- k+ d$ G0 y              end
5 y) l- |' b0 L4 o+ \( Z7 r& C5 }% @* t5 h
              elseif(cnt==2) begin7 P/ l2 j, }3 h* {3 N
7 {- f5 L5 h) R+ F) W
                     clk_out<=~clk_out;   //时钟翻转: R( u' Y* D. d/ B- S

2 r$ T# k9 R0 I$ P; \                     cnt<=0;    //计数清零
4 e5 a  A1 l9 h- U% ~+ d+ n* [2 D+ S2 [8 c
              end: r/ p! A. n. @% i; ~! G% ?  X1 B

. O4 S' p4 U5 S" x: Q! Y! d( W              else
- J3 o6 ?7 ?; p" B1 w" X
/ N1 H" C+ t* B: L7 q5 m                     cnt<=cnt+1;
* N; \! w4 Y  _2 ?1 C: B; F, T/ n
       end; l8 }1 H5 z" V$ x9 M

: y$ s+ K4 I7 z* X9 F       //2分频1 t# s6 a1 H% }2 J/ y
9 f' A  s2 N' X
       reg clk_div2;0 L9 A! i/ I6 T
# A# R$ ~) R# H& h- Y
       always@(posedge clk_out or posedge rst) begin
( c$ G5 W9 H' y" O2 d' g: U# b4 s
1 @3 k- [. [" B! A$ _8 T              if(rst)  clk_div2<=0;  //复位; }( h3 l6 Z* u2 z
/ J2 C0 p. b$ X
              else  clk_div2=~clk_div2;( x% q- K7 o8 A# F4 N  _  W" o

* Q3 d$ _# }: _1 N% i       end
4 z: p& _" F  K2 V8 ]6 z8 e; ~; D8 S# d! p! ^$ W. i

, k$ u7 ]4 n! x: C图3 通用半整数分频器的电路原理图, o- G# F% ?$ ~( U- S& u
; k' d0 Z  K' `% ^

& b5 i& ^: ?& h1 Q. i图4  2.5倍分频器时序仿真图! r" F7 u9 h. F4 P; K) r6 X+ `

% n5 A, n" ]  j: `那么5.5分频呢:
9 p2 z$ k# T9 Q( ~( h2 M7 Q; k' p7 Q) ?6 }' M9 q" u7 _3 s
代码:通用的这里N=5;
: [: ~3 F4 n4 Y* \+ r8 o6 v# ?
$ ^; f, F  n  G9 omodule ModuloN_Cntr(clk,clk_div,temp1,temp2);//N+0.5
' y5 i# z, a5 y9 x& iinput clk;8 ?: ?: r8 K  g, L) G) k
output clk_div;
* K( {5 r/ g2 w  c. k' i  qreg[31:0]cnt1=0;
+ s  y- k1 v7 i4 \: c. [9 {reg[31:0]cnt2=0;! _3 E$ p8 z9 [" B) w
output reg temp1,temp2;/ v2 G  u  {9 C' m" g& e
initial begin temp1=0;temp2=1;end   //首先进行初始化,temp1=0;temp2=1" [/ `& d1 L# w
parameter N=5;  //设定分频系数为N+0.5  Z: F+ u- k) K+ t/ U, o# O
always @(posedge clk)  //temp1上升沿跳变
, Y8 C! p* E6 N% s! bbegin' j! y+ u9 P. \, F8 p
if(cnt1==2*N)  //2*N" P3 [# V8 c2 G( m* D/ `  @
begin cnt1[31:0]<=32'd0;end. N7 ^3 D/ ~; [; a$ t5 C
else begin cnt1[31:0]<=cnt1[31:0]+32'd1;end
+ Y8 b" n( R- }3 G1 E8 vif(cnt1==32'd0) begin temp1<=1;end   //高电平时间为N+1;
' v7 @1 [+ R$ q( r1 N& |if(cnt1==N+1) begin temp1<=0;end   //低电平时间为N;) X. v  r3 M, @( U% ^; [9 E' R/ h' |
end
' H! ?. H, G( v9 f" Malways@(negedge clk)  //temp2下降沿跳变. t4 `. S5 ]9 v3 `
begin5 P7 \+ d! _1 e1 Q) s) w
if(cnt2==2*N)  //2*N
! I; F4 }, W. I7 T8 ~& a; b) x: Nbegin cnt2[31:0]<=32'd0;end
% J( ?: ^$ q( {  v" ~9 i, O! Eelse begin cnt2[31:0]<=cnt2[31:0]+32'd1;end
: h  w" b! {* |0 }1 u% f9 W; N& Qif(cnt2==32'd0) begin temp2<=0;end     //低电平时间为N;
1 T0 d" ^2 K, i+ l( D8 hif(cnt2==N) begin temp2<=1;end    //高电平时间为N+1;+ y0 H' W& Y9 k
end+ O. L2 V0 j1 O) }) d; c& t
assign clk_div=temp1&&temp2;  //逻辑与+ T) t' O; S6 f
endmodule
$ c( o9 B6 @* }* ], r- ~//如果要进行N+0.5分频" a( s# E. t8 }* z
//思路:总的来说要进行N+1+N=2N+1次分频
" ~' i+ |" z3 y//在时钟的上升沿和下降沿都进行跳变; A, R' @# s; s, c
//上升沿进行占空比为N+1比N的时钟temp1;
1 ?, i7 s7 T9 ]1 y8 m/ g( C. ^+ S//下降沿进行占空比为N比N+1的时钟temp2;
: n( h" h7 l( |2 x* u//最后div=temp1&&temp2 即可得到所需要的半整数分频2 H3 Q; ^. g% q6 z# \( m2 T
% _$ K+ I2 j/ W! A# J% d) ?  V
仿真波形:. O( N7 G7 [6 ]8 G- R) D$ J
8 g; V3 H+ c6 q! d4 W: V

1 `+ ?* S1 j6 c+ C6 R4 u$ v& B& G+ n& k% u7 x; {
4.任意小数分频( M0 H# b( }& W2 c) ?

% x7 k- P  U+ r! l+ S: w0 y小数分频器的实现方法有很多中,但其基本原理都一样的,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个计数周期的总体平均意义上获得一个小数分频比。一般而言,这种分频由于分频输出的时钟脉冲抖动很大,故在设计中的使用已经非常少。但是,这也是可以实现的。以8.7倍分频为例,本文仅仅给出双模前置小数分频原理的verilog代码及其仿真图(如图6),具体原理可以参考刘亚海的《基于FPGA的小数分频器的实现》以及毛为勇的《基于FPGA的任意小数分频器的设计》。、 / H& F* F4 g# ]  U, S

" e+ @$ F' D1 A9 `( t# ]/ n( r& y还是放下代码吧:
4 ^. n2 o! E( y! p, }: L# ^" a$ z4 f" e. v5 U
//8分频  g+ i3 R8 K5 Z% N/ m3 G# g
       reg clk_div8;
3 ~% i7 S  z0 X       reg[2:0]cnt_div8;
3 I* M% q& K# L% Q6 m' H       always@(posedge clk or posedge rst) begin* l4 m9 d3 y) T) y/ _2 L
              if(rst)begin  //复位0 B9 C. [" {7 m  }: T5 w
                     clk_div8<=0;
* x  c3 f2 P' D7 N$ O0 g                     cnt_div8<=0;% ?. ~" d) Y$ F" a1 Q
              end0 }* I+ T# i/ v+ W  C( `7 w
              elseif(cnt_div8==3'd7) begin
  L+ ?. U: ^, g0 H                     clk_div8<=1;   //置1( g8 l  {: W/ m! \! J" \" q5 N
                     cnt_div8<=0;
8 M8 G6 v. p8 z; n                 end
! j6 r6 s8 M9 {) K              elseif(cnt_div8==3'd0) begin4 D6 n/ }1 d5 M8 @, G% ~0 C4 Y3 L
                     clk_div8<=0;  //置0) b! }$ b- [6 O5 ?$ G, z
                     cnt_div8<=cnt_div8+1;# r$ x5 f6 O8 s. Z: x9 }
              end2 d9 R) J8 ?2 t& O
              else
# [+ q" k5 P+ X7 H  s* a                     cnt_div8<=cnt_div8+1;+ y( X9 W: k7 l' E
         end6 S3 b: v7 m8 n, }) f3 O
( Z, d6 Q2 ^* _, X
         //9分频  c1 q! Q4 E5 z. u& O! x
       reg clk_div9;
: P* v& P4 o. f! R1 o% M* g       reg[3:0]cnt_div9;5 t( F. ]' |- N5 C- d, C0 ~- F) d9 C, Z
       always@(posedge clk or posedge rst) begin
3 c0 o2 B- a, Y! J              if(rst)begin  //复位, l  c* x! m# j2 S) f, E
                     clk_div9<=0;& i9 r% h) H" B% M& _
                     cnt_div9<=0;
% D8 R! c1 v2 u! ]              end  L# Y, w. A6 t8 ]/ x
              elseif(cnt_div9==3'd8) begin
3 ~. a2 m! g, R1 z8 V: Q9 u  n                     clk_div9<=1;   //置1* E1 v7 R0 R5 \" M$ x0 c
                     cnt_div9<=0;" ?4 W3 B: K3 N9 b
                 end# o# {  F; K1 n( d
              elseif(cnt_div9==3'd0) begin, D+ L8 `  g) L  X  S
                     clk_div9<=0;  //置0; g! G: f, t) h7 U) x! g
                     cnt_div9<=cnt_div9+1;7 ^2 H& ]5 y' Z2 @* z+ g
             end
) _# D) a5 j' C5 W5 G/ i: n* z              else0 b$ {$ f/ K; B9 d! f
                     cnt_div9<=cnt_div9+1;. j+ C' C- {) D9 ?
         end) Y! H- @, P' D4 @
              //控制信号$ a/ G% y$ ^9 v, P
       parameterDiv8Num=3;, v- w6 N; d/ J8 u0 ?. Y; Y/ j
       reg ctrl;
$ L# z0 q  B% @& W# ?1 m       reg[3:0]AddValue;
; ]6 C) @0 P. P7 A       always@(posedge clk or posedge rst) begin
/ N+ A0 q  S, j9 a              if(rst)begin  //复位
: {# u0 T: w$ _: w6 F3 }" F                     ctrl<=0;* }5 Q5 V( K$ ~( Q# \0 ]% ?4 q
                     AddValue<=10-7;0 b% A$ z$ W* K7 w2 c
                  end
( V0 a; o- p5 s) q; R  Z3 y: m% ~              elseif(AddValue<10) begin+ r, G$ k/ u/ _. E
                     ctrl<=0;0 w% _1 }+ g/ L* \6 I
                     AddValue<=AddValue+Div8Num;0 {' T8 q# b' P! t. J
              end
. @# T' n4 G8 s/ R1 X. a$ c             else begin
; S$ `8 X2 |+ t/ y& v$ t9 e3 V                     ctrl<=1;
( m: Y6 J4 h* r$ D* n0 L+ c. K                     AddValue<=AddValue-10;
. W5 a2 x5 k& r              end
/ L" C+ M2 x/ q6 d5 d. Y' k4 A, I2 }       end/ Y0 W: t' l& L. F" G

- r1 K- A8 t- A# {% j       //选择输出6 Z3 Y) }) @$ G* P. s
       reg clk_out;
# \4 U2 E# C' C# J       always @(ctrlor posedge clk or posedge rst) begin# n4 P2 Z( l! W0 H0 ?
              if(rst)  clk_out<=0;  //复位
$ a; z0 Z! r1 E2 {              elseif(ctrl)  clk_out<=clk_div8;: @/ ~  T0 U2 J# `' O( d
              elseclk_out<=clk_div9;/ o& x$ V3 x% b) L4 h
       end5 |5 A, a) Y: Q$ J8 U

+ A' P4 X  C- }; |' {) G8 B3 Y6 [ & k& o9 D( ^5 w( V& c3 H" h5 m
图6  8.7分频器的时序仿真图) b' D8 E, f, L9 }, j% Q# x) B5 `
, _( b' }* U3 i# `* O

" p9 x: n- z( m0 |7 m7 Q
7 _% H  ~! B  H7 h3 ^; B4、总结分频器是FPGA的基础,而且在FPGA逻辑电路设计的时候是经常使用的,希望大家对以上的整数倍分频和半整数倍分频能熟练掌握' l" {+ ?& P9 m" U" ]4 Q; {) B

该用户从未签到

2#
发表于 2021-6-24 10:48 | 只看该作者
分频器是FPGA的基础,而且在FPGA逻辑电路设计的时候是经常使用的0 Y: q6 m9 }1 i1 f9 t

该用户从未签到

3#
发表于 2021-6-24 11:28 | 只看该作者
频器是用的最广的一种FPGA电路了
2 ]& D3 J! b/ w+ z

该用户从未签到

4#
发表于 2021-6-24 13:16 | 只看该作者
不错,就是有的看不懂  X- m8 k! B, i. H5 T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-11 21:06 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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