Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog-Volladdierer

Ein Addierer ist eine digitale Komponente, die die Addition von zwei Zahlen durchführt. Es ist die Hauptkomponente innerhalb einer ALU eines Prozessors und wird zum Inkrementieren von Adressen, Tabellenindizes, Pufferzeigern und an vielen anderen Stellen verwendet, an denen eine Addition erforderlich ist.

Ein Volladdierer addiert einen Übertragseingang zusammen mit anderen eingegebenen Binärzahlen, um eine Summe und einen Übertragsausgang zu erzeugen.

Wahrheitstabelle

A B Cin Cout Summe
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

Gestaltung

Unten ist ein Beispiel eines 4-Bit-Addierers gezeigt, der zwei Binärzahlen durch die Signale a und b akzeptiert, die beide 4 Bit breit sind. Da ein Addierer ein kombinatorischer Schaltkreis ist, kann er in Verilog unter Verwendung einer kontinuierlichen Zuweisung mit assign modelliert werden oder eine always Block mit einer Empfindlichkeitsliste, die alle Eingänge umfasst. Der unten gezeigte Code ist der des früheren Ansatzes.

  
  
module fulladd (  input [3:0] a,
                  input [3:0] b,
                  input c_in,
                  output c_out,
                  output [3:0] sum);

   assign {c_out, sum} = a + b + c_in;
endmodule

  

Der unten gezeigte Code verwendet einen always Block, der ausgeführt wird, wenn einer seiner Eingänge den Wert ändert.

  
  
module fulladd (  input [3:0] a,
                  input [3:0] b,
                  input c_in,
                  output reg c_out,
                  output reg [3:0] sum);

	always @ (a or b or c_in) begin
  	{c_out, sum} = a + b + c_in; 	
  end
endmodule

  

Hardware-Schema

Testbench

  
  
module tb_fulladd;
	// 1. Declare testbench variables
   reg [3:0] a;
   reg [3:0] b;
   reg c_in;
   wire [3:0] sum;
   integer i;

	// 2. Instantiate the design and connect to testbench variables
   fulladd  fa0 ( .a (a),
                  .b (b),
                  .c_in (c_in),
                  .c_out (c_out),
                  .sum (sum));

	// 3. Provide stimulus to test the design
   initial begin
      a <= 0;
      b <= 0;
      c_in <= 0;
      
      $monitor ("a=0x%0h b=0x%0h c_in=0x%0h c_out=0x%0h sum=0x%0h", a, b, c_in, c_out, sum);

		// Use a for loop to apply random values to the input
      for (i = 0; i < 5; i = i+1) begin
         #10 a <= $random;
             b <= $random;
         		 c_in <= $random;
      end
   end
endmodule

  

Beachten Sie, dass, wenn sich a und b zu einer Zahl mit einer Breite von mehr als 4 Bits addieren, die Summe auf Null übergeht und c_out 1 wird. Beispielsweise ergibt die gelb hervorgehobene Zeile 0x11 und die unteren 4 Bits werden zugewiesen sum und Bit#4 zu c_out.

Simulationsprotokoll
ncsim> run
a=0x0 b=0x0 c_in=0x0 c_out=0x0 sum=0x0
a=0x4 b=0x1 c_in=0x1 c_out=0x0 sum=0x6
a=0x3 b=0xd c_in=0x1 c_out=0x1 sum=0x1
a=0x5 b=0x2 c_in=0x1 c_out=0x0 sum=0x8
a=0xd b=0x6 c_in=0x1 c_out=0x1 sum=0x4
a=0xd b=0xc c_in=0x1 c_out=0x1 sum=0xa
ncsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog-Taktgenerator
  8. Verilog Math-Funktionen
  9. Verilog-Zeitformat
  10. Verilog-Zeitskalenumfang