在FPGA开发过程中,有时需要对时钟信号进行分频处理。当进行偶分频时,可以通过计数取反的方式进行,但进行奇数分频时,由于FPGA无法处理小数部分(不考虑浮点运算情况下),采用计数取反的方法,无法得到占空比为50%的方波。本文针对这一问题,提出一种奇数分频的方法,逻辑简单,代码量小。
以五分频为例,输入时钟为50MHz,输出10MHz方波。思路如下图所示:
输出的5分频信号由a信号与b信号相或得到。
module gen_n(
input wire clk,
input wire rst_n,
output wire oclk_n
);
parameter n = 4'd5;//四位位宽可最大实现15分频;
reg [3:0]cnt_p;
always@(posedge clk)begin
if(!rst_n)
cnt_p<=4'b0;
else if(cnt_p==n-1)
cnt_p<=4'b0;
else
cnt_p<=cnt_p+1'b1;
end
reg clk_p;
always@(posedge clk)begin
if(!rst_n)
clk_p<=1'b0;
else if(cnt_p<(n-1)/2)
clk_p<=1'b1;
else
clk_p<=1'b0;
end
reg [3:0]cnt_n;
always@(negedge clk)begin
if(!rst_n)
cnt_n<=4'b0;
else if(cnt_p==n-1)
cnt_n<=4'b0;
else
cnt_n<=cnt_n+1'b1;
end
reg clk_n;
always@(negedge clk)begin
if(!rst_n)
clk_n<=1'b0;
else if(cnt_p<(n-1)/2)
clk_n<=1'b1;
else
clk_n<=1'b0;
end
assign oclk_n = clk_p | clk_n;
endmodule