Atribuição Não Bloqueante
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 50 de 90.
Na lição anterior, abordamos a atribuição bloqueante (=), que é executada passo a passo. Agora abordaremos a atribuição não bloqueante (<=), que é executada toda de uma vez, em paralelo.
A atribuição não bloqueante usa o operador <=. Ela é chamada de "não bloqueante" porque não bloqueia a execução da próxima instrução. Todas as atribuições não bloqueantes em um bloco são executadas ao mesmo tempo.
Sintaxe:
variable <= expression;Quando usar atribuição não bloqueante
A atribuição não bloqueante (<=) é usada para lógica sequencial: circuitos que usam um clock e têm memória. As saídas mudam somente em uma borda do clock (geralmente na borda de subida).
Exemplos de lógica sequencial:
- Flip-flops
- Registradores
- Contadores
- Máquinas de estados
- Registradores de deslocamento
Exemplo de Verilog:
initial begin
a <= 5; // Agendado, mas ainda não executado
b <= a + 2; // Agendado, usa o valor ANTIGO de a
c <= b * 3; // Agendado, usa o valor ANTIGO de b
endAs três atribuições acontecem ao mesmo tempo usando os valores antigos. No final do passo de tempo, todas as atualizações acontecem juntas.
Não bloqueante em blocos Always (lógica sequencial)
Não bloqueante é usado para lógica sequencial: circuitos que usam um clock e têm memória (flip-flops, registradores, contadores).
always @(posedge clk) begin
q <= d; // q recebe d na borda do clock
count <= count + 1; // count incrementa na borda do clock
endAmbas as atribuições acontecem ao mesmo tempo, usando os valores anteriores à borda do clock.
Resumo
| Regra | Explicação |
|---|---|
Use <= para lógica sequencial | always @(posedge clk) |
Use = para lógica combinacional | always @(*) |
| A atribuição não bloqueante é executada em paralelo | Todas as atribuições acontecem ao mesmo tempo |
| Os valores são atualizados no final do passo de tempo | Não imediatamente |
Desafio
Conclua a atribuição não bloqueante
Adicione as atribuições não bloqueantes que faltam para fazer este registrador de deslocamento de 2 bits funcionar.
Como funciona:
- Em cada borda do clock,
q1recebed q2recebe o valor antigo deq1
O que fazer:
- Atribua
daq1(não bloqueante) - Atribua
q1aq2(não bloqueante)
Experimente você mesmo
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: Adicionar lógica de deslocamento
// Passo 1: Atribuir d a q1 (non-blocking)
// Passo 2: Atribuir q1 a q2 (non-blocking)
end
end
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