Guide de Conception et Implémentation d'un Additionneur Complet en 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 des adresses, des indices de tables, des pointeurs de tampons et dans de nombreux autres endroits où l'addition est requise.
Un additionneur complet ajoute une entrée de retenue avec les autres nombres binaires d'entrée pour produire une somme et une retenue de sortie.
Table de vérité
| A | B | Cin | Cout | Sum |
|---|---|---|---|---|
| 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'additionneur 4 bits est montré ci-dessous qui accepte deux nombres binaires via les signaux a et b qui sont tous deux larges de 4 bits. Puisqu'un additionneur est un circuit combinatoire, il peut être modélisé en Verilog en utilisant une affectation continue avec assign ou un bloc always avec une liste de sensibilité comprenant toutes les entrées. Le code ci-dessous montre 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 bloc always qui s'exécute 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 matériel
Testbench
module tb_fulladd;
// 1. Déclaration des variables du testbench
reg [3:0] a;
reg [3:0] b;
reg c_in;
wire [3:0] sum;
integer i;
// 2. Instanciation de la conception et connexion aux variables du testbench
fulladd fa0 (
.a (a), .b (b), .c_in (c_in), .c_out (c_out), .sum (sum)
);
// 3. Fourniture du stimulus pour tester la conception
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);
// Utilise une boucle for pour appliquer des valeurs aléatoires aux entrées
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, la somme revient à zéro et c_out devient 1. Par exemple, la ligne mise en surbrillance en jaune s'additionne pour donner 0x11 et les 4 bits de poids faible sont affectés à sum et le 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
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage