首页 > 16 分频 32 分频是啥意思_Verilog中任意分频的实现

16 分频 32 分频是啥意思_Verilog中任意分频的实现

b30b0e36e4e76a31ad8c67a9a5edef20.png

在这里讲的是利用计数器进行对clk分频,在rtl code 设计中,由于各个ip的时钟频率不同,所以我们经常要对系统clk进行分频,下面是它的代码以及要实现的功能。

//功能:对输入时钟clock进行F_DIV倍分频后输出clk_out。

//其中F_DIV为分频系数,分频系数范围为1~2^n (n=F_DIV_WIDTH)

//若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。

//若分频系数为偶数,则输出时钟占空比为50%;

//若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分

module int_div(clock,clk_out);

input clock;

output clk_out;

reg clk_p_r;

reg clk_n_r;

reg[F_DIV_WIDTH - 1:0] count_p;

reg[F_DIV_WIDTH - 1:0] count_n;

parameter F_DIV = 48000000;

parameter F_DIV_WIDTH = 32;

wire full_div_p;

wire half_div_p;

wire full_div_n;

wire half_div_n;

assign full_div_p = (count_p < F_DIV - 1);

assign half_div_p = (count_p < (F_DIV>>1) - 1);

assign full_div_n = (count_n < F_DIV - 1);

assign half_div_n = (count_n < (F_DIV>>1) - 1);

assign clk_out = (F_DIV == 1) ? clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r);

always @(posedge clock) begin

if(full_div_p) begin

count_p <= count_p + 1'b1;

if(half_div_p)

clk_p_r <= 1'b0;

else

clk_p_r <= 1'b1;

end

else

begin

count_p <= 0;

clk_p_r <= 1'b0;

end

end

always @(negedge clock) begin

if(full_div_n) begin

count_n <= count_n + 1'b1;

if(half_div_n)

clk_n_r <= 1'b0;

else

clk_n_r <= 1'b1;

end

else

begin

count_n <= 0;

clk_n_r <= 1'b0;

end

end

endmodule