VHDL-Forum

 
Sie sind nicht eingeloggt.
LoginLogin Kostenlos anmeldenKostenlos anmelden
BeiträgeBeiträge MembersMitglieder SucheSuche HilfeHilfe
VotesUmfragen FilesDateien CalendarKalender BookmarksBookmarks
add-shift multiplizierer

Anfang   zurück   weiter   Ende
Autor Beitrag
lex
Gast
New PostErstellt: 30.10.06, 22:28  Betreff: add-shift multiplizierer  drucken  Thema drucken  weiterempfehlen Antwort mit Zitat  

wie realisier ich einen add-shift multiplizierer? help!
nach oben
xGCFx
Stammgast


Beiträge: 33
Ort: Dresden

New PostErstellt: 31.10.06, 14:13  Betreff: Re: add-shift multiplizierer  drucken  weiterempfehlen Antwort mit Zitat  

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;


nach oben
Benutzerprofil anzeigen Private Nachricht an dieses Mitglied senden
Sortierung ndern:  
Anfang   zurück   weiter   Ende
Seite 1 von 1
Gehe zu:   
Search

powered by carookee.com - eigenes profi-forum kostenlos

Design © trevorj