📅  最后修改于: 2021-01-11 15:10:08             🧑  作者: Mango
纹波计数器是一个异步计数器,其中前一个触发器的输出为除第一个触发器之外的所有触发器提供时钟。
异步意味着电路的所有元件都没有公共时钟。例如,一个4位计数器的计数从0000到1111。
我们将向第一个T型触发器提供1Khz时钟信号,其余三个触发器的时钟将来自前一个触发器的输出(Q)。请参见下面的示意图:
上面的电路包含4个T触发器,因为我们需要4位纹波计数器。 T1的时钟由1Khz的数字源提供,其余的触发器使用以前的触发器输出作为时钟。
所有T个触发器的输入T为高电平(1),因此T触发器在每个时钟沿都切换输入。
我们将执行三个模块来实现此计数器。第一个模块是执行主程序。第二个模块用于实现T触发器逻辑,第三个模块用于实现D触发器逻辑。
module dff (input d,
input clk,
input rstn,
output reg q,
output qn);
always @ (posedge clk or negedge rstn)
if (!rstn)
q <= 0;
else
q <= d;
assign qn = ~q;
endmodule
module ripple ( input clk,
input rstn,
output [3:0] out);
wire q0;
wire qn0;
wire q1;
wire qn1;
wire q2;
wire qn2;
wire q3;
wire qn3;
dff dff0 ( .d (qn0),
.clk (clk),
.rstn (rstn),
.q (q0),
.qn (qn0));
dff dff1 ( .d (qn1),
.clk (q0),
.rstn (rstn),
.q (q1),
.qn (qn1));
dff dff2 ( .d (qn2),
.clk (q1),
.rstn (rstn),
.q (q2),
.qn (qn2));
dff dff3 ( .d (qn3),
.clk (q2),
.rstn (rstn),
.q (q3),
.qn (qn3));
assign out = {qn3, qn2, qn1, qn0};
endmodule
硬件原理图
试验台
module tb_ripple;
reg clk;
reg rstn;
wire [3:0] out;
ripple r0 ( .clk (clk),
.rstn (rstn),
.out (out));
always #5 clk = ~clk;
initial begin
rstn <= 0;
clk <= 0;
repeat (4) @ (posedge clk);
rstn <= 1;
repeat (25) @ (posedge clk);
$finish;
end
endmodule