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 com o 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
endA @(sensitivity_list) informa ao bloco quando executar. Sem ela (e sem nenhum atraso, como #5 dentro dele), o bloco entraria em um 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 | Execute este código repetidamente, para sempre |
@(posedge clk) | Aguarde o clock passar de 0 para 1 (borda de subida) |
count <= count + 1 | Pegue o valor atual de count, adicione 1 e armazene-o novamente |
O bloco é executado a 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;
endIsso é executado quando a ou b muda.
Desafio
Adicione o bloco always ausente para fazer este módulo funcionar.
Como funciona:
- A cada borda de subida do clock,
out1alterna (inverte) de 0 para 1 ou de 1 para 0 out2acompanhaout1(mesmo valor queout1)
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 o 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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um Módulo9Blocos Procedurais
Bloco AlwaysBloco InitialLista de SensibilidadeAtribuição BloqueanteAtribuição Não BloqueanteRevisão - Always vs InitialPratique por conta própria: Compilador de Verilog online