Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Entendendo Statements Assign Verilog: Atribuição Contínua de Sinais Explicada

Sinais do tipo wire ou tipo de dado similar a wire requerem atribuição contínua de um valor. Por exemplo, considere um fio elétrico usado para conectar peças em uma protoboard. Enquanto a bateria de +5V é aplicada a uma extremidade do fio, o componente conectado à outra extremidade do fio obterá a tensão necessária.

Em Verilog, este conceito é realizado pelo statement assign onde qualquer wire ou outros tipos de dados similares a wire podem ser conduzidos continuamente com um valor. O valor pode ser uma constante ou uma expressão compreendendo um grupo de sinais.

Sintaxe do Assign

A sintaxe de atribuição começa com a palavra-chave assign seguida pelo nome do sinal que pode ser um único sinal ou uma concatenação de diferentes nets de sinal. A drive strength e delay são opcionais e são usadas principalmente para modelagem dataflow do que para síntese em hardware real. A expressão ou sinal no lado direito é avaliado e atribuído à net ou expressão de nets no lado esquerdo.

assign  = [drive_strength] [delay] 

Valores de delay são úteis para especificar atrasos para portas e são usados para modelar comportamento de timing em hardware real porque o valor dita quando a net deve ser atribuída com o valor avaliado.

Regras

Exemplo #1

No exemplo a seguir, uma net chamada out é conduzida continuamente por uma expressão de sinais. i1 e i2 com o AND lógico & formam a expressão.

Statement de atribuição contínua pode ser usado para representar portas combinacionais em Verilog.

Exemplo #2

O módulo mostrado abaixo aceita duas entradas e usa um statement assign para conduzir a saída z usando part-select e múltiplas concatenações de bits. Trate cada caso como o único código no módulo, senão muitos statements assign no mesmo sinal definitivamente farão a saída se tornar X.

module xyz (input [3:0] x, input y, output [4:0] z);
wire [1:0] a; wire b;
// Assume one of the following assignments are chosen in real design
// If x='hC and y='h1 let us see the value of z
// Case #1: 4-bits of x and 1 bit of y is concatenated to get a 5-bit net and is assigned to the 5-bit nets of z. So value of z='b11001 or z='h19
assign z = {x, y};
// Case #2: 4-bits of x and 1 bit of y is concatenated to get a 5-bit net and is assigned to selected 3-bits of net z. Remaining 2 bits of z remains undriven and will be high-imp. So value of z='bZ001Z
assign z[3:1] = {x, y};
// Case #3: The same statement is used but now bit4 of z is driven with a constant value of 1. Now z = 'b1001Z because only bit0 remains undriven
assign z[3:1] = {x, y}; assign z[4] = 1;
// Case #4: Assume bit3 is driven instead, but now there are two drivers for bit3, and both are driving the same value of 0. So there should be no contention and value of z = 'bZ001Z
assign z[3:1] = {x, y}; assign z[3] = 0;
// Case #5: Assume bit3 is instead driven with value 1, so now there are two drivers with different values... So z='bZX01Z
assign z[3:1] = {x, y}; assign z[3] = 1;
// Case #6: Partial selection of operands on RHS is also possible and say only 2-bits are chosen from x, then z = 'b00001 because z[4:3] will be driven with 0
assign z = {x[1:0], y};
// Case #7: Say we explicitly assign only 3-bits of z and leave remaining unconnected then z = 'bZZ001
assign z[2:0] = {x[1:0], y};
// Case #8: Same variable can be used multiple times as well and z = 'b00111 // 3{y} is the same as {y, y, y}
assign z = {3{y}};
// Case #9: LHS can also be concatenated: a is 2-bit vector and b is scalar. RHS is evaluated to 11001 and LHS is 3-bit wide so first 3 bits from LSB of RHS will be assigned to LHS. So a = 'b00 and b ='b1
assign {a, b} = {x, y};
// Case #10: If we reverse order on LHS keeping RHS same, we get a = 'b01 and b='b0
assign {b, a} = {x, y};
endmodule

Atribuir Variáveis reg

É ilegal conduzir ou atribuir variáveis do tipo reg com um statement assign. Isso é porque uma variável reg é capaz de armazenar dados e não requer ser conduzida continuamente. Sinais reg só podem ser conduzidos em blocos procedurais como initial e always.

Atribuição Contínua Implícita

Quando um statement assign é usado para atribuir a net dada com algum valor, é chamado de atribuição explícita. Verilog também permite que uma atribuição seja feita quando a net é declarada e é chamada de atribuição implícita.

wire [1:0] a; assign a = x & y; // Explicit assignment
wire [1:0] a = x & y; // Implicit assignment

Projeto de Lógica Combinacional

Considere o seguinte circuito digital feito de portas combinacionais e o código Verilog correspondente.

Lógica combinacional requer que as entradas sejam continuamente conduzidas para manter a saída diferente de elementos sequenciais como flip flops onde o valor é capturado e armazenado na borda de um clock. Então um statement assign serve bem ao propósito porque a saída o é atualizada sempre que qualquer uma das entradas no lado direito muda.

module combo (input a, b, c, d, output o);
assign o = ~((a & b) | c ^ d);
endmodule

Esquemático de Hardware

Após elaboração e síntese do projeto, obtemos um circuito combinacional que se comporta da mesma forma modelada pelo statement assign.

Veja que o sinal o se torna 1 sempre que a expressão combinacional no RHS se torna verdadeira. Similarmente o se torna 0 quando RHS é falso. Saída o é X de 0ns a 10ns porque entradas são X durante o mesmo tempo.

Verilog

  1. Dominando a Instrução Switch em C#: Sintaxe, Exemplos e Boas Práticas
  2. Instrução Break em C#: Como e Quando Usar
  3. Dominando a Instrução Continue em C#: Como Pular Iterações de Loop Eficazmente
  4. Dominando Concatenação Verilog: Guia Prático
  5. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  6. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  7. Dominando Funções em Verilog para Design RTL Eficiente
  8. Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
  9. Gerador de Clock Verilog: Guia de Design e Implementação
  10. Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente