Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Additionneur complet Verilog

Un additionneur est un composant numérique qui effectue l'addition de deux nombres. C'est le composant principal à l'intérieur d'une ALU d'un processeur et est utilisé pour incrémenter les adresses, les index de table, les pointeurs de tampon et dans de nombreux autres endroits où un ajout est nécessaire.

Un additionneur complet ajoute une entrée de report avec d'autres nombres binaires d'entrée pour produire une somme et une sortie de report.

Table de vérité

A B Cin Cout Somme
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

Conception

Un exemple d'un additionneur 4 bits est montré ci-dessous qui accepte deux nombres binaires à travers les signaux a et b qui ont tous deux une largeur de 4 bits. Puisqu'un additionneur est un circuit combinatoire, il peut être modélisé dans Verilog en utilisant une affectation continue avec assign ou un always bloc avec une liste de sensibilité qui comprend toutes les entrées. Le code ci-dessous est celui de la première approche.

  
  
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

  

Le code ci-dessous utilise un always bloc qui est exécuté chaque fois que l'une de ses entrées change de valeur.

  
  
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

  

Schéma du matériel

Banc de test

  
  
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

  

Notez que lorsque a et b s'additionnent pour donner un nombre de plus de 4 bits de large, la somme revient à zéro et c_out devient 1. Par exemple, la ligne surlignée en jaune s'additionne pour donner 0x11 et les 4 bits inférieurs sont affectés à somme et bit#4 à c_out.

Journal de simulation
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. Tutoriel Verilog
  2. Concaténation Verilog
  3. Affectations Verilog
  4. Verilog bloquant et non bloquant
  5. Fonctions Verilog
  6. Tâche Verilog
  7. Générateur d'horloge Verilog
  8. Fonctions mathématiques Verilog
  9. Format d'heure Verilog