>> Technologie Électronique >  >> Audio personnel >> Enregistreurs vocaux numériques

Implémentation d'un encodeur Booth modifié en Verilog

Implémentation Verilog de l'algorithme de Booth modifié

L'algorithme de Booth modifié (Booth radix-4) divise par deux le nombre de produits partiels par rapport à une multiplication simple, en examinant des paires de bits du multiplicateur (avec chevauchement) pour déterminer s'il faut ajouter, soustraire ou décaler le multiplicande. Voici un module Verilog propre et synthétisable pour un multiplicateur 4×4, aisément paramétrable pour des opérandes plus larges.

Module Verilog complet

module booth_multiplier_4x4 ( input logic [3:0] multiplicand, input logic [3:0] multiplier, output logic [7:0] product ); // Produits partiels (Radix-4 génère N/2 = 2 produits partiels pour un multiplicateur 4 bits) logic signed [7:0] pp [0:1]; logic [2:0] booth_sel [0:1]; // {multiplier[2i+1], multiplier[2i], multiplier[2i-1]} // Encodage de Booth (combinatoire) always_comb begin // Groupe 0 : bits multiplier[1:0] + 0 implicite (multiplier[-1]=0) booth_sel[0] = {multiplier[1], multiplier[0], 1'b0}; // Groupe 1 : bits multiplier[3:2] + multiplier[1] booth_sel[1] = {multiplier[3], multiplier[2], multiplier[1]}; for (int i = 0; i < 2; i++) begin unique case (booth_sel[i]) 3'b000, 3'b111: pp[i] = 8'sd0; // 0 * M 3'b001, 3'b010: pp[i] = {{4{multiplicand[3]}}, multiplicand}; // +1 * M 3'b011: pp[i] = {{3{multiplicand[3]}}, multiplicand, 1'b0}; // +2 * M (décalage gauche 1) 3'b100: pp[i] = -({{3{multiplicand[3]}}, multiplicand, 1'b0}); // -2 * M 3'b101, 3'b110: pp[i] = -({{4{multiplicand[3]}}, multiplicand}); // -1 * M default: pp[i] = 8'sd0; endcase // Décalage du produit partiel selon la position du groupe (2 bits par groupe) pp[i] = pp[i] << (2*i); end end // Additionneur final (combinatoire) assign product = pp[0] + pp[1]; endmodule 

Points clés de conception

  1. Arithmétique signée : La déclaration logic signed et l'extension de signe ({{4{multiplicand[3]}}, ...}) gèrent correctement la multiplication en complément à deux pour des opérandes positifs et négatifs.
  2. Encodage Radix-4 : Les groupes booth_sel se chevauchent d'un bit (LSB du groupe précédent). Le multiplier[-1] = 0 implicite gère le premier groupe.
  3. Décodage des actions : L'instruction case implémente la table de vérité standard de Booth Radix-4 : 0, ±1×M, ±2×M. L'opération ±2×M est un simple décalage gauche de 1.
  4. Décalage des produits partiels : Chaque produit partiel est décalé gauche de 2*i bits pour s'aligner sur son poids.
  5. Paramétrage : Pour un multiplicateur N bits (N pair), générer N/2 produits partiels via une boucle generate.

Extraits de testbench

module tb; logic [3:0] a, b; logic [7:0] p; booth_multiplier_4x4 uut (.multiplicand(a), .multiplier(b), .product(p)); initial begin a = 4'd5; b = 4'd3; #10; // 15 a = -4'sd5; b = 4'd3; #10; // -15 (complément à deux) a = -4'sd6; b = -4'sd7; #10; // 42 $finish; end endmodule 

Extension à des largeurs supérieures

Pour du RTL de production, envelopper l'encodage et la génération des produits partiels dans une boucle generate paramétrée par WIDTH. Utiliser un arbre d'additionneurs à retenue reportée (CSA) type Wallace ou Dadda suivi d'un additionneur final rapide (CLA/Kogge-Stone) pour les multiplicateurs larges haute performance, plutôt qu'une simple somme par propagation comme ici pour la clarté.

Enregistreurs vocaux numériques