Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Concatenación Verilog

Los cables Verilog de varios bits y las variables se pueden agrupar para formar un cable o variable multired más grande mediante concatenación operadores { y } separado por comas. También se permite la concatenación para tener expresiones y constantes de tamaño como operandos además de cables y variables.

Se debe conocer el tamaño de cada operando para calcular el tamaño completo de la concatenación.

Ejemplo de concatenación de 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]};

  

Aquí hay un ejemplo de diseño funcional de concatenación de entradas para formar diferentes salidas. Las expresiones concatenadas se pueden mostrar o asignar simplemente a cualquier cable o variable, no necesariamente a las salidas.

  
  
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

  

Tenga en cuenta que out2[2:1] siempre es una constante 2'b01.

Registro de simulación
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 replicación

Cuando la misma expresión tiene que repetirse varias veces, una constante de replicación se utiliza, que debe ser un número no negativo y no puede ser X, Z ni ninguna variable. Este número constante también está encerrado entre llaves junto con el operador de concatenación original e indica el número total de veces que se repetirá la expresión.

  
  
	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

  

Las expresiones de replicación no pueden aparecer en el lado izquierdo de ninguna tarea y no pueden conectarse a output o inout puertos

  
  
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

  

Tenga en cuenta que a se repitió dos veces y b se repitió tres veces.

Registro de simulación
xcelium> run
a=10 b=100 res=1010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Los operandos se evaluarán solo una vez cuando se ejecute la expresión de replicación incluso si la constante es cero.

Replicación anidada

Se permite usar una expresión de replicación dentro de expresiones de concatenación regulares. Tomando como base el ejemplo anterior, a y b se han incluido en la expresión 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 simulación
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

  

Esto da como resultado un error de compilación como se muestra a continuación.

Registro de simulación
	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 de Verilog
  2. Asignaciones de Verilog
  3. Bloqueo y no bloqueo de Verilog
  4. Funciones de Verilog
  5. Tarea Verilog
  6. Generador de reloj Verilog
  7. Funciones matemáticas de Verilog
  8. Formato de hora de Verilog
  9. Alcance de la escala de tiempo de Verilog
  10. Operaciones de E/S de archivos de Verilog
  11. Verilog Hola Mundo