其实现很简单,主要为使用两个计数模块分别计数,得到两个波形进行基本与或操作完成。直接贴出代码部分如下。
module div_freq(
iCLK,
iRST_n,
oCLK
);
input wire iCLK;
input wire iRST_n;
output oCLK;
parameter N = 4'd5;
reg clk_p;
reg [3:0] cnt_p;
always @ (posedge iCLK or negedge iRST_n) begin
if (!iRST_n)
cnt_p <= 4'd0;
else if (cnt_p == N - 1)
cnt_p <= 4'd0;
else
cnt_p <= cnt_p + 1'b1;
end
always @ (posedge iCLK or negedge iRST_n) begin
if (!iRST_n)
clk_p <= 1'b0;
else if (cnt_p == (N - 1) / 2)
clk_p <= ~clk_p;
else if (cnt_p == N - 1)
clk_p <= ~clk_p;
else
clk_p <= clk_p;
end
reg clk_n;
reg [3:0] cnt_n;
always @ (negedge iCLK or negedge iRST_n) begin
if (!iRST_n)
cnt_n <= 4'd0;
else if (cnt_n == N - 1)
cnt_n <= 4'd0;
else
cnt_n <= cnt_n + 1'b1;
end
always @ (negedge iCLK or negedge iRST_n) begin
if (!iRST_n)
clk_n <= 1'b0;
else if (cnt_n == (N - 1) / 2)
clk_n <= ~clk_n;
else if (cnt_n == N - 1)
clk_n <= ~clk_n;
else
clk_n <= clk_n;
end
assign oCLK = clk_p | clk_n;
endmodule
使用两个计数器cnt_p和cnt_n,cnt_p在时钟上升沿变化,对应clk_p两低三高;cnt_n在时钟下降沿变化,对应clk_n两低三高。但是clk_p和clk_n的变化边沿正好相差半个clk周期,对两个时钟进行或运算即可。
modelsim仿真结果如下图
网友评论