Aula 5.7 - Contador 3 bits Flip-Flop tipo D com Testbench
Na primeira aula dessa série de aulas você aprendeu toda a base para compreender códigos em Verilog HDL e rodar os códigos, se ainda não leu clique aqui e confira.
Na aula de hoje aprenderemos a fazer um Testbench, que é um código escrito em Verilog para testar outro modulo em Verilog, ou seja, testar o projeto em teste – DUT (device under test | dispositivo em teste), uma bancada virtual.
Para aprendermos sobre Testbench vamos criar um contador de 3 bits, ou seja, código que conta de 000 a 111 (0 a 7 em binário), chamamos de contador de módulo 8, usando um flip-flop do tipo D.
O código do módulo do contador você encontra abaixo. Mas atenção, o código abaixo é referente a um flip-flop do tipo D com clock ativado por borda de descida. Não entrarei em detalhes sobre funcionamento do mesmo pois o foco dessa aula é em Testbench, portanto se esteja interessado clique aqui e confira um ótimo vídeo sobre como funciona este tipo de flip-flop.
module contador_8(clock, reset, preset,Q);
input reset, preset, clock;
output reg [2:0]Q;
initial
begin
Q = 3'b000;
end
always @ (negedge clock or negedge reset or negedge preset)
begin
if (reset == 1'b0) //reseta contador para 0
begin
Q = 3'b000;
end
else if (preset == 1'b0) //seta contador para 7
begin
Q = 3'b111;
end
else // Q recebe Q + 1
begin
Q = Q + 3'b001;
end
end
endmodule
Dentro do ambiente always você deve estar estranhando a palavra chave negedge. Ela significa que o always vai ser executado quando aquela determinada variável (parâmetro) realizar uma transição de descida (1 -> 0), ou seja, borda de descida. Caso queira fazer com borda de subida, usamos a palavra chave posedge, ou seja, realiza uma transição de subida (0 -> 1).
Agora vamos realizar o Testbench!
module teste_contador8;
reg preset_tb, clock_tb, reset_tb;
wire [2:0] Q_tb;
parameter stop_time = 5000; //tempo duração do teste
contador_8 dut(clock_tb, reset_tb, preset_tb, Q_tb); //chama módulo contador
initial # stop_time $finish;
initial
begin
reset_tb = 1'b0; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b0; preset_tb = 1'b1; clock_tb = 1'b0; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b0; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b0; #10
repeat(10)
begin
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b0; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b0; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b0; #10
reset_tb = 1'b1; preset_tb = 1'b1; clock_tb = 1'b1;
end
end
endmodule
A forma de onda resultante do teste você pode conferir no ModelSim, como ilustra a imagem abaixo:
Não sabe usar o ModelSim? Acesse a parte de "Como realizar simulação" disponível na aula 5.0 clicando aqui.
Próxima aula, clique aqui.
COMENTÁRIOS