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 onde as instruções são executadas uma após a outra, em sequência — assim como em linguagens de programação de software como C ou Python. O Verilog possui dois blocos procedurais: initial (executa uma vez) e always (executa continuamente). Vamos começar com o bloco always.
O bloco always executa 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 executa repetidamente
endO @(sensitivity_list) informa ao bloco quando executar. Sem isso, 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;
endmoduleComo este código funciona
| Parte | Significado |
|---|---|
always | Executa este código repetidamente, para sempre |
@(posedge clk) | Aguarda o clock ir de 0 para 1 (borda de subida) |
count = count + 1 | Pega o valor atual de count, adiciona 1 e o armazena de volta |
O bloco é executado em cada borda de subida do clock. A cada vez, count aumenta em 1.
A lista de sensibilidade @(posedge clk) diz para executar apenas nas bordas de clock, não continuamente. Sem isso, o loop rodaria para sempre sem atraso.
Bloco Always com Múltiplos Sinais
Você pode listar sinais específicos:
always @(a or b) begin
out = a & b;
endIsso é executado quando a ou b muda.
Desafio
Adicione o bloco always que falta para fazer este módulo funcionar.
Como funciona:
- Em cada borda de subida do clock,
out1alterna (inverte) de 0 para 1 ou de 1 para 0 out2segueout1(mesmo valor queout1)
O que fazer:
- Adicione um bloco
always @(posedge clk) - Dentro dele, faça
out1alternar (useout1 = ~out1) - Faça
out2igual aout1
Folha de consulta
O bloco always executa continuamente e é usado para descrever hardware como flip-flops e contadores.
always @(sensitivity_list) begin
// Código que executa repetidamente
end@(posedge clk) dispara na borda de subida do clock; @(a or b) dispara quando qualquer sinal listado muda.
// Contador: incrementa a cada borda de subida do clock
always @(posedge clk) count = count + 1;
// Combinacional: executa quando a ou b muda
always @(a or b) begin
out = a & b;
endNota: saídas acionadas por blocos always devem ser declaradas como reg.
Experimente você mesmo
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Adicionar bloco always com posedge clk
// out1 alterna a cada clock
// out2 segue out1
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo9Blocos Procedurais
Bloco AlwaysBloco InitialLista de SensibilidadeAtribuição BloqueanteAtribuição Não BloqueanteRecapitulação - Always vs Initial