天天看点

【数字IC/FPGA】小数分频方法实现

方法

由于Verilog只能在时钟的上升沿或者下降沿改变电路的状态,因此精确的小数分频是无法通过Verilog实现的,我们只能实现平均意义上的小数分频,即某段时间内,该时钟的周期平均为 T T T( T T T为小数)。

我们以8.6分频为例,来阐述小数分频的实现方法。

T = 8.6 T=8.6 T=8.6 对应于 M . N M.N M.N(即 M = 8 M=8 M=8, N = 6 N = 6 N=6),另一方面, T T T也可以表示为

T = M + b a + b T = M + \frac{b}{a+b} T=M+a+bb​

将 M M M通分至分母 a + b a+b a+b,则

T = ( M a + ( M + 1 ) b ) / ( a + b ) T = ( Ma+(M+1)b )/( a+b) T=(Ma+(M+1)b)/(a+b)

这里我们发现组成小数分频使用了 a a a个 M M M分频和 b b b个 M + 1 M+1 M+1分频的整数分频电路。

上述方法被称作”双模前置小数分频“,其最重要的核心是 M M M分频和 M + 1 M+1 M+1分频这个相近的频率。

实现

因此,对于8.6分频,因其整数部分为8,我们选用8分频和9分频来进行合成,列出二元方程组如下:

8 a + 9 b = 43 8a+9b=43 8a+9b=43

a + b = 5 a+b=5 a+b=5

解得 a = 2 a=2 a=2, b = 3 b=3 b=3,也就是说,在五个周期内,有两个8分频和3个9分频时钟,从而在这五个周期内,平均周期为

( 2 × 8 + 3 × 9 ) / ( 3 + 2 ) = 8.6 (2\times 8+3\times 9)/(3+2)=8.6 (2×8+3×9)/(3+2)=8.6

下面是RTL代码实现:

module clkdiv(
    input logic clk,
    input logic rst,
    output logic clkout
);

//8.6=43/5
//a*8+b*9=43
//a+b=5
//-->a=2,b=3
//16+27=43
logic [4:0] cnt8;
logic [4:0] cnt9;
logic [4:0] cnt;
//cnt
always_ff@(posedge clk,posedge rst)
if(rst)
    cnt<=0;
else if(cnt==0||cnt==2)   //9 clkdiv when cnt=0,2,4
begin
    if(cnt9==9-1)
        cnt<=cnt+1;
    else
        cnt<=cnt;
end
else if(cnt==4)
begin
    if(cnt9==9-1)
        cnt<=0;
    else
        cnt<=cnt;
end
else if(cnt==1||cnt==3)   //8 clkdiv when cnt=1,3
begin
    if(cnt8==8-1)
        cnt<=cnt+1;
    else
        cnt<=cnt;
end
//cnt9
always_ff@(posedge clk,posedge rst)
if(rst)
    cnt9<=0;
else if(cnt==0||cnt==2||cnt==4)
    if(cnt9==9-1)
        cnt9<=0;
    else
        cnt9<=cnt9+1;
else
    cnt9<=0;
//cnt8
always_ff@(posedge clk,posedge rst)
if(rst)
    cnt8<=0;
else if(cnt==1||cnt==3)
if(cnt8==8-1)
    cnt8<=0;
else
    cnt8<=cnt8+1;
else
    cnt8<=0;
//clkout
always_comb 
begin
    case(cnt)
        0,2,4:if(cnt9==9-1) 
                 clkout=1;
              else
                 clkout=0;
        1,3:if(cnt8==8-1)
                 clkout=1;
            else
                 clkout=0;
        default:clkout=0;
    endcase
end 
endmodule
           

同时编写相应的测试平台,利用VCS+Verdi进行仿真,得到如下所示的波形:

【数字IC/FPGA】小数分频方法实现

如上图所示,两条竖线之间的时间间隔为 430 n s 430ns 430ns,共包含5个脉冲,平均每个脉冲的时间为 430 / 5 = 86 n s 430/5=86ns 430/5=86ns,而原时钟的周期为 10 n s 10ns 10ns,因此,我们成功实现了平均意义上的 8.6 8.6 8.6分频

继续阅读