Opis komponentu LPM_Divide z biblioteki LPM
Transkrypt
Opis komponentu LPM_Divide z biblioteki LPM
Opis komponentu LPM_Divide z biblioteki LPM Opracował: W. Wojtkowski Komponent LPM_Divide z biblioteki LPM* wykonuje operację arytmetyczną dzielenia dwóch liczb całkowitych: denom ⋅ quotient + remain = numer gdzie: denom - (denominator ) mianownik quotient - iloraz remain - (remainder) reszta numer - (numerator) licznik Funkcja umożliwia operacje na liczbach ze znakiem (signed) w kodzie U2 oraz bez znaku (unsigned), a także na kombinacji tych liczb. Jeśli którakolwiek z liczb wejściowych jest liczbą ze znakiem, to wynik także będzie liczbą ze znakiem. W wyniku wykonanej operacji dzielenia licznika (numerator) przez mianownik (denominator), na wyjściu otrzymujemy iloraz (quotient) oraz resztę (remainder). Komponent jest przystosowany do operacji w trybie potokowym (pipeline). Rys. 1. Symbol LPM_Divide używany w edytorze graficznym W tekstowym języku opisu sprzętu AHDL podobnie jak w języku programowania C, aby skorzystać z funkcji należy najpierw zamieścić w opisie jej prototyp (lub inaczej deklarację). * LPM – (Library of Parameterized Modules) Biblioteka parametryzowanych modułów LPM_Divide 1 W. Wojtkowski Deklaracja funkcji powinna się znajdować w pliku z rozszerzeniem „.inc”. Można ją dołączyć do opisu układu w języku AHDL poleceniem „INCLUDE”. Prototyp funkcji LPM_Divide w językach AHDL i Verilog: FUNCTION lpm_divide (numer[LPM_WIDTHN-1..0], denom[LPM_WIDTHD-1..0], clock, aclr, clken) WITH (LPM_WIDTHN, LPM_WIDTHD, LPM_PIPELINE, LPM_NREPRESENTATION, LPM_DREPRESENTATION) RETURNS (quotient[LPM_WIDTHN-1..0], remain[LPM_WIDTHD-1..0]; Deklaracja komponentu LPM_Divide w języku VHDL: COMPONENT lpm_divide GENERIC ( LPM_WIDTHN: POSITIVE; LPM_WIDTHD: POSITIVE; LPM_NREPRESENTATION: STRING: = "UNSIGNED"; LPM_DREPRESENTATION: STRING: = "UNSIGNED"; LPM_TYPE: STRING :="LPM_DIVIDE"; LPM_PIPELINE: INTEGER := 0; LPM_HINT: STRING:= "UNUSED"; ); PORT ( numer: IN STD_LOGIC_VECTOR(LPM_WIDTHN-1 DOWNTO 0); denom: IN STD_LOGIC_VECTOR(LPM_WIDTHD-1 DOWNTO 0); clock, aclr: IN STD_LOGIC := '0'; clken: IN STD_LOGIC := '1'; quotient: OUT STD_LOGIC_VECTOR(LPM_WIDTHN-1 DOWNTO 0); remain: OUT STD_LOGIC_VECTOR(LPM_WIDTHD-1 DOWNTO 0) ); END COMPONENT; Tabela I. Wejścia komponentu: Nazwa portu Wymagany Opis: numer[] Tak Port wejściowy (licznik) o szerokości LPM_WIDTHN denom[] Tak Port wejściowy (mianownik) o szerokości LPM_WIDTHD clock Nie Wejście zegarowe używane w trybie przetwarzania potokowego (pipeline) clken Nie Zezwolenie na taktowanie sygnałem zegarowym w trybie pipeline aclr Nie Asynchroniczne zerowanie LPM_Divide 2 W. Wojtkowski Tabela II. Wyjścia komponentu: Nazwa portu Wymagany Opis quotient[] Tak Wyjściowy port (iloraz) o szerokości LPM_WIDTHN remain[] Tak Wyjściowy port (reszta) o szerokości LPM_WIDTHD Tabela III. Parametry komponentu: Parametr Typ Wymagany Opis LPM_WIDTHN Integer Tak Szerokość portów numer[] i quotient[]. LPM_WIDTHD Integer Tak Szerokość portów denom[] i remain[]. LPM_NREPRESENTATION String Nie Określa czy licznik jest liczbą ze znakiem. LPM_DREPRESENTATION String Nie Określa czy mianownik jest liczbą ze znakiem. Nie Specyfikuje liczbę okresów zegarowych opóźnienia ustalenia się wyniku. Zero oznacza, że układ działa w trybie czysto kombinacyjnym. Domyślną wartością jest zero. Nie można ustawić tego parametru większego od LPM_WIDTHN. Nie Identyfikuje nazwę obiektu w języku VHDL Nie Pozwala na użycie parametrów specyficznych dla układów ALTERY w projektach VHDL LPM_PIPELINE Integer LPM_TYPE String LPM_HINT String Istnieje możliwość użycia komponentu w trybie przetwarzania potokowego. Należy wówczas podłączyć sygnał taktujący i określić opóźnienie jako wielokrotność okresu sygnału zegarowego, nie przekraczając jednak wartości LPM_WIDTHN. Przykład użycia LPM_Divide w trybie kombinacyjnym w edytorze graficznym przedstawiony jest na rysunku 2, natomiast wynik działania uzyskany z symulacji jest przedstawiony na rysunku 3. LPM_Divide 3 W. Wojtkowski Rys. 2. Użycie LPM_Divide w trybie kombinacyjnym w edytorze graficznym Rys. 3. Wynik działania układu z rysunku 2 Przykład wykorzystania LPM_Divide w trybie kombinacyjnym w języku AHDL: INCLUDE "lpm_divide.inc"; SUBDESIGN ukl_dziel ( licznik[3..0], mianownik[3..0] : INPUT; wynik[3..0], reszta[3..0] : OUTPUT; ) VARIABLE dzielnik: lpm_divide with (LPM_WIDTHN=4, LPM_WIDTHD=4); BEGIN dzielnik.numer[]=licznik[]; dzielnik.denom[]=mianownik[]; wynik[]=dzielnik.quotient[]; reszta[]=dzielnik.remain[]; END; Nazwa pliku „.tdf” zawierającego opis dzielnika musi być taka sama jak nazwa podana w sekcji SUBDESIGN, w tym przypadku: „ukl_dziel.tdf”. Wynik działania uzyskany z symulacji jest przedstawiony na rysunku 4. LPM_Divide 4 W. Wojtkowski Rys. 4. Wynik działania układu opisanego w AHDL Funkcja LPM_Divide pozwala na określenie reszty z dzielenia jako zawsze dodatniej (>=0) za pomocą parametru LPM_REMAINDERPOSITIVE = "TRUE". W przeciwnym wypadku reszta jest równa zeru lub ma taki sam znak jak licznik. Parametr jest ignorowany w przypadku operacji na liczbach bez znaku. Parametr LPM_REMAINDERPOSITIVE dostępny jest z poziomu języka VHDL w najnowszej wersji komponentu LPM_Divide. Działanie parametru LPM_REMAINDERPOSITIVE jest przedstawione w tabelach IV i V. Tabela IV. Przykładowe działania ilustrujące przypadek, gdy parametr LPM_REMAINDERPOSITIVE = "FALSE" LPM_Divide 5 W. Wojtkowski Tabela V. Przykładowe działania ilustrujące przypadek, gdy parametr LPM_REMAINDERPOSITIVE = " TRUE " Kolejnym parametrem dostępnym z poziomu języka VHDL jest MAXIMIZE_SPEED. Parametr ten może przyjmować wartości od 0 do 9. Wartość 9 oznacza maksymalną szybkość działania, kosztem największego zapotrzebowania na zasoby sprzętowe układu i znacznie mniejszych możliwości konfigurowania dostępnych wyprowadzeń. LPM_Divide 6 W. Wojtkowski