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

Verilog HDL 任意整数分频

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-5-22 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    Verilog HDL 任意整数分频

    2 ]! J' i/ u& s7 F2 m3 ^0 引言
    " p4 f8 z. P" v4 A  
    , l  ]. W+ g3 n: E1 L- ], |  在数字逻辑电路设计中,分频器是一种基本电路, 通常用来对某个给定频率的时钟进行分频, 得到所需的时钟。时序电路设计中需要各种各样的分频器来获得不同频率的时钟,其中以整数分频器最为常见。整数分频可以简单的使用模n 计数器实现,即随驱动时钟跳变n 次后就输出一个进位脉冲,然后立即被清零或置位,再开始新一轮的循环的计数。" D: E$ \7 v$ A, X. F, b
      模 n 计数器的进位脉冲的宽度一般与驱动时钟相同,这对于边沿驱动的时序逻辑并不会带来什么问题。但是在某些需要使用电平逻辑的设计中,我们更希望分频时钟拥有50%,或者与驱动时钟相同的占空比。这时就需要通过另外的逻辑方法来进行分频,或者使用PLL。. ]3 d. r+ V5 Q( {
      在基于 cpld(复杂可编程逻辑器件)/FPGA(现场可编程门阵列)的数字系统设计中,很容易实现由计数器或其级联构成各种形式的偶数分频及非等占空比的奇数分频,但对等占空比的奇数分频及半整数分频的实现较为困难。
    3 A' a/ z5 t( N& f) W' A) E  本文利用 VHDL(超高速集成电路硬件描述语言),通过Quartus II 7.1 开发平台,设计了一种能够实现等占空比的整数分频器,这种设计方法原理简单,可重用性好,而且只需很少的逻辑宏单元。. y( D; B9 |6 n% r: h! j( y
      9 Q% T# M* t$ J, I* F) ^9 H
      1 分频原理
    , A  @% y% k- j6 |/ u+ W+ i( p  
    6 X+ @' Z6 X3 g6 Z* n  1.1 偶数倍(2N)分频
    1 e7 E/ h/ `# K( z, o  使用一个模 N 计数器模块即可实现,即利用模N 计数器从0 开始对输入时钟的上升沿计数,计数值等于N 时,输出时钟进行翻转,同时给计数器一个复位信号使之从0 开始重新计数,以此循环即可。为偶数倍分频原理示意图。% N4 u; D7 H, ^
      
    $ i2 G+ Z1 p+ u) p$ m  1.2 奇数倍(2N+1)分频( H8 U; `: |1 w  b( R1 I6 o
      占空比为 X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器模块可以实现。取0 至2N 之间某一数值X(0<X<2N),当计数器时钟上升沿从0 开始计数到X 值时输出时钟翻转一次,在计数器继续计数达到2N+1 时,输出时钟再次翻转并对计数器置一复位信号,使之从0 开始重新计数,即可实现。, v# h: ]  y7 N0 B! S
      9 ?; {! x4 C) ^7 }# P5 m* }
      1.3 占空比为 50%的分频: y9 t/ {  e" f& B9 y  Q
      1.2 中占空比为非50%的输出时钟在输入时钟的上升沿触发翻转。若在同一个输入时钟周期内,此计数器分别在输入时钟的上升沿和下降沿触发翻转得到的两路信号,再将所得到的信号进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。当然其输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理如所示:
    + I8 P7 w- i5 i; D; T2 @  
    9 y, |0 S3 Z+ n  1.4 N-0.5 倍分频
    1 l# _0 j* ], o  采用模 N 计数器可以实现。具体如下:计数器从0 开始上升沿计数,计数达到N-1 上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历0.5 个周期时,计数器输出时钟必须进行再次翻转,即当CLK 为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到N 而复位为0 重新开始计数同时输出时钟翻转。这个过程所要做的就是对CLK 进行适当的变换,使之送给计数器的触发时钟每经历N-0.5 个周期就翻转一次。本设计未作要求,因此仅叙述原理,实际并没有完成该部分设计。, d" T- i  {7 O* d" m0 X/ `
      
    7 ?$ J3 r' m  U9 g6 `  1.5 对于任意的 N+A/B 倍分频(N、A、B∈Z,A?B); {6 o" Q  b' F( I: s
      分别设计一个分频值为 N 和分频值N+1 的整数分频器,采用脉冲计数来控制单位时间内两个分频器出现的次数,从而获得所需要的小数分频值。可以采取如下方法来计算各自出现的频率:
    # h: @8 A0 W7 \/ C* g$ l  设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就可以实现。但是由于这种小数分频输出的时钟脉冲抖动很大,现实中很少使用。这里仅叙述原理,并没有完成该部分的设计。) \: A: U3 k1 n
      # k+ z/ E" a& U" M+ i
      1.6 利用 PLL 模块设计分频器
    2 m( F: r+ R+ c; }  利用 PLL 模块将待分频时钟(CLK)进行倍频得到待分频时钟的2 倍频时钟(2CLK),这样以来,为了完成对CLK 的N(N∈Z)分频就只要对2CLK 进行2N(N∈Z)分频,也就只要考虑偶数分频,从而简化了设计,但由于PLL 输入时钟不能任意改变,使得设计有较大的局限性。' R0 H7 |1 ~, f1 ?
      & H0 e# C- W( w2 e7 a2 E
      2 具体设计思路
    & ]% A( B: f; [  2 D( o1 [' Z- Z* Z% f
      2.1 单纯利用逻辑代码编写0 L) y% x% p# F: ?$ Q
      主要设计思想是通过对分频系数的模运算将偶数分频和奇数分频分成两种情况分别考虑,偶数分频比较简单,此处不赘述,可参考原理部分的叙述;奇数(2N+1)分频时分别对待分频时钟的上升沿和下降沿进行计数,上升沿计到0 和2N 时翻转输出信号,并重新计数,下降沿计到N 时翻转输出信号,并重新计数,将两信号相或就得到占空比为50%的时钟。据上述思想,设计出divider.vhd。在divider 基础上对代码进行优化,上升沿计满2N+1 时翻转输出信号,下降沿计满N 时翻转输出信号,两信号相异或就得到占空比为50%的时钟信号,设计出DIV_N。+ v2 h1 V& ~6 ~, x: |
      % }3 e9 z' N0 z4 p3 }" L
      2.2 调用 PLL 模块完成设计9 N6 ^, y6 E& t4 M9 e* I* w+ ]
      调用 PLL 宏模块,将输入进行倍频处理,再对PLL 模块的输出时钟进行2N 分频即可。
    2 I% n  Z5 X3 }4 f5 A, t9 j& O  
    % V# y0 m- Z+ B9 z3 h9 Y/ V3 r  3 仿真及综合情况
    ' J  V2 \7 h5 }( K% |1 E/ g3 n  
    ) h: ?# O$ [4 O; a. F  3.1 软件仿真
    4 d% U+ P; A0 D" o+ H9 K  ModelSim SE 6.1f 和Quartus II 7.1 两者比较而言,ModelSim 的仿真更为专业和精确,因此本文用Modelsim 完成仿真工作。但调用PLL 模块时用到了Altera 的库,因此无法利用ModelSim 进行仿真,仅给出了在Quartus II 中的仿真情况。由仿真情况可以看出,采用逻辑代码完成的设计很好地实现了任意分频器的功能,利用PLL 模块,输出时钟相对输入时钟有较大的延时。
    7 s- ~" L1 o& r2 a0 H+ ~' E  3.1.1 在 ModelSim 中的仿真/ \0 h' R* C8 M* }0 {, \* I( X
      使用 ModelSim SE 6.1f 对DIV_N 进行仿真,为偶数倍分频仿真结果,为奇数倍分频仿真结果。
    8 R  T: Q; _  @! G  3.1.2 调用 PLL 模块仿真情况' t) X6 p2 S7 H" n* a
      在 Quartus II 中定制PLL 宏模块,对输入时钟进行倍频,然后再对所得时钟进行2N 分频,可实现任意分频。仿真情况如所示。
    $ L$ d1 W6 n# k  
    2 b( P0 c4 m3 P$ l  3.2 综合情况:1 a1 J2 t) A, T3 Q( T* `
      较 divider 而言,DIV_N 代码数量更少,同时减少了两临时信号的翻转次数,降低了程序复杂度的同时,节省了设计所用的逻辑资源。& Y+ \+ Z7 Z+ |5 X1 _3 D6 T
      3.2.1 在 QuartusII 中的综合情况
    2 e1 _2 x% J8 d/ f  测试的硬件核心为 Altera 公司的FPGA 芯片,型号为:EP1C3T144C8,所用的综合软件为Quartus II 7.1,两个版本的任意整数分频器的综合情况如表1 所示。0 N  J9 g3 A# o# k' l
      3.2.2 综合所得的RTL 图
    % p1 ]% v. A! k1 K+ G; I: E6 ]  利用综合软件 Synplify Pro 对两个版本的分频器(版本1:divider.vhd,版本2:DIV_N.vhd)进行综合,得到RTL 图分别入所示。
    9 Y& f6 i: z! _7 r+ o  
    , C% `; a% V. J0 U5 {% d% _/ \" }  4 结论
    $ ?! d# A1 M2 O  6 K- M( [9 U3 W
      本文讨论了一种基于 VHDL 的可以实现任意整数分频电路设计的方法,实现占空比为50%任意整数分频。并以EP1C3T144C8 为目标芯片进行了仿真和测试, 结果完全符合设计要求。在一些特殊的场合, 这种占空比为50%的任意整数分频电路是很重要的。- {9 x1 @9 }/ P& {
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
     楼主| 发表于 2019-5-22 09:57 | 只看该作者
    //任意整数倍的分频器6 ~  O3 {1 n2 p- y" z7 `  L
    module CLK_Division(CLK_In,CLK_In_N,CLK_Out);
    0 f# [( f* s% A7 |' M% q2 V2 J       input CLK_In;7 u/ q3 [6 Z" A4 Q, V0 A
           input [31:0] CLK_In_N;+ Y& A  H, p% h( g* n! b
           output CLK_Out;6 I3 \+ N0 |! t( r" e
           reg CLK_Out;       reg [31:0] CLK_Count;! j2 H( t# M7 b! {8 V. m9 \7 Z
           reg [31:0] CLK_Count_H; //分频计数器高电平计数
    7 @% v; g5 d- F. d& @       reg [31:0] CLK_Count_L; //分频计数器低电平计数
    ! p" M9 w: {! I) b- t1 I6 o       reg CLK_Count_Odd; //分频计数器奇数分频时低电平计数校正3 U. ]1 m$ e4 c' b& G/ E6 u: U8 G
           reg CLK_Div_1;
    4 w' |4 Q8 e0 W3 J       reg CLK_Div_2;3 V4 S  E4 \  B) a8 l' M" i) {9 Y
         always7 M2 s& f2 q7 J& t' o$ S
         begin) b+ Y) `. d5 v% k4 b
             if(CLK_In_N==0)CLK_Out<=0;0 P! |' _* p  i7 X
             else if(CLK_In_N==1)CLK_Out<=CLK_In;
    : D' b+ Q) o- [+ v% G" q         else CLK_Out<=CLK_Div_1|CLK_Div_2;
    7 K! t7 R8 S( @         CLK_Count_H<=CLK_In_N/2;
    9 u0 l  i7 _, a/ r# ^         CLK_Count_Odd<=CLK_In_N[0];$ j0 x: }, d& f8 V
             CLK_Count_L<=CLK_Count_H+CLK_Count_Odd; //分频计数器奇数分频时低电平计数校正. o- a" }. _( U6 H7 Y5 y
         end
    + w0 I. n. {; G% X( E/ w
    * C, c- x& O/ o% l2 o* T- s     always @ (posedge CLK_In)
    ! |  f+ [- y, `& N% r2 a     begin' ^1 Z/ P! {5 \, C) _/ C
             if((CLK_Div_1==1)&&(CLK_Count>=CLK_Count_H))
    3 ?/ ?' b9 E* h" A         begin
    & h0 J) z2 K1 J/ n# P              CLK_Count<=1;# x6 k* R. z2 a4 x# ]0 W8 o& n
                  CLK_Div_1<=0;% R( S, K8 h, F
             end7 ?5 s$ x  c* T2 K
             else if(CLK_Count>=CLK_Count_L)
    2 i5 \# Z. d$ B! R+ a1 I2 {   begin
    - Y/ i: a: e  ]8 I" A% m% c5 D             CLK_Count<=1;
    5 R& g: g% \; m             CLK_Div_1<=1;5 R( A  T+ x; @8 w# @1 G
             end4 g: V" j# i0 ?" E
             else CLK_Count<=CLK_Count+1;
    % U6 h' k& R: ^# K: q9 ]- B9 ?( A     end
    - E1 k$ R* f$ u    always @ (negedge CLK_In)0 W  i1 L& M6 ~
        begin
    # Q9 a" l9 E$ @         if((CLK_Div_1==1)&&(CLK_Count_Odd==1))CLK_Div_2<=1;; ~. Q. c7 |  P1 \/ n2 {( v8 Y
             else CLK_Div_2<=0;& P! w2 h9 V* y" q' Y
        end3 ^% d& H( H, h' Z% ^4 \% T
    endmodule
    ; Y# d) F6 H; }& U( \% M; U! e& U4 Y! Q% g% x& l
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-11 13:43 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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