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 — exatamente 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 é executado continuamente — ele se repete para sempre assim que a simulação é iniciada. Ele é usado para descrever hardware que precisa continuar executando, como flip-flops, contadores e lógica combinacional.
Sintaxe básica:
always @(sensitivity_list) begin
// Código que é executado repetidamente
endO @(sensitivity_list) diz ao block quando executar. Sem ele (e sem nenhum atraso como #5 dentro), o block entraria em loop infinito e travaria a simulação.
Exemplo de Bloco Always: Counter
Aqui está um exemplo de como podemos usar o bloco always para criar um counter.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleComo Este Código Funciona
| Parte | Significado |
|---|---|
always | Execute este código repetidamente, para sempre |
@(posedge clk) | Aguarde o clock ir de 0 para 1 (borda de subida) |
count <= count + 1 | Pegue o valor atual de count, adicione 1 e armazene-o de volta |
O bloco é executado a cada borda de subida do clock. A cada vez, count aumenta em 1.
A lista de sensibilidade @(posedge clk) diz a ele para executar apenas nas bordas do clock, não continuamente. Sem isso, o loop executaria para sempre sem nenhum atraso.
Bloco Always com Múltiplos Sinais
Você pode listar sinais específicos:
always @(a or b) begin
out = a & b;
endIsso executa quando a ou b muda.
Desafio
Adicione o bloco always que está faltando para fazer este módulo funcionar.
Como funciona:
- A cada borda de subida do
clock,out1altera seu estado de 0 para 1 ou de 1 para 0 out2segueout1(mesmo valor deout1)
O que fazer:
- Adicione um bloco
always @(posedge clk) - Dentro dele, faça
out1alternar (useout1 = ~out1) - Faça
out2ser igual aout1
Experimente você mesmo
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Adicione 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