分频在 fpga 设计中一直都担任着很重要的角色,实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等等奇数类分频,一个计数器是不够的,下面我会介绍可以实现偶数分频和任意奇数分频的方法,偶数分频和奇数分频都是利用计数器来计算,但是奇数分频跟偶数分频不一样的地方是奇数分频利用了两个计数器来实现。
1.偶分频
偶分频比较简单,假设为N(偶数)分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频,可以通过改变参量N的值和计数变量cnt的位宽实现任意偶分频。代码如下:
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 0;
out_clk <= 0;
end
else begin
if(cnt==N/2-1)
begin
out_clk <= ~out_clk;
cnt<=0;
end
else
cnt <= cnt + 1;
end
end
2.实现占空比为50%的奇(N)分频
实现奇数分频原理是分别用上升沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk1,再用下降沿计数到N/2+1,时钟进行翻转,再计数到N/2输出out_clk2,将out_clk1和out_clk2相或即可。可以通过修改N的值和计数器的位宽来实现其他奇数分频。代码如下:
always @(posedge clk or negedge rst_n)
//上升沿输出out_clk1
begin
if(!rst_n)
begin
out_clk1<=0;
cnt_1<=1; //这里计数器从1开始
end
else
begin
if(out_clk1 == 0)
begin
if(cnt_1 == N/2+1)
begin
out_clk1<=~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
else
if(cnt_1 == N/2)
begin
out_clk1<=~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
end
always @(negedge clk or negedge rst_n)
//下降沿输出out_clk2
begin
if(!rst_n)
begin
out_clk2 <= 0;
cnt_2 <= 1;
end
else
begin
if(out_clk2 == 0)
begin
if(cnt_2 == N/2+1)
begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
else
if(cnt_2 == N/2)
begin
out_clk2 <= ~out_clk2;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
end
assign out_clk = out_clk1 | out_clk2;
共勉!欢迎指正