Always Block
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
endO @(sensitivity_list) informa ao block quando executar. Sem ele (e sem nenhum atraso, como #5 dentro dele), o block entraria em um 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 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 | Obtenha o valor atual de count, adicione 1 e armazene-o novamente |
O bloco é executado a cada rising da clock. A cada vez, count aumenta em 1.
A lista de sensibilidade @(posedge clk) faz com que ele seja executado apenas nas bordas do clock, não continuamente. Sem isso, o loop seria executado 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 é executado quando a ou b changes.
Desafio
Add o bloco always ausente para fazer este module funcionar.
Como funciona:
- A cada rising clock edge,
out1toggles (inverte) de 0 para 1 ou de 1 para 0 out2followsout1(tem o mesmo valor queout1)
O que fazer:
- Add um bloco
always @(posedge clk) - Dentro dele, faça com que
out1toggles (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 projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online