奇数分频器
always@(posedge clk or negedge clk or negedge rst)
if(~rst) //低电平有效
begin
cnt <= 2'b0 ;
clk_q <= 1'b0 ;
end
else if(cnt == 3)
begin
cnt <=2'b0 ;
clk_q <= ~clk_q ;
end
else
begin
cnt <= cnt + 1'b1 ;
clk_q <= clk_q ;
end
这样就可以设计3分频。为什么一般还要采用设计2个分频器的方法来设计奇数倍分频器
因为没有这样的dff吧
恩恩,多谢,
这是6分频。
他这是8分频,0-3,四个时钟周期
建议你自己画一下波形,就知道你这是不是3分频了
module freq_divider #( parameter div_NUM = 9 )
( reset_n,
clk_in,
clk_o );
input reset_n;
input clk_in;
output clk_o;
function integer clogb2 ( input integer depth );
integer i, result;
begin
result = 1;
for ( i = 0; 2 ** i < depth; i = i + 1 )
result = i + 1;
clogb2 = result;
end
endfunction
reg [ clogb2 ( div_NUM ) - 1 : 0 ] cnt;
always @( negedge reset_n or posedge clk_in )
if ( ~ reset_n )
cnt <= 0;
else if ( cnt == div_NUM - 1 )
cnt <= 0;
else
cnt <= cnt + 1;
reg clk_buff;
always @( negedge reset_n or posedge clk_in )
if ( ~ reset_n )
clk_buff <= 0;
else if ( cnt == div_NUM - 1 )
clk_buff <= 0;
else if ( cnt < ( div_NUM - 1 ) / 2 )
clk_buff <= 0;
else
clk_buff <= 1;
generate
if (( div_NUM % 2 ) == 1 )
begin
reg tmp;
always @( negedge reset_n or negedge clk_in )
if ( ~ reset_n )
tmp <= 0;
else
tmp <= clk_buff;
assign clk_o = clk_buff | tmp;
end
else
assign clk_o = clk_buff;
endgenerate
endmodule
嗯,你说得对。
always@(posedge clki or negedge rst_n)
begin
if (!rst_n)
div_cnt <= 2'b00 ;
else if (div_cnt==2'b10)
div_cnt <= 2'b00 ;
else
div_cnt <= div_cnt + 1 ;
end
assign clko = div_cnt[1] ;
如果要做50%占空比的三分频,把div_cnt[1]用反沿时钟抓一拍,再或上去。
wire clki_n = ~clki ;
always@(posedge clki_n or negedge rst_n)
begin
if (!rst_n)
div_cnt1_n <= 1'b0 ;
else
div_cnt1_n <= div_cnt[1] ;
end
assign clko = div_cnt1_n|div_cnt[1] ;
恩恩,是的,多谢
好的,多谢
学习了
谢谢分享
