K U R S
Układy programowalne, część 4
Polecenie $ENDIF
W tej części cyklu dokończymy omówienie
Jak wspomniano w poprzednim
poleceń preprocesora kompilatora CUPL,
odcinku cyklu, polecenie to służy
do zaznaczania końca opisu HDL
omówimy także rozszerzenia nazw sygnałów
kompilowanego warunkowo, którego
przydatne podczas realizacji projektów
początek wskazuje jedno z poleceń:
$IFDEF lub $IFNDEF.
na układach GAL16V8, 18V8, 20V8 i 22V10.
Format polecenia jest następujący:
$ENDIF $DEFINE Wersja 1
Polecenia warunkowej kompilacji $IFDEF Wersja
mogą być zagnieżdżane, przy czym pin 1 = mem_req;
należy pamiętać o tym, żeby każdy pin 2 = io_req;
poziom zagnieżdżenia zaznaczony po- $ELSE
leceniem $IFDEF lub $IFNDEF został pin 1 = io_req;
zamknięty poleceniem $ENDIF. pin 2 = mem_req;
Przykład: $ENDIF
$IFDEF argument_1 W przedstawionym przykładzie
pin 1 = we1; można zdecydować o sposobie przy-
pin 2 = we2; pisania sygnałów do wyprowadzeń Rys. 19
$IFDEF argument_2 układu zmieniając nazwę zdefiniowa-
pin 3 = ramka_a; nej stałej lub przez usunięcie linii ([liczba_0, liczba_1,...liczba_n]).
pin 4 = rom_sel; zawierającej jej definicję ($DEFINE Jeżeli indeksowanie ma przebie-
$ENDIF Wersja 1). gać kolejno w podanym przedzia-
pin 5 = in_rcs; le, użytkownik może podać tylko
pin 6 = rs_dek; Polecenie $REPEAT najmniejszą i największą wartość
$ENDIF Za pomocą tego polecenia moż- z przedziału indeksowania ([licz-
na automatyzować tworzenie opisów ba_1..liczba_n]).
Polecenie $ELSE HDL, które składają się z wielu ta- Przykład:
Jest to polecenie, za pomocą któ- kich samych bloków funkcjonalnych, $REPEAT i = [0..3]
rego można tworzyć lokalne rozgałę- różniących się jedynie indeksem. wy{i} = we{i} & enable;
zienia kompilacji warunkowej, której Zakres wartości indeksu musi się $REPEND
obszar zaznaczono jednym z poleceń: mieścić w zakresie 0...1023. Wynikiem działania preprocesora
$IFDEF lub $IFNDEF. Format tego polecenia jest nastę- jest następujący opis HDL, odpo-
Działanie polecenia jest następu- pujący: wiadający układowi pokazanemu na
jące: jeżeli warunek testowany przez $REPEAT index=[liczba_0, liczba_1,...liczba_n] rys. 19:
polecenia $IFDEF i $IFNDEF jest powielany opis wy0 = we0 & enable;
spełniony (czyli opis znajdujący się z elementami wy1 = we1 & enable;
za nimi jest kompilowany), to opis indeksowanymi wy2 = we2 & enable;
po poleceniu $ELSE jest ignorowany. $REPEND wy3 = we3 & enable;
Jeżeli natomiast testowany przez po- Preprocesor przed kompilacją Oczywiście, za pomocą polecenia
lecenia $IFDEF i $IFNDEF warunek projektu rozwija opis, tworząc $REPEAT można rozw3ać znacz-
nie jest spełniony, opis HDL znaj- odpowiednią (wynikającą z zakre- nie bardziej skomplikowane bloki
dujący się po nich jest ignorowany, su indeksu) liczbę bloków funk- funkcjonalne, niż pokazany w przy-
a kompilacji jest poddawany opis po cjonalnych. Indeksowanie nie musi kładzie. Podczas rozw3ania opisu
poleceniu $ELSE. przebiegać kolejno od liczby 0 można wykorzystywać także opera-
Format polecenia jest następujący: do liczby n, ale w takim przy- tory arytmetyczne, czego przykład
$ELSE padku konieczne jest jawne poda- pokazano poniżej:
Przykład: nie kolejnych wartości indeksów FIELD licznik = [wy2..wy0];
Elektronika Praktyczna 6/2004
76
K U R S
DEFAULT NEXT 6;
PRESENT 7
IF zliczaj & reset NEXT 0;
IF !reset NEXT 0;
DEFAULT NEXT 7;
}
Rys. 22
Polecenie $REPEND
Uważni Czytelnicy zauważyli
z pewnością, że polecenie $REPEND
Rys. 20
jest używane do zaznaczania koń-
SEQUENCE licznik { ca fragmentu opisu HDL, który jest
$REPEAT i = [0..7] rozw3any zgodnie z ustalonym
PRESENT {i} przez użytkownika indeksowaniem.
IF zliczaj & reset NEXT {(i+1)%(8)}; Każde polecenie $REPEAT musi zo-
IF !reset NEXT {0}; stać odwołane przez $REPEND, nie
Rys. 23
DEFAULT NEXT {i}; jest możliwe zagnieżdżanie poleceń
$REPEND $REPEAT. Za pomocą makrofunkcji moż-
} Format tego polecenia jest nastę- na na przykład tworzyć biblioteki
Przedstawiony przykład po dzia- pujący: gotowych bloków logicznych, na
łaniu preprocesora wygląda następu- $REPEND przykład będących odpowiednikami
jąco: standardowych układów TTL.
FIELD licznik = [wy2..wy0]; Polecenie $MACRO Przykład (odpowiednik układu
SEQUENCE licznik { Za pomocą tego polecenia użyt- TTL 7474 podwójny przerzutnik
PRESENT 0 kownik może tworzyć własne makro- D):
IF zliczaj & reset NEXT 1; funkcje wywoływane w opisie HDL $MACRO TTL7474 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10
IF !reset NEXT 0; nadaną im nazwą i odpowiednimi P11 P12 P13 P14
DEFAULT NEXT 0; parametrami. Jeżeli w projekcie ma- P5.d = P2;
PRESENT 1 krofunkcja nie jest wykorzystywana, P5.ck = !P3;
IF zliczaj & reset NEXT 2; to jej opis HDL nie jest kompilo- P5.ar = !P1;
IF !reset NEXT 0; wany. P5.ap = !P4;
DEFAULT NEXT 1; W opisie makrofunkcji można P6 = !P2;
PRESENT 2 używać operatorów arytmetycznych, P9.d = P12;
IF zliczaj & reset NEXT 3; przy czym podobnie jak ma to
IF !reset NEXT 0; miejsce w przypadku polecenia $RE-
DEFAULT NEXT 2; PEAT wszystkie działania muszą
PRESENT 3 być ujęte w nawiasy półokrągłe.
IF zliczaj & reset NEXT 4; Format polecenia:
IF !reset NEXT 0; $MACRO nazwa argument_1 argument_
DEFAULT NEXT 3; 2...argument_n
PRESENT 4 opis HDL makofunkcji
Rys. 24
IF zliczaj & reset NEXT 5; $MEND
IF !reset NEXT 0;
DEFAULT NEXT 4;
PRESENT 5
IF zliczaj & reset NEXT 6;
IF !reset NEXT 0;
DEFAULT NEXT 5;
PRESENT 6
IF zliczaj & reset NEXT 7;
IF !reset NEXT 0;
Rys. 21
na 6/2004 Elektronika Praktyczna 6/2004
77
K U R S
Wywołanie tej makrofunkcji
Tab. 11. Rozszerzenia nazw zmien-
W przypadku, gdy nie
(w wyniku rozwinięcia której powsta-
nych przydatne podczas korzystania
wykorzystujemy wejść
je dekoder z wejściem zezwalającym)
z układów GAL22V10
lub wyjść makrofunkcji,
wygląda na przykład następująco: Położenie
w chwili jej wywołania
względem zna-
dekoder (2, selektor, wy_dek, inh_ext);
w miejsca parametrów
Nazwa ku równości Opis
Po takim wywołaniu preprocesor w równaniach
odpowiadającym liniom
logicznych
generuje następujący opis HDL (od-
niewykorzystanym należy
Asynchronous Reset
wstawić słowo kluczowe powiadający mu, uproszczony sche-
.AR L asynchroniczne
NC.
mat logiczny pokazano na rys. 20):
zerowanie przerzutnika
FIELD dek = [selektor1..0];
Synchronous Preset
P9.ck = !P11; wy_dek3 = dek: h 3 & inh_ext;
.SP L synchroniczne
ustawianie przerzutnika
P9.ar = !P13; wy_dek2 = dek: h 2 & inh_ext;
P9.ap = !P10; wy_dek1 = dek: h 1 & inh_ext;
Output Enable sygnał
P8 = !P12; wy_dek0 = dek: h 0 & inh_ext; .OE L sterujący pracą
bufora trójstanowego
$MEND Dobrym zwyczajem jest przecho-
Przykład (odpowiednik układu wywanie makrodefinicji w zewnętrz-
Wejście danych
.D L
TTL 7402 czterech dwuwejścio- nym pliku. W CUPL-u przyjęto, że
przerzutnika D
wych bramek NOR): rozszerzeniem nazw plików zawiera-
$MACRO TTL7402 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 jących makrofunkcje jest litera m
P11 P12 P13 P14 (*.m). Korzystanie z tych plików Przykład:
P3 = !(P1 # P2); umożliwia polecenie $INCLUDE, które pin 1 = A;
P6 = !(P4 # P5); opisano w poprzednim numerze EP. pin 2 = B;
P8 = !(P9 # P10); pin 19 = Y;
P11 = !(P12 # P13); Polecenie $MEND Y.D = A & B;
$MEND Jest to polecenie, za pomocą któ- Wynikiem przedstawionego za-
Tworzone za pomocą makrofunkcji rego jest zaznaczany koniec każdej pisu jest przypisanie do wejścia D
bloki funkcjonalne mogą być parame- makrofunkcji (czyli polecenia $MA- przerzutnika iloczynu logicznego sy-
tryzowane, co oznacza, że odpowied- CRO i $MEND muszą tworzyć pary gnałów A i B, jak pokazano to na
nio przygotowany opis licznika lub i nie mogą być zagnieżdżane). rys. 21.
dekodera może być wykorzystywany Format: CUPL obsługuje 42 rodzaje roz-
w opisie projektu dla dowolnej licz- $MEND szerzeń, z których dla początku-
by bitów (czyli np. jako licznik 4- jących (przy założeniu, że dalsza
i 12-bitowy lub jako dekoder 2->4 Rozszerzenia nazw zmiennych częśc kursu będzie poświęcona głów-
i 3->8 linii). Rozszerzenia nazw zmiennych są nie projektom realizowanym na ukła-
Przykład: wykorzystywane w celu określenia dach GAL22V10) najistotniejsze są
$MACRO dekoder l_bitow sel wy inh; specjalnej funkcji sygnału, zródła te, które przedstawiono w tab. 11.
FIELD dek = [sel{l_bitow-1}..0]; jego pochodzenia lub celu. Dzię- Na rys. 22...24 pokazano graficzną
$REPEAT i = [{(2**l_bitow)-1}..0] ki rozszerzeniom użytkownik może interpretację znaczenia przedstawio-
bezpośrednio operować na sygnałach nych rozszerzeń.
wy{i} = dek: h {i} & inh;
$REPEND niedostępnych na zewnątrz układu Piotr Zbysiński, EP
$MEND scalonego. piotr.zbysinski@ep.com.pl
Elektronika Praktyczna 6/2004
78
Wyszukiwarka
Podobne podstrony:
Układy programowalne cz 3Układy programowalne cz 7Układy programowalne cz 5Układy programowalne cz 6Układy programowalne cz 2Układy arytmetyczne cz 1471 Czym się kierowac przy wyborze programu F K cz I472 Czym się kierować przy wyborze programu F K cz IIUkłady programowalneElementy i uklady elektroniczne cz I S KutaAnalogowe układy programowane w systemie firmy Latticeuklady rownan cz IIZałšcznik do uchwały Program zapobiegania przestępczo ci cz ICz II Układy pomiarowe, Sondywięcej podobnych podstron