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

Podobne dokumenty