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

Concatenação Verilog


Fios e variáveis ​​multi-bit Verilog podem ser agrupados para formar um fio ou variável multi-rede maior usando concatenação operadores { e } separados por vírgulas. A concatenação também pode ter expressões e constantes de tamanho como operandos, além de fios e variáveis.

O tamanho de cada operando deve ser conhecido para calcular o tamanho completo da concatenação.

Exemplo de concatenação Verilog

  
  
	wire 		a, b; 		// 1-bit wire
	wire [1:0]  res; 		// 2-bit wire to store a and b
	
	// res[1] follows a, and res[0] follows b
	assign res = {a, b}; 	
	
	
	wire [2:0]  c;
	wire [7:0] 	res1;
	
	// res[0]   follows c[2]
	// res[2:1] is always 0
	// res[4:3] follows c[1:0]
	// res[5]   follows a
	// res[6]   follows b
	assign res1 = {b, a, c[1:0], 2'b00, c[2]};

  

Aqui está um exemplo de design funcional de concatenação de entradas para formar diferentes saídas. Expressões concatenadas podem ser simplesmente exibidas ou atribuídas a qualquer fio ou variável, não necessariamente saídas.
  
  
module des (input [1:0] 	a,
            input [2:0] 	b,
            output [4:0]	out1,
            output [3:0] 	out2            
           );
  
  assign out1 = {a, b};
  assign out2 = {a[1], 2'b01, b[2]};
  
endmodule  

module tb;
  reg [1:0] a;
  reg [2:0] b;
  wire [4:0] out1;
  wire [3:0] out2;
  
  des u0 (a, b, out1, out2);
  
  initial begin
    a <= 0;
    b <= 0;
    
    $monitor("[%0t] a=%b b=%b, out1=%b out2=%b", $time, a, b, out1, out2);
    
    #10 a <= 3;
    #5  b <= 5;
    #10 a <= 2;
    #5  b <= 1;
    
    #10 $finish;
  end
endmodule

  

Observe que out2[2:1] é sempre uma constante 2'b01.
Registro de simulação
xcelium> run
[0] a=00 b=000, out1=00000 out2=0010
[10] a=11 b=000, out1=11000 out2=1010
[15] a=11 b=101, out1=11101 out2=1011
[25] a=10 b=101, out1=10101 out2=1011
[30] a=10 b=001, out1=10001 out2=1010
Simulation complete via $finish(1) at time 40 NS + 0

Operador de replicação


Quando a mesma expressão precisa ser repetida várias vezes, uma constante de replicação é usado que precisa ser um número não negativo e não pode ser X, Z ou qualquer variável. Esse número constante também é colocado entre chaves junto com o operador de concatenação original e indica o número total de vezes que a expressão será repetida.
  
  
	wire a;
	wire [6:0] res;
	
	assign res = {7{a}};
	
	{2'bz{2'b0}}         // Illegal to have Z as replication constant
	{2'bx{2'b0}}         // Illegal to have X as replication constant

  

As expressões de replicação não podem aparecer no lado esquerdo de nenhuma atribuição e não podem ser conectadas a output ou inout portos.
  
  
module des;
  reg [1:0] a;
  reg [2:0] b;
  
  initial begin
    a <= 2;
    b <= 4;
    
    #10;
    $display("a=%b b=%b res=%b", a, b, {{2{a}}, {3{b}}});
  end
  
endmodule

  

Observe que a foi repetido duas vezes e b foi repetido três vezes.
Registro de simulação
xcelium> run
a=10 b=100 res=1010100100100
xmsim: *W,RNQUIE: Simulation is complete.


Os operandos serão avaliados apenas uma vez quando a expressão de replicação for executada mesmo que a constante seja zero.

Replicação aninhada


Uma expressão de replicação pode ser usada dentro de expressões de concatenação regulares. Tomando o exemplo acima como base, a e b foram incluídos na expressão concatenada total.
  
  
module des;
  reg [1:0] a;
  reg [2:0] b;
  
  initial begin
    a <= 2;
    b <= 4;
    
    #10;
    $display("a=%b b=%b res=%b", a, b, {a, b, 3'b000, {{2{a}}, {3{b}}}});
  end
  
endmodule

  
Registro de simulação
xcelium> run
a=10 b=100 res=101000001010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Uso ilegal

  
  
  module des;
    reg [1:0] a;
    reg [2:0] b;
    reg [3:0] _var;

    initial begin
      a <= 2;
      b <= 4;
      _var <= 3;

      // This is illegal because variables cannot be used
      // as replication constant
      $display("a=%b b=%b res=%b", a, b, {_var{a}});
    end
  endmodule

  

Isso resulta em um erro de compilação, conforme mostrado abaixo.
Registro de simulação
	Top level design units:
		des
      $display("a=%b b=%b res=%b", a, b, {_var{a}});
                                             |
xmelab: *E,NOTPAR (./testbench.sv,12|45): Illegal operand for constant expression [4(IEEE)].


Verilog

  1. Tutorial Verilog
  2. Atribuições Verilog
  3. Verilog Blocking &Non-Blocking
  4. Funções Verilog
  5. Tarefa Verilog
  6. Gerador de Relógio Verilog
  7. Funções matemáticas Verilog
  8. Formato de hora Verilog
  9. Escopo da escala de tempo da Verilog
  10. Operações de E/S de arquivo Verilog