赞
踩
前文我们讲到,可以通过计数器的方法实现偶数分频,实现方式可以参考4分频电路实现
那么对于奇数分频电路应该如何实现呢?是否也可以通过计数器实现呢?答案是肯定的。这里我们仍然采用计数器的方法实现奇数分频。
对于占空比不为50%的电路来说比较简单,这里我们以5分频电路为例。用计数器计数到1时翻转时钟信号,在计数到4时再翻转时钟。这样即可实现5分频电路,且占空比为60%,这里给出实现代码如下:
`timescale 1ns/1ns
module tb();
reg clk, rst;
wire clk_out;
nequal_div_5 dut(.clk(clk),
.rst(rst),
.clk_out(clk_out)
);
initial begin
clk <= 0;
forever begin
#5 clk <= !clk;
end
end
initial begin
rst <= 0;
repeat(2) @(posedge clk);
rst <= 1;
end
initial begin
#500 $finish;
end
endmodule
//no equal divided_5 and the duty cycle is 60%
module nequal_div_5(input clk, input rst, output clk_out);
reg clk_out;
reg [3:0] cnt;
always @(posedge clk or negedge rst) begin //count generate
if (!rst) begin
cnt <= 0;
end
else if (cnt == 3'b100)
begin
cnt <= 0;
end
else
cnt <= cnt + 1'b1;
end
always @(posedge clk or negedge rst) begin //clk divided
if (!rst) begin
clk_out <= 0;
end
else if (cnt == 1'b1) begin
clk_out <= ~clk_out;
end
else if (cnt == 3'b100) begin
clk_out <= ~clk_out;
end
else
clk_out <= clk_out;
end
endmodule
仿真结果如下图:
对于占空比没有要求的奇数分频实现方式当然简单,那么如何实现%50占空比的要求呢?这里我们在代码中声明了两个新的输出时钟寄存器,分别是clk_p和clk_n,clk_p在计数到2时翻转信号,而clk_n则是在时钟下降沿采样clk_p的值,然后将两者求或,即可得到满足我们要求的输出时钟clk_out
代码如下:
`timescale 1ns/1ns
module tb();
reg clk,rst;
wire clk_out;
equal_div_5 dut(.clk(clk),
.rst(rst),
.clk_out(clk_out)
);
//clk generate
initial begin
clk <= 0;
forever begin
#5 clk <= !clk;
end
end
//rst signal
initial begin
#10 rst <= 0;
repeat(2) @(posedge clk);
rst <= 1;
end
//finish signal
initial begin
#500 $finish;
end
endmodule
module equal_div_5(input clk, input rst, output clk_out);
reg [2:0]cnt;
reg clk_p;
reg clk_n;
wire clk_out;
always @(posedge clk or negedge rst)//count module
begin
if (!rst) begin;
cnt <= 0;
end
else if (cnt == 3'b100) begin
cnt <= 0;
end
else begin
cnt <= cnt +1'b1;
end
end
always @(posedge clk or negedge rst)//clk divided
begin
if (!rst) begin
clk_p <= 0;
end
else if (cnt == 3'b010) begin
clk_p <= ~clk_p;
end
else if (cnt == 3'b100) begin
clk_p <= ~clk_p;
end
else
clk_p <= clk_p;
end
always @(negedge clk) begin
clk_n <= clk_p;
end
assign clk_out = clk_n | clk_p;
endmodule
仿真结果可以看到电路的占空比为50%
同理,我们可以实现任意大小的奇数分频,且占空比为50%。即对于n分频电路,首先在(n-1)/2处进行信号翻转并把值赋给一个寄存器,然后在再其时钟下降沿检测这个寄存器的值,并赋值给另外一个寄存器,然后二者求或,结果就是最终的分频时钟的值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。