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 simulationncsim> 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