Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog-aaneenschakeling

Multi-bit Verilog-draden en -variabelen kunnen met behulp van aaneenschakeling worden samengevoegd om een ​​grotere multi-netdraad of variabele te vormen operators { en } gescheiden door comma's. Aaneenschakeling mag naast draden en variabelen ook uitdrukkingen en grootteconstanten als operanden hebben.

De grootte van elke operand moet bekend zijn om de volledige grootte van de aaneenschakeling te berekenen.

Verilog-aaneenschakelingsvoorbeeld

  
  
	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]};

  

Hier is een werkend ontwerpvoorbeeld van aaneenschakeling van inputs om verschillende outputs te vormen. Aaneengeschakelde uitdrukkingen kunnen eenvoudig worden weergegeven of toegewezen aan elke draad of variabele, niet noodzakelijkerwijs uitgangen.

  
  
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

  

Merk op dat out2[2:1] altijd een constante 2'b01 is.

Simulatielogboek
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

Replicatie-operator

Als dezelfde uitdrukking een aantal keren moet worden herhaald, wordt een replicatieconstante wordt gebruikt die een niet-negatief getal moet zijn en niet X, Z of een variabele mag zijn. Dit constante getal staat ook tussen haakjes, samen met de oorspronkelijke aaneenschakelingsoperator en geeft het totale aantal keren aan dat de uitdrukking wordt herhaald.

  
  
	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

  

Replicatie-expressies kunnen niet aan de linkerkant van een opdracht worden weergegeven en kunnen niet worden gekoppeld aan output of inout poorten.

  
  
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

  

Merk op dat a tweemaal werd herhaald en b driemaal werd herhaald.

Simulatielogboek
xcelium> run
a=10 b=100 res=1010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Operanden worden slechts één keer geëvalueerd wanneer de replicatie-expressie wordt uitgevoerd, zelfs als de constante nul is.

Geneste replicatie

Een replicatie-expressie mag worden gebruikt binnen reguliere aaneenschakelingsexpressies. Als we het bovenstaande voorbeeld als basis nemen, zijn a en b opgenomen in de totale aaneengeschakelde uitdrukking.

  
  
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

  
Simulatielogboek
xcelium> run
a=10 b=100 res=101000001010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Illegaal gebruik

  
  
  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

  

Dit resulteert in een compilatiefout zoals hieronder weergegeven.

Simulatielogboek
	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. Verilog-zelfstudie
  2. Verilog-opdrachten
  3. Verilog blokkeren en niet-blokkeren
  4. Verilog-functies
  5. Verilog-taak
  6. Verilog-klokgenerator
  7. Verilog wiskundige functies
  8. Verilog Tijdnotatie
  9. Verilog Tijdschaalbereik
  10. Verilog File IO-bewerkingen
  11. Verilog Hallo Wereld