当前位置:   article > 正文

经典分频器——奇数分频(3分频,5分频,任意分频)

奇数分频


   奇数分频根据占空比的不同,写法也不尽相同。

一、占空比不是50%(<<50%)

module test#(parameter N=3)(
 input clk,
 input rst_n,
 output clk_div
 );
 
 reg [N-1:0] div_reg        ;//分频计数器
 always @(posedge clk or negedge rst_n)
     if (rst_n == 1'b0 )
         div_reg    <= 0 ;
     else if(div_reg == 3'd4)//从0计数到4,然后返回到0,5分频
         div_reg    <= 0;
     else
         div_reg    <= div_reg + 1'b1 ;
 
 assign clk_div = div_reg[N-1] ;
  
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

   每一个分频后的时钟周期=5倍原来的时钟周期,因此是5分频。修改部分代码便可得出3分频。
在这里插入图片描述

二、占空比接近50%(>50%)

  假设时钟分频是N,则设置一个计数器,计数长度是N(即从0计数到N-1),然后在计数器为计数到(N-1)/2的时候,翻转一下分频时钟信号;在计数器计数到为N-1的时候,再翻转一下时钟

 module test#(parameter N=3)(//N分频,这里是3分频
 input clk,
 input rst_n,
 output clk_div
 );
 
 reg [N-1:0] div_cnt        ;//分频计数器
 reg div_reg ;
 always @(posedge clk or negedge rst_n)begin
     if (rst_n == 1'b0 )begin
         div_cnt    <= 0 ;
         div_reg        <= 1 ;
     end else if (div_cnt == (N-1)/2)begin//计数到(N-1)/2,进行翻转和继续计数
         div_reg        <= ~div_reg;
         div_cnt    <= div_cnt + 1'b1 ;
     end else if ( div_cnt == (N-1) )begin//计数到N-1,进行清零和翻转
         div_cnt        <= 0 ;
         div_reg        <= ~div_reg;
     end else 
         div_cnt    <= div_cnt + 1'b1 ;
         
 end         
 assign clk_div = (N == 1)?clk:div_reg ;//注意这里, 在N= 1的情况,也就是不分频的情况

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3分频,N = 3:
在这里插入图片描述
5分频,N= 5 :
在这里插入图片描述

三、占空比等于50%

  产生具有50%占空比的奇数分频时钟的算法如下所示,假设N分频(N是计数):

  1. 设置一个计数长度为N的上升沿计数器,和一个信号寄存器;信号寄存器在上升沿计数器为(N-1)/2的时候进行翻转,然后再在计数到N-1的时候进行翻转(这里相当于得到一个N分频信号A)。
  2. 再设置一个计数长度为N的下降沿计数器,和另一个信号寄存器;信号寄存器在下降沿计数器为(N-1)/2的时候进行翻转,然后再在计数到N-1的时候进行翻转(这里相当于得到一个N分频信号B)。
  3. A和B相或就可以得到占空比50%的奇数分频信号;代码实现如下:
 module test#(parameter N=5)(//N分频
 input clk,
 input rst_n,
 output clk_div
 );
 
 reg sig_r ;//定义一个上升沿翻转的信号
 reg sig_f ;//定义一个下降沿翻转的信号
 reg [N-1:0]    cnt_r;//上升沿计数器
 reg [N-1:0]    cnt_f;//下降沿计数器

 wire clk_f ;
 assign clk_f = ~clk ;//用来触发下降沿计数器的时钟
                     //由于同时使用上升沿和下降沿触发器不好,因此我们为同一边沿,都使用上升沿触发
                     //只不过是将时钟进行反向
                     
 always @(posedge clk or negedge rst_n)begin//上升沿计数
     if(rst_n == 1'b0)begin
         sig_r    <= 0 ;
         cnt_r    <= 0 ;
     end else if( cnt_r == (N-1)/2 )begin
         sig_r    <= ~sig_r ;
         cnt_r    <= cnt_r + 1 ;
     end else if ( cnt_r == (N-1) )begin
         sig_r    <= ~sig_r ;
         cnt_r    <= 0 ;
     end else 
         cnt_r    <= cnt_r + 1 ;
 end                     
 
 always @(posedge clk_f or negedge rst_n)begin//下降沿计数
     if(rst_n == 1'b0)begin
         sig_f    <= 0 ;
         cnt_f    <= 0 ;
     end else if( cnt_f == (N-1)/2 )begin
         sig_f    <= ~sig_f ;
         cnt_f    <= cnt_f + 1 ;
     end else if ( cnt_f == (N-1) )begin
         sig_f    <= ~sig_f ;
         cnt_f    <= 0 ;
     end else 
         cnt_f    <= cnt_f + 1 ;
 end 
 
 assign clk_div = sig_f || sig_r ;
                     
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

3分频:
在这里插入图片描述
5分频:
在这里插入图片描述

四、占空比50%的任意整数分频(重点)

module test#(parameter N=5)(//N分频
   input clk,
   input rst_n,
   output clk_div
   );
   
   //奇数分频
   reg sig_r ;//定义一个上升沿翻转的信号
   reg sig_f ;//定义一个下降沿翻转的信号
   reg [N-1:0]    cnt_r;//上升沿计数器
   reg [N-1:0]    cnt_f;//下降沿计数器
  
   wire clk_f ;
   assign clk_f = ~clk ;//用来触发下降沿计数器的时钟
                       //由于同时使用上升沿和下降沿触发器不好,因此我们为同一边沿,都使用上升沿触发
                       //只不过是将时钟进行反向
                      
   always @(posedge clk or negedge rst_n)begin//上升沿计数
       if(rst_n == 1'b0)begin
           sig_r    <= 0 ;
           cnt_r    <= 0 ;
       end 
       else begin
           cnt_r    <= cnt_r + 1 ;
           if( cnt_r == (N-1)/2 )begin
               sig_r    <= ~sig_r ;
           end else if ( cnt_r == (N-1) )begin
               sig_r    <= ~sig_r ;
               cnt_r    <= 0 ;
           end 
       end 
   end                     
  
   always @(posedge clk_f or negedge rst_n)begin//下降沿计数
       if(rst_n == 1'b0)begin
           sig_f    <= 0 ;
           cnt_f    <= 0 ;
       end 
       else begin
           cnt_f    <= cnt_f + 1 ;
           if( cnt_f == (N-1)/2 )begin
               sig_f    <= ~sig_f ;
           end else if ( cnt_f == (N-1) )begin
               sig_f    <= ~sig_f ;
               cnt_f    <= 0 ;
           end 
       end     
   end 
   
   //偶数分频
   reg div_reg ;
   reg [N-1:0] div_cnt        ;//分频计数器
   always @(posedge clk or negedge rst_n)begin
       if (rst_n == 1'b0 )begin
           div_cnt    <= 0 ;
           div_reg    <= 0 ;
       end 
       else begin
           div_cnt    <= div_cnt + 1'b1 ;
           if(div_cnt == (N/2 - 1))begin
               div_cnt    <= 0;
               div_reg    <= ~div_reg ;
           end 
       end
   end        
   assign clk_div = (N == 1)?clk:
                   ( N%2 == 1)?(sig_f || sig_r ): div_reg;//这里用来输出分频值。对2的取余操作是综合的
                       
endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

5分频:
在这里插入图片描述
6分频:
在这里插入图片描述
引:https://blog.csdn.net/weixin_34126557/article/details/86246646?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/519124
推荐阅读
相关标签
  

闽ICP备14008679号