一、引言
在数字逻辑电路设计中,分频器是一种基本的电路单元。通常用来对某个给定频率进行分频,以得到我们想要的频率。在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