Projeto e Implementação de Contador Ripple Assíncrono em Verilog
Um contador ripple é um contador assíncrono no qual todos os flip-flops, exceto o primeiro, são clockados pela saída do flip-flop anterior.
Projeto
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, qn0;
wire q1, qn1;
wire q2, qn2;
wire q3, 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
Esquemático de Hardware
Testbench
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
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição
- Projeto de Contador Mod-N em Verilog: Módulo Parametrizado e Testbench