Menu
CoddyTech

Bloco Always

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 46 de 90.

Um bloco procedural é um bloco de código em que as instruções são executadas uma após a outra, em sequência, assim como nas linguagens de programação de software como C ou Python. Verilog tem dois blocos procedurais: initial (executado uma vez) e always (executado continuamente). Vamos começar pelo bloco always.

O bloco always é executado continuamente. Ele se repete para sempre assim que a simulação começa. Ele é usado para descrever hardware que precisa continuar funcionando, como flip-flops, contadores e lógica combinacional.

Sintaxe básica:

always @(sensitivity_list) begin
  // Código que é executado repetidamente
end

A @(sensitivity_list) informa ao bloco quando executar. Sem ela (e sem nenhum atraso como #5 dentro), o bloco entraria em loop infinito e travaria a simulação.

Exemplo de bloco always: contador

Aqui está um exemplo de como podemos usar o bloco always para criar um contador.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Como este código funciona

ParteSignificado
alwaysExecute este código repetidamente, para sempre
@(posedge clk)Aguarde o clock passar de 0 para 1 (borda de subida)
count <= count + 1Pegue o valor atual de count, some 1 e armazene-o novamente

O bloco é executado em cada borda de subida do clock. A cada vez, count aumenta em 1.

A lista de sensibilidade @(posedge clk) indica que ele deve ser executado apenas nas bordas do clock, não continuamente. Sem isso, o loop seria executado para sempre, sem atraso.

Bloco always com vários sinais

Você pode listar sinais específicos:

always @(a or b) begin
  out = a & b;
end

Isso é executado quando a ou b muda.

challenge icon

Desafio

Adicione o bloco always que está faltando para fazer este módulo funcionar.

Como funciona:

  • A cada borda de subida do clock, out1 alterna (inverte) de 0 para 1 ou de 1 para 0
  • out2 acompanha out1 (tem o mesmo valor que out1)

O que fazer:

  1. Adicione um bloco always @(posedge clk)
  2. Dentro dele, faça out1 alternar (use out1 = ~out1)
  3. Faça out2 ser igual a out1

Experimente você mesmo

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Adicione um bloco always com posedge clk
  // out1 alterna a cada ciclo de clock
  // out2 segue out1

endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online