Hier die Top-Entity E_Festkomma: ________________________________ LIBRARY ieee; LIBRARY work; USE ieee.std_logic_1164.all; -- Ein-/Ausgabe USE ieee.std_logic_arith.all; -- Arithmetische Grundfunktionen USE ieee.std_logic_unsigned.all; -- Vorzeichenlose Operatoren USE work.Typen.all; -- Einbinden der Typen entity E_Festkomma is port( CLOCK : in std_ulogic; -- Takt-Leitung RESET : in std_ulogic; -- Reset-Leitung Zahl1, -- Erste Zahl als Bitstring, die in die Berechnung eingeht Zahl2: in std_logic_vector; -- Zweite Zahl als Bitstring, die in die Berechnung eingeht -- (Ausnahme bildet hierbei das Wurzelziehen) Breite1, -- Breite des ersten Operanden Breite2 : in std_logic_vector; -- Breite des zweiten Operanden Komma1, -- Position des Festkommas beim ersten Operanden Komma2 : in std_logic_vector; -- Position des Festkommas beim zweiten Operander Vor1, -- Vorzeichen des ersten Operanden Vor2 : in std_ulogic; -- Vorzeichen des zweiten Operanden NachErg : in std_logic_vector; -- Anzahl der Nachkommastellen des Ergebnisses -- -> Vorkommastellen ergeben sich entsprechend Start : in std_ulogic; -- Starten der Berechnung -> Operanden werden übernommen Add, -- Aktivierung der Addition Sub, -- Aktivierung der Subtraktion Mul, -- Aktivierung der Multiplikation Div : in std_ulogic; -- Aktivierung der Division Busy : out std_ulogic; -- zeigt an, ob aktuell gerechnet wird Ergebnis : out FestkommaZahl -- Ergebnis der Berechnung ); end entity E_Festkomma; architecture A_Festkomma of E_Festkomma is -- Der erste Operand als Festkomma-Record signal Operand1 : FestkommaZahl; -- Der zweite Operand als Festkomma-Record signal Operand2 : FestkommaZahl; component E_Addierer port( CLK, -- Takt RESET : std_ulogic; -- Reset-Leitung Beginn : std_ulogic; -- Aktivierung der Komponente Aktiv : std_ulogic; -- zeigt an, ob die Komponente aktiv ist Summand1, -- 1. Summand Summand2 : FestkommaZahl; -- 2. Summand NachKomSumm : std_logic_vector; -- Anzahl der Nachkommastellen des Ergebnisses Summe : FestkommaZahl -- Ergebnis der Rechnung: Summe ); end component; component E_Subtrahierer port( CLK, -- Takt RESET : std_ulogic; -- Reset-Leitung Beginn : std_ulogic; -- Aktivierung der Komponente Aktiv : std_ulogic; -- zeigt an, ob die Komponente aktiv ist Minuend, -- Minuend Subtrahend : FestkommaZahl; -- Subtrahend NachKomDiff : std_logic_vector; -- Anzahl der Nachkommastellen des Ergebnisses Differenz : FestkommaZahl -- Ergebnis der Rechnung: Differenz ); end component; component E_Multiplizierer port( CLK, -- Takt RESET : std_ulogic; -- Reset-Leitung Beginn : std_ulogic; -- Aktivierung der Komponente Aktiv : std_ulogic; -- zeigt an, ob die Komponente aktiv ist Faktor1, -- 1. Faktor Faktor2 : FestkommaZahl; -- 2. Faktor NachKomProd : std_logic_vector; -- Anzahl der Nachkommastellen des Ergebnisses Produkt : FestkommaZahl -- Ergebnis der Rechnung: Produkt ); end component; component E_Dividierer port( CLK, -- Takt RESET : std_ulogic; -- Reset-Leitung Beginn : std_ulogic; -- Aktivierung der Komponente Aktiv : std_ulogic; -- zeigt an, ob die Komponente aktiv ist Dividend, -- Dividend Divisor : FestkommaZahl; -- Divisor NachKomQuot : std_logic_vector; -- Anzahl der Nachkommastellen des Ergebnisses Quotient : FestkommaZahl -- Ergebnis der Rechnung: Quotient ); end component; begin go: process(CLOCK,Start) variable Int1, Int2, Int3, Int4 : integer; begin Int1 := toInteger(Breite1); Int2 := toInteger(Komma1); Int3 := toInteger(Breite2); Int4 := toInteger(Komma2); -- hier müsste noch der FestkommaZahl-Record mit den Inputs gefüllt werden end process go; -- dann die einzelnen Prozesse einleiten Addition : E_Addierer PORT MAP ( CLOCK, -- Takt RESET, -- Reset-Leitung Add, -- Aktivierung der Komponente Busy, -- zeigt an, ob die Komponente aktiv ist Operand1, -- 1. Summand Operand2, -- 2. Summand NachErg, -- Anzahl der Nachkommastellen des Ergebnisses Ergebnis -- Ergebnis der Rechnung: Summe ); Subtraktion : E_Subtrahierer PORT MAP ( CLOCK, -- Takt RESET, -- Reset-Leitung Sub, -- Aktivierung der Komponente Busy, -- zeigt an, ob die Komponente aktiv ist Operand1, -- Minuend Operand2, -- Subtrahend NachErg, -- Anzahl der Nachkommastellen des Ergebnisses Ergebnis -- Ergebnis der Rechnung: Differenz ); Multiplikation : E_Multiplizierer PORT MAP ( CLOCK, -- Takt RESET, -- Reset-Leitung Mul, -- Aktivierung der Komponente Busy, -- zeigt an, ob die Komponente aktiv ist Operand1, -- 1. Faktor Operand, -- 2. Faktor NachErg, -- Anzahl der Nachkommastellen des Ergebnisses Ergebnis -- Ergebnis der Rechnung: Produkt ); Division : E_Dividierer PORT MAP ( CLOCK, -- Takt RESET, -- Reset-Leitung Div, -- Aktivierung der Komponente Busy, -- zeigt an, ob die Komponente aktiv ist Operand1, -- Dividend Operand2, -- Divisor NachErg, -- Anzahl der Nachkommastellen des Ergebnisses Ergebnis -- Ergebnis der Rechnung: Quotient ); end architecture; ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ Und hier das bisher noch sehr kleine Package mit dem Festkomma-Typen: _____________________________________________________________________ LIBRARY ieee; USE ieee.std_logic_1164.all; -- Ein-/Ausgabe USE ieee.std_logic_arith.all; -- Arithmetische Grundfunktionen USE ieee.std_logic_unsigned.all; -- Vorzeichenlose Operatoren Package Typen is -- Record einer Festkommazahl TYPE FestkommaZahl is record -- Gesamte Breite des Bitvektors Breite : integer; -- Gibt die Positon des festen Kommas innerhalb des Bitvektors an und ist < kleiner Breite Festkomma : integer; -- Gibt an, ob ein Vorzeichenbit reserviert ist VorzeichenBit : std_logic; Zahl : std_logic_vector; end record; -- Funktion zum Konvertieren eines Vektors in einen Integerwert function toInteger(Vec : std_logic_vector) return integer; end Typen; package body Typen is -- Funktion, die einen Vektor in einen Integerwert umrechnet und diesen ausgibt function toInteger(Vec : std_logic_vector) return integer is variable TempInt : integer := 0; -- lokale Speichervariable des Ergebnisses begin for i in Vec'range loop if Vec(i) = '1' then TempInt := TempInt*2+1; else TempInt := TempInt*2; end if; end loop; return TempInt; end function toInteger; end Typen;