题解 | 任意奇数倍时钟分频
任意奇数倍时钟分频
https://www.nowcoder.com/practice/b058395d003344e0a74dd67e44a33fae
`timescale 1ns / 1ns
module clk_divider #(
parameter dividor = 5
) (
input clk_in,
input rst_n,
output clk_out
);
reg [$clog2(dividor)-1:0] cnt;
reg clk_p, clk_n;
assign clk_out = clk_p || clk_n;
always @(posedge clk_in or negedge rst_n) begin
if (!rst_n) begin
cnt <= 0;
end else begin
cnt <= (cnt == dividor - 1) ? 0 : cnt + 1;
end
end
always @(posedge clk_in or negedge rst_n) begin
if (!rst_n) begin
clk_p <= 0;
end else if (cnt == (dividor - 1) >> 1) begin
clk_p <= ~clk_p;
end else if (cnt == dividor - 1) begin
clk_p <= ~clk_p;
end
end
always @(negedge clk_in or negedge rst_n) begin
if (!rst_n) begin
clk_n <= 0;
end else if (cnt == (dividor - 1) >> 1) begin
clk_n <= ~clk_n;
end else if (cnt == dividor - 1) begin
clk_n <= ~clk_n;
end
end
endmodule
观察时钟翻转处波形,相位提高了半个周期,考虑到cnt_n比cnt_p晚半个周期,可以推知cnt_n和cnt_p共用一个有posedge clk产生的cnt_p
查看13道真题和解析