1.整数分频电路,无占空比要求
对于偶数,N分频电路,只需实现一个N/2个状态的计数器即可,触发器 采到计数器为N/2-1时,将clk_out取反。
对于奇数,N分频电路,可用状态机实现,前几个状态输出0,后几个状态输出1;也可用计数器实现,比如7分频电路,计数器从0到6循环计数,触发器采到2和6时,将clk_out取反。
2.整数分频电路,50%占空比
对于偶数,保证50%占空比很简单。
对于奇数,N分频时钟,可用两个差90°相位的2N分频时钟异或得到。如3分频时钟,可以用两个6分频的时钟异或得到,如何保证两个6分频时钟相位差为90°呢?也很简单,先生成一个上升沿触发的计数器cnt,第一个时钟clk1使用上升沿触发器产生,当触发器采到cnt为2或5时,将clk1取反;第二个时钟使用下降沿触发器产生,当触发器采到cnt为1或4时,将clk2取反。这样便得到了两个差90°相位的6分频时钟,如下图所示。
3.小数分频
如3.5分频电路,意味着7个周期产生2个对称的脉冲,生成一个可以简单划分下前1.5个周期输出1(0),1.5~3.5输出0(1),3.5~5输出1(0),5~7输出0(1),那么怎么去实现半个周期呢?,可以注意到上升沿和下降沿就差半个周期。我们生成一个7bit的上升沿的环形计数器,那么cnt[0]就可以实现第一个时钟周期输出1(0),前面的分析说到要在前1.5个时钟周期输出0(1),那剩下0.5个时钟周期怎么实现呢?我们产生一个下降沿触发的clk1,让clk1在采到cnt[0]为1时输出1,其他情况输出0. 再cnt[0]和clk1相或,就可以得到前1.5个周期clk_out输出1,其他输出0;同样的方法对3.5~5这1.5个周期进行同样处理,就可以让clk_out在这1.5个周期输出1。最终得到了3.5分频的时钟。此种方法还可以用来得到前面的50%占空比的奇数分频时钟。
代码如下:
module main (
);
reg clk,rst;
initial begin
clk = 1'b0;
forever #5 clk = ~clk;
end
initial begin
rst = 1'b1;
#20 rst = 1'b0;
#1000;
$finish;
end
reg clk_p_div6,clk_n_div6;
wire clk_div;
reg [6:0] cnt;
reg clk1;
always @(posedge clk ) begin
if (rst) begin
cnt <= 7'b0000001;
end
else begin
cnt <= {cnt[5:0],cnt[6]};
end
end
always @(negedge clk ) begin
if (rst) begin
clk1 <= 1'b0;
end
else if (cnt == 7'b0000001 || cnt==7'b0001000) begin
clk1 <= 1'b1;
end
else begin
clk1 <= 1'b0;
end
end
assign clk_div = cnt[0] | clk1 | cnt[4];
endmodule