xGCFx
Stammgast
Beiträge: 33 Ort: Dresden
|
Erstellt: 31.10.06, 14:13 Betreff: Re: add-shift multiplizierer
drucken
weiterempfehlen
|
|
|
Solche Muliplizierer nennt man auch Seriell/Parallel Multiplizierer, weil 1 Operand seriell und der andere parallel verarbeitet wird.
Folgender Code beschreibt so einen Multiplizierer für 8 bit-breite Operanden. Eingang a_i wird in ein Schieberegister geladen und sukzessive verschoben eine Position. Immer wenn b_i an der Stelle k gleich 1 ist wird dem Produktregister der Wert des Schieberegisters (entspricht zu dem Zeitpunkt a_i*2^k) dazuaddiert. Nach 8 Verschiebungen liegt das Ergebniss im Produktregister vor und wird an den Ausgang y_o gelegt. Realisiert ist das Ganze als State Machine. Die Latenz ist aber ziemlich hoch, da jede Stelle von a_i sequentiell verarbeitet wird.
ENTITY add_shift_mult IS PORT ( clk_i : IN std_logic; a_i : IN std_logic_vector(7 DOWNTO 0); b_i : IN std_logic_vector(7 DOWNTO 0); y_o : OUT std_logic_vector(15 DOWNTO 0) ); END ENTITY add_shift_mult;
ARCHITECTURE rtl OF add_shift_mult IS
TYPE states IS (s0, s1, s2); SIGNAL state : states;
BEGIN
fsm : PROCESS (clk_i) IS VARIABLE p : std_logic_vector(15 DOWNTO 0); -- Produktregister VARIABLE t : std_logic_vector(15 DOWNTO 0); -- temp. Schieberegister VARIABLE cnt : natural RANGE 0 TO 7; -- Zaehlervariable BEGIN IF rising_edge(clk_i) THEN CASE state IS WHEN s0 => -- Initialisierungszustand state <= s1; cnt := 0; -- Zaehler Reset p := (OTHERS => '0'); -- Produktregister Reset t := a_i; -- temp. Schieberegister mit Operand a_i laden WHEN s1 => --Multiplikation ausführen IF cnt = 7 THEN --Multiplikation fertig state <= s2; ELSE IF a_i(cnt) = '1' THEN p := p + t; -- Addieren von a_i*2^k END IF; t := t*2; -- temp. Schieberegister um 1 Stelle schieben cnt := cnt+1; -- Zaehler inkrementieren state <= s1; END IF; WHEN s2 => -- Ergebnis ausgeben und neue Multiplikation starten y <= p; -- Produktregister an Ausgang anlegen state <= s0; -- neue Multiplikation starten END CASE; END IF; END PROCESS fsm;
END ARCHITECTURE rtl;
|
|