概述
偶数2分频
由偶数二分频波形可知,每次在时钟的上升沿,输出寄存器的状态进行翻转,就能得到二分频后的时钟。
代码如下:
module div2_clk
(
input clk,
input rst,
output clk_div
);
reg clk_div_r;
assign clk_div = clk_div_r;
always@(posedge clk)
begin
if(rst)
begin
clk_div_r <= 1'b0;
end
else
begin
clk_div_r <= ~clk_div_r ;
end
end
endmodule
二分频电路如下:
偶数N分频
方法:用模为N/2的计数器实现占空比为50%的偶数N分频时钟信号,计数器为N/2 - 1时,输出时钟寄存器状态翻转。
代码如下(div_coe代表分频数):
module even_div
#(parameter div_coe = 2)
(
input clk,
input rst,
output clk_div
);
localparam div_even = div_coe>>1;
reg clk_div_r;
reg [div_even-1:0] cnt;
assign clk_div = clk_div_r;
always@(posedge clk)
begin
if(rst)
begin
clk_div_r <= 1'b0;
cnt <= 0;
end
else if(cnt == div_even - 1)
begin
clk_div_r <= ~clk_div_r;
cnt <= 0;
end
else
begin
cnt <= cnt + 1;
end
end
endmodule
测试代码如下:
module tset_clk_div#(parameter div_coe = 6)( );
reg clk;
reg rst;
wire clk_div;
initial
begin
clk = 0;
rst = 0;
#50
rst = 1;
#25
rst = 0;
end
always #5 clk = ~clk;
even_div
#div_coe
U0
(
.clk(clk),
.rst(rst),
.clk_div(clk_div)
);
endmodule
6分频仿真波形为:
N分频电路如下:
奇数N分频,要求分频后时钟占空比为50%
以3分频为例,在时钟clk的作用下,先产生占空比为1/3的时钟clk_div_r;然后时钟clk取反,得到时钟clk_n,在clk_n的作用下,产生占空比为1/3的时钟clk_div_r1;clk_div_r与clk_div_r1只差半个时钟周期,二者相或运算得到占空比为50%的三分频时钟。
总结产生时钟占空比为50%的奇数N分频时钟方法:
1、在时钟clk的作用下,计数器cnt在(N-1)/2以及N-1状态时,时钟寄存器clk_div_r进行状态翻转,得到占空比为[(N-1)/2]/N的分频时钟;
2、在取反后的时钟clk_n的作用下,计数器cnt1在(N-1)/2以及N-1状态时,时钟寄存器clk_div_r1进行状态翻转,得到占空比为[(N-1)/2]/N的分频时钟;
3、clk_div_r与clk_div_r1相或,得到占空比为50%的奇数N分频时钟
代码如下(div_coe代表分频数):
module odd_div
#(parameter div_coe = 3)
(
input clk,
input rst,
output clk_div
);
localparam div_odd = (div_coe - 1)>>1;
reg clk_div_r;
reg [div_coe-1:0] cnt;
reg clk_div_r1;
reg [div_coe-1:0] cnt1;
wire clk_n;
assign clk_n = ~clk;
assign clk_div = clk_div_r || clk_div_r1;
always@(posedge clk)
begin
if(rst)
begin
cnt <= 0;
end
else if(cnt == div_coe - 1)
begin
cnt <= 0;
end
else
begin
cnt <= cnt + 1;
end
end
always@(posedge clk_n)
begin
if(rst)
begin
cnt1 <= 0;
end
else if(cnt1 == div_coe - 1)
begin
cnt1 <= 0;
end
else
begin
cnt1 <= cnt1 + 1;
end
end
always@(posedge clk)
begin
if(rst)
begin
clk_div_r <= 1'b0;
end
else if(cnt == div_odd)
begin
clk_div_r <= ~clk_div_r;
end
else if(cnt == div_coe - 1)
begin
clk_div_r <= ~clk_div_r;
end
end
always@(posedge clk_n)
begin
if(rst)
begin
clk_div_r1 <= 1'b0;
end
else if(cnt1 == div_odd)
begin
clk_div_r1 <= ~clk_div_r1;
end
else if(cnt1 == div_coe - 1)
begin
clk_div_r1 <= ~clk_div_r1;
end
end
endmodule
需要注意的是:上述奇偶分频实现的时钟一般只用于应付面试。
最后
以上就是甜蜜苗条为你收集整理的分频电路的verilog实现的全部内容,希望文章能够帮你解决分频电路的verilog实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复