Układy programowalne cz.4.pdf

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