contador de 4 bits
O contador de 4 bits começa a aumentar de 4'b0000 para 4'h1111 e depois volta para 4'b0000. Ele continuará contando enquanto estiver equipado com um relógio em execução e a reinicialização for mantida alta.
O rollover acontece quando o bit mais significativo da adição final é descartado. Quando o contador está no valor máximo de 4'b1111 e recebe mais uma solicitação de contagem, o contador tenta atingir 5'b10000, mas como ele pode suportar apenas 4 bits, o MSB será descartado resultando em 0.
0000 0001 0010 ... 1110 1111 rolls over 0000 0001 ...
O design contém duas entradas, uma para o relógio e outra para um reset ativo-baixo. Uma reinicialização ativa-baixa é aquela em que o projeto é reinicializado quando o valor do pino de reinicialização é 0. Há uma saída de 4 bits chamada que essencialmente fornece os valores do contador.
Design de contador eletrônico
module counter ( input clk, // Declare input port for clock to allow counter to count up
input rstn, // Declare input port for reset to allow the counter to be reset to 0 when required
output reg[3:0] out); // Declare 4-bit output port to get the counter values
// This always block will be triggered at the rising edge of clk (0->1)
// Once inside this block, it checks if the reset is 0, if yes then change out to zero
// If reset is 1, then design should be allowed to count up, so increment counter
always @ (posedge clk) begin
if (! rstn)
out <= 0;
else
out <= out + 1;
end
endmodule
O
module
contador tem um relógio e um reset ativo-baixo (indicado por n ) como entradas e o valor do contador como saída de 4 bits. O always
bloquear é sempre executado sempre que o relógio muda de 0 para 1, o que significa uma borda de subida ou uma borda positiva. A saída é incrementada somente se o reset for mantido alto ou 1, alcançado pelo if-else
quadra. Se a reinicialização for considerada baixa na borda positiva do clock, a saída será reinicializada para um valor padrão de 4'b0000. Banco de teste
Podemos instanciar o projeto em nosso módulo testbench para verificar se o contador está contando conforme o esperado.
O módulo testbench é denominado tb_counter e portas não são necessárias, pois este é o módulo superior na simulação. No entanto, precisamos ter variáveis internas para gerar, armazenar e controlar o relógio e redefinir. Para isso, declaramos duas variáveis do tipo
reg
para relógio e reset. Também precisamos de um wire
digite net para fazer a conexão com a saída do projeto, senão o padrão será uma rede escalar de 1 bit. O relógio é gerado por meio de
always
bloco que dará um período de 10 unidades de tempo. O initial
O bloco é usado para definir valores iniciais para nossas variáveis internas e direcionar o valor de redefinição para o projeto. O design é instanciado no testbench e conectado às nossas variáveis internas, para que ele obtenha os valores quando os conduzirmos do testbench. Não temos $display
instruções em nosso testbench e, portanto, não veremos nenhuma mensagem no console.
module tb_counter;
reg clk; // Declare an internal TB variable called clk to drive clock to the design
reg rstn; // Declare an internal TB variable called rstn to drive active low reset to design
wire [3:0] out; // Declare a wire to connect to design output
// Instantiate counter design and connect with Testbench variables
counter c0 ( .clk (clk),
.rstn (rstn),
.out (out));
// Generate a clock that should be driven to design
// This clock will flip its value every 5ns -> time period = 10ns -> freq = 100 MHz
always #5 clk = ~clk;
// This initial block forms the stimulus of the testbench
initial begin
// 1. Initialize testbench variables to 0 at start of simulation
clk <= 0;
rstn <= 0;
// 2. Drive rest of the stimulus, reset is asserted in between
#20 rstn <= 1;
#80 rstn <= 0;
#50 rstn <= 1;
// 3. Finish the stimulus after 200ns
#20 $finish;
end
endmodule
Registro de simulação ncsim> run [0ns] clk=0 rstn=0 out=0xx [5ns] clk=1 rstn=0 out=0x0 [10ns] clk=0 rstn=0 out=0x0 [15ns] clk=1 rstn=0 out=0x0 [20ns] clk=0 rstn=1 out=0x0 [25ns] clk=1 rstn=1 out=0x1 [30ns] clk=0 rstn=1 out=0x1 [35ns] clk=1 rstn=1 out=0x2 [40ns] clk=0 rstn=1 out=0x2 [45ns] clk=1 rstn=1 out=0x3 [50ns] clk=0 rstn=1 out=0x3 [55ns] clk=1 rstn=1 out=0x4 [60ns] clk=0 rstn=1 out=0x4 [65ns] clk=1 rstn=1 out=0x5 [70ns] clk=0 rstn=1 out=0x5 [75ns] clk=1 rstn=1 out=0x6 [80ns] clk=0 rstn=1 out=0x6 [85ns] clk=1 rstn=1 out=0x7 [90ns] clk=0 rstn=1 out=0x7 [95ns] clk=1 rstn=1 out=0x8 [100ns] clk=0 rstn=0 out=0x8 [105ns] clk=1 rstn=0 out=0x0 [110ns] clk=0 rstn=0 out=0x0 [115ns] clk=1 rstn=0 out=0x0 [120ns] clk=0 rstn=0 out=0x0 [125ns] clk=1 rstn=0 out=0x0 [130ns] clk=0 rstn=0 out=0x0 [135ns] clk=1 rstn=0 out=0x0 [140ns] clk=0 rstn=0 out=0x0 [145ns] clk=1 rstn=0 out=0x0 [150ns] clk=0 rstn=1 out=0x0 [155ns] clk=1 rstn=1 out=0x1 [160ns] clk=0 rstn=1 out=0x1 [165ns] clk=1 rstn=1 out=0x2 Simulation complete via $finish(1) at time 170 NS + 0
Observe que o contador volta a 0 quando o reset ativo-baixo se torna 0, e quando o reset é desabilitado por volta de 150ns, o contador começa a contar a partir da próxima ocorrência da borda positiva do clock.
Esquema de hardware
Verilog
- Recarregue, reinicie, reconfigure
- Contador binário de 3 bits
- Contadores síncronos
- Módulo do contador
- Contadores de toque
- Convergência de TI / OT:uma oportunidade para uma redefinição cultural
- Contador Python em coleções com exemplo
- Contador Verilog Mod-N
- Contador Verilog Cinza
- Erros PID:redefinir Windup