Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

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

  1. Recarregue, reinicie, reconfigure
  2. Contador binário de 3 bits
  3. Contadores síncronos
  4. Módulo do contador
  5. Contadores de toque
  6. Convergência de TI / OT:uma oportunidade para uma redefinição cultural
  7. Contador Python em coleções com exemplo
  8. Contador Verilog Mod-N
  9. Contador Verilog Cinza
  10. Erros PID:redefinir Windup