目录
偶数分频
偶数分频是最简单的,N分频需要计数到(N-1),并在(N/2 - 1)和(N - 1)处更改输出的取值即可,只需要单一时钟沿计数。下面是四分频电路的实现:
代码:
module div4(
input wire clk,
input wire rst,
output reg clk_div4
);
reg [1:0] cnt;
always @(posedge clk or posedge rst) begin
if (rst) begin
// reset
cnt <= 2'b00;
end
else if (cnt == 2'b11) begin
cnt <= 2'b00;
end
else begin
cnt <= cnt + 1'b1;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
// reset
clk_div4 <= 1'b0;
end
else if (cnt == 2'b01) begin
clk_div4 <= 1'b1;
end
else if(cnt == 2'b11) begin
clk_div4 <= 1'b0;
end
end
endmodule
testbench:
module tb_4();
reg clk,rst;
wire clk_div4;
initial
begin
clk = 0;
rst = 1;
#5
rst = 0;
end
always #10 clk = ~clk;
div4 inst(
.clk(clk),
.rst(rst),
.clk_div4(clk_div4));
endmodule
仿真波形图如下:
可以看到原来的时钟周期为20ns,4分频后周期变为了80ns。
奇数分频
奇数分频比偶数分频要复杂一些,需要在时钟的上升沿和下降沿同时计数,然后结果相或得到最终的分频输出,计数得到的上升沿触发的时钟和下降沿触发的时钟都要满足高电平比低电平少一个时钟周期,高电平保持(N-1)/2个时钟周期,低电平保持(N+1)/2个时钟周期。下面是一个7分频的实现:
module div7(
input wire clk,
input wire rst,
output wire clk_div7
);
reg clk_pos,clk_neg;
reg [2:0] cnt_pos,cnt_neg;
always @(posedge clk or pose