2.奇数分频器
奇数分频器的设计比偶数分频器复杂一些,特别是占空比为50%的奇数分频器。如果对占空比没有明确的要求,则可以直接对上升沿计数,计数到(N-1)/2 时让输出翻转,计数到(N-1)时让输出状态再次翻转,并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。而如果要实现50%的占空比,可以通过“错位相或”的方法实现。具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器,最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器,具体实现代码如下:
奇数分频器示例,5分频,占空比50%
module div_odd(clk_out, clk, rst_n);
input clk, rst_n;
output clk_out;
reg clk_p, clk_n;
reg [4:0] cnt1, cnt2; //注意根据实际需要调整位宽
parameter N = 5; //此处N可以设为任意奇数
//用上升沿产生非50%占空比的分频信号clk_p
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
cnt1 <= 0;
clk_p <= 0;
end
else if(cnt1 == 5'b10) //cnt_p == (N-1)/2,翻转
begin
cnt1 <= cnt1 + 1'b1;
clk_p <= ~clk_p;
end
else if(cnt1 == 5'b100) //cnt_p == N-1,翻转
begin
cnt1 <= 1'b0;
clk_p <= ~clk_p;
end
else cnt1 <= cnt1 +1'b1;
//用下降沿产生非50%占空比的分频信号clk_n
always @(negedge clk or negedge rst_n)
if(!rst_n)
begin
cnt2 <= 0;
clk_n <= 0;
end
else if(cnt2 == 5'b10) //cnt_n == (N-1)/2,翻转
begin
cnt2 <= cnt2 + 1'b1;
clk_n <= ~clk_n;
end
else if(cnt2 == 5'b100) //cnt_n == N-1,翻转
begin
cnt2 <= 1'b0;
clk_n <= ~clk_n;
end
else cnt2 <= cnt2 +1'b1;
//相与运算,得到50%占空比的分频信号
assign clk_out = clk_p | clk_n;
endmodule