一、引言

  在数字逻辑电路设计中,分频器是一种基本的电路单元。通常用来对某个给定频率进行分频,以得到我们想要的频率。在FPGA中,我们一般都是通过计数器来实现分频,分频得到的时钟质量没有通过PLL得到的时钟质量好,用于对时钟信号要求较高的逻辑设计中,还是用PLL分频比较好。下面将详细介绍任意偶数分频,奇数分频,小数分频。

 

二、偶数分频

  以四分频为例,假设系统时钟频率为 50MHz,那么周期为 20ns,四分频之后得到的时钟频率为 12.5MHz,时钟周期为 80ns。在50MHz的系统时钟的驱动下,计数器要在计数到  40 ns ,输出时钟翻转,计数到40 ns时,计数器的值为1,刚好计数两下。

  代码如下:

 1 // *********************************************************************************
 2 // Project Name : even_divclk
 3 // Email            : 
 4 // Create Time   : 2020/07/07 9:59
 5 // Module Name  : even_divclk
 6 // editor        : qing
 7 // Version        : Rev1.0.0
 8 // Description  : 任意占空比为50%的偶数分频
 9 // *********************************************************************************
10 
11 module even_divclk(
12     input                sclk                ,  // System clk 50MHz
13     input                s_rst_n        ,
14 
15     output    reg         div_clk        
16     );
17 
18 //========================================================================\
19 // =========== Define Parameter and Internal signals =========== 
20 //========================================================================/
21 
22 // parameter         n    =                 ;
23 parameter         n    =    4             ; // just for test
24 
25 reg            [19:0]        cnt         ;
26 
27 always @ (posedge sclk or negedge s_rst_n) begin  // cnt
28         if(s_rst_n == 1'b0)
29             cnt <= 0;
30         else if(cnt == n/2 - 1)
31             cnt <= 0;
32         else
33             cnt <= cnt + 1'b1; 
34     end    
35 
36 always @ (posedge sclk or negedge s_rst_n) begin
37     if(s_rst_n == 1'b0)
38         div_clk <= 1'b0;
39     else if(cnt == n/2 - 1)
40         div_clk <= ~div_clk;
41     else
42         div_clk <= div_clk;    
43 end
44 
45 endmodule
View Code

相关文章: