Układy programowalne cz.7.pdf

(828 KB) Pobierz
KURS.indd
K U R S
Układy programowalne, część 7
Automaty – krok 1
Klasyczne układy synchroniczne,
często zwane automatami, budowa-
ne są na bazie przerzutników, które
spełniają w nich rolę pamięci sta-
nu. W zasadzie, poza przerzutnika-
mi RS, wszystkie inne rodzaje prze-
rzutników (T, D, JK, JK-MS) nadają
się do spełniania roli pamięci stanu
w automatach. W komórkach OLMC
układów ispGAL22V10 (taki zastoso-
wano w zestawie AVT-599) znajdują
się przerzutniki typu D z wejściami
synchronicznego ustawiania i asyn-
chronicznego zerowania.
Na list . 11 ... 14 znajdują się opi-
sy HDL czterech przerzutników, któ-
rych praca jest synchronizowana
(oprócz przerzutnika RS, który nie
wymaga sygnału zegarowego) przez
sygnał zegarowy. Użytkownik korzy-
stający z zestawu AVT-599 może wy-
brać jego źródło (za pomocą jumpera
JP4).
Ponieważ – jak już wcześniej
wspomniano – w komórkach OLMC
układów GAL22V10 znajdują się
przerzutniki typu D, opis przed-
stawiony na list. 11 przygotowa-
Siódmą część cyklu poświęcamy przedstawieniu
przykładów opisu klasycznych układów synchronicznych,
w tym przede wszystkim liczników. Zaczniemy od
opisu HDL najważniejszych elementów takich układów:
przerzutników.
wodu w opisie nie są wykorzystane
dostępne w GAL22V10 sygnały asyn-
chronicznego zerowania Q.AR, NIE_
Q.AR oraz synchronicznego ustawia-
nia Q.SP i NIE_Q.SP.
no nieco „na wyrost”. Zastosowa-
nie w równaniach synchronicznych
wejść zerowania (RESET) i ustawia-
nia (PRESET) powoduje jednak, że
możliwości funkcjonalne implemento-
wanego przerzutnika są takie same,
niezależnie od jego budowy w do-
celowym układzie PLD. Zwiększamy
w ten sposób uniwersalność opisu,
który „pasuje” do każdego układu
PLD z wbudowanymi jakimikolwiek
przerzutnikami D. Z tego samego po-
Automaty – krok 2
W zależności od sposobu tworze-
nia sygnałów wyjściowych, automa-
ty dzielą się na automaty Moore’a
(schemat blokowy pokazano na rys .
33 ) i Mealy’ego (schemat blokowy
pokazano na rys . 34 ). Różnica po-
między nimi polega na tym, że sy-
gnały wyjściowe w automacie Mealy-
’ego są tworzone w postaci funkcji
kombinacyjnej dwóch zmiennych: bi-
tów wyjściowych przerzutników pa-
miętających aktualny stan automatu
(informacja pobierana z wyjść prze-
List. 11. Opis w języku CUPL przerzutnika typu D
z synchronicznymi wejściami zerowania i ustawiania
Name d_ff;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 2 = CLK; /* Wejscie zegarowe */
PIN 6 = DATA; /* Stan na wejsciu ustala JP2 */
PIN 4 = PRESET; /* Wejscie synchronicznego ustawiania – JP1*/
PIN 11 = RESET; /* Wejscie synchronicznego zerowania – B_0 SW1 */
/***** Wyjscia *****/
PIN [17, 18] = [Q, NIE_Q]; /* Wyjscia przerzutnika */
/***** Opis HDL *****/
Q.D = PRESET # (DATA & !RESET);
NIE_Q.D = RESET # (!DATA & !PRESET);
List. 13. Opis w języku CUPL przerzutnika typu JK
z synchronicznymi wejściami zerowania i ustawiania
Name jk_ff;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 2 = CLK; /* Wejscie zegarowe */
PIN 4 = PRESET; /* Wejscie synchronicznego ustawiania – JP1*/
PIN 6 = RESET; /* Wejscie synchronicznego zerowania – JP2 */
PIN 7 = J; /* Wejscie synchronicznego zerowania – B_0 SW1 */
PIN 9 = K; /* Wejscie synchronicznego zerowania – B_1 SW1 */
/***** Wyjscia *****/
PIN [17, 18] = [Q, NIE_Q]; /* Wyjscia przerzutnika */
/***** Opis HDL *****/
Q.D = PRESET # (J & NIE_Q & !RESET) # (!K & Q & !RESET);
NIE_Q.D = RESET # (!J & NIE_Q & !PRESET) # (K & Q & !PRESET);
List. 12. Opis w języku CUPL przerzutnika typu T
z synchronicznymi wejściami zerowania i ustawiania
Name t_ff;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 2 = CLK; /* Wejscie zegarowe */
PIN 6 = T; /* Stan na wejsciu T ustala JP2 */
PIN 4 = PRESET; /* Wejscie synchronicznego ustawiania – JP1*/
PIN 11 = RESET; /* Wejscie synchronicznego zerowania – B_0 SW1 */
/***** Wyjscia *****/
PIN [17, 18] = [Q, NIE_Q]; /* Wyjscia przerzutnika */
/***** Opis HDL *****/
Q.D = PRESET # (!RESET & !T & Q) # (!RESET & T & NIE_Q);
NIE_Q.D = RESET # (!PRESET & !T & NIE_Q) # (!PRESET & T & Q);
List. 14. Opis w języku CUPL przerzutnika typu RS (na
bramkach NAND)
Name rs_ff;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 4 = S; /* Wejscie ustawiania – JP1*/
PIN 6 = R; /* Wejscie zerowania – JP2 */
/***** Wyjscia *****/
PIN [17, 18] = [Q, NIE_Q]; /* Wyjscia przerzutnika */
/***** Opis HDL *****/
Q = !S # (R & Q);
NIE_Q = !R # (S & NIE_Q);
Elektronika Praktyczna 9/2004
93
32814699.048.png
K U R S
Można także w praktyce
Programy źródłowe wszyst-
kich projektów opisanych
w ramach kursu publikuje-
my na CD-EP9/2004B. Ich
działanie można sprawdzić
w praktyce za pomocą
zestawu AVT-599 (opisa-
ny w EP3/2004), w którym
zastosowano programowany
w systemie układ
ispGAL22V10.
rzutników spełniających rolę pamię-
ci stanu) i aktualnego stanu wejść
automatu. Użytkownik odpowiednio
przygotowując opis automatu może
wymusić implementację projektu
w jednym lub drugim rodzaju auto-
matu. W większości przypadków wa-
lory automatów Moore’a są na tyle
duże, że implementowane w nim
projekty spełniają wymagania typo-
wych aplikacji.
Prezentację opisu automatów za-
czniemy od 4-bitowego licznika liczą-
cego w cyklu modulo 16 w dwóch
kierunkach. Licznik wyposażono
w wejście sychronicznego zerowania.
Jego opis HDL przedstawiono na list .
15 . Ze względu na wygodę zastoso-
wano w nim opis przejść warunko-
wych pomiędzy kolejnymi stanami
automatu, co pozwala na wygodne
odwzorowanie standardowego grafu
przejść. Ten sam efekt funkcjonalny
można uzyskać za pomocą przypisa-
nia do wejścia D każdego przerzut-
nika (Q0.d, Q1.d, Q2.d i Q3.d) wyj-
ściowego funkcji logicznej, ale nie
jest to zadanie łatwe do wykonania,
na co dowodem może być przedsta-
wione poniżej równanie dla przerzut-
nika Q3.d:
Q3.d =>
Q0 & Q1 & Q2 & Q3 & !RESET & U_D
# !Q0 & !Q1 & !Q2 & !Q3 & !RESET & U_D
# Q0 & Q1 & Q2 & !Q3 & !RESET & !U_D
# !Q1 & !Q2 & Q3 & !RESET & !U_D
# Q0 & !Q2 & Q3 & !RESET & U_D
# !Q0 & Q1 & Q3 & !RESET
# Q0 & Q1 & !Q2 & Q3 & !RESET & !U_D
# !Q1 & Q2 & Q3 & !RESET
Wykonywanie takich „sztuczek”
zaprzecza wygodzie korzystania z ję-
zyka wysokiego poziomu, więc po-
traktujmy przedstawioną możliwość
jedynie jako przykład możliwości
CUPL-a, a nie zalecany sposób pro-
jektowania.
O tym, że opis licznika za po-
mocą równań logicznych nie jest
najwygodniejszym sposobem realiza-
cji projektu, nie trzeba nikogo prze-
konywać. Trzeba jednak przyznać,
że także opis kolejnych przejść, jak-
kolwiek znacznie bardziej czytelny
nie jest pozbawiony wady: jest po
prostu bardzo długi i w przypadku
konieczności wprowadzenia jakiejkol-
wiek zmiany (np. modyfikacji długo-
ści cyklu zliczania lub wprowadzenia
dodatkowych sygnałów sterujących),
poprawianie tak przygotowanego opi-
su nie jest wygodne. Sytuację upro-
ści zastosowanie komendy preproce-
sora $REPEAT , jak to pokazano na
list . 16 . Wygodę stosowania zapisów
„kompaktowych” zilustrowano na list .
17 , na którym pokazano opis HDL
licznika modulo 10 , który jest odpo-
wiednikiem funkcjonalnym liczników
z list. 15 i 16.
Przedstawione opisy dotyczą po-
jedynczego licznika, który nie może
Rys. 33
Rys. 34
94
Elektronika Praktyczna 9/2004
32814699.049.png 32814699.050.png 32814699.051.png 32814699.001.png 32814699.002.png 32814699.003.png 32814699.004.png 32814699.005.png 32814699.006.png 32814699.007.png 32814699.008.png 32814699.009.png 32814699.010.png 32814699.011.png 32814699.012.png 32814699.013.png 32814699.014.png 32814699.015.png 32814699.016.png 32814699.017.png 32814699.018.png 32814699.019.png 32814699.020.png 32814699.021.png 32814699.022.png 32814699.023.png 32814699.024.png 32814699.025.png 32814699.026.png 32814699.027.png 32814699.028.png 32814699.029.png 32814699.030.png 32814699.031.png 32814699.032.png 32814699.033.png 32814699.034.png 32814699.035.png
 
K U R S
List. 15. Opis 4-bitowego licznika
góra/dół z synchronicznym wej-
ściem zerującym i jawnymi de-
klaracjami wartości przypisanych
kolejnym stanom
Name cnt_ud_mod16;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
List. 16. Opis 4-bitowego liczni-
ka góra/dół z synchronicznym
wejściem zerującym i skróconym
zapisem deklaracji wartości przypi-
sanych kolejnym stanom
Name cnt_ud_mod16_r;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 2 = CLK; /* Wejscie zegarowe */
PIN 4 = RESET; /* Wejscie asynchronicznego */
/*zerowania – JP1*/
PIN 6 = U_D; /* Wybor kierunku zliczania */
/*– JP2 */
Rys. 35
/***** Wejscia *****/
PIN 2 = CLK; /* Wejscie zegarowe */
PIN 4 = RESET; /* Wejscie asynchronicznego */
/* zerowania – JP1*/
PIN 6 = U_D; /* Wybor kierunku zliczania */
/* – JP2 */
/***** Wyjscia *****/
PIN [17..20] = [Q3..0]; /* Wyjscia licznika*/
/***** Deklaracje pomocnicze *****/
field licznik = [Q3..0];
$REPEAT i = [0..15]
$DEFINE S{i} {i}
$REPEND
field mode = [RESET,U_D];
up = mode:0; /* w gore */
down = mode:1; /* w dol */
clear = mode:[2..3]; /* zerowanie */
/***** Opis HDL *****/
sequence licznik {
PRESENT S0
IF up NEXT S1;
IF down NEXT S15;
IF clear NEXT S0;
$REPEAT i = [1..15]
PRESENT S{i}
IF up NEXT S{(i+1)%16};
IF down NEXT S{(i-1)%16};
IF clear NEXT S0;
$REPEND
}
/***** Wyjscia *****/
PIN [17..20] = [Q3..0]; /* Wyjscia licznika */
/***** Deklaracje pomocnicze *****/
field licznik = [Q3..0];
$define S0 ‚b’0000
$define S1 ‚b’0001
$define S2 ‚b’0010
$define S3 ‚b’0011
$define S4 ‚b’0100
$define S5 ‚b’0101
$define S6 ‚b’0110
$define S7 ‚b’0111
$define S8 ‚b’1000
$define S9 ‚b’1001
$define S10 ‚b’1010
$define S11 ‚b’1011
$define S12 ‚b’1100
$define S13 ‚b’1101
$define S14 ‚b’1110
$define S15 ‚b’1111
Rys. 36
być łączony w synchroniczne ka-
skady z innymi, co pozwoliłoby
na zwiększenie długości zliczanego
słowa. Jest to dość poważna wada
przedstawionego rozwiązania, war-
to więc by było wyposażyć liczniki
w wejście i wyjście przeniesienia,
które umożliwią ich łączenie w wie-
lobitowe zespoły liczące. Jedyną moż-
liwością zwiększenia długości zli-
czania jest połączenie ich w sposób
pokazany na rys . 35 , ale rozwiązanie
to ma wadę: naruszana jest synchro-
niczność licznika, co w przypadku
większych częstotliwości taktowania
może spowodować niepoprawną jego
pracę.
Na list . 18 pokazano przykłado-
wy opis 4-bitowego licznika liczące-
go w cyklu modulo 10, wyposażo-
nego w wejście (CI) i wyjście (CO)
przeniesienia (sposób szeregowego
łączenia takich liczników pokaza-
no na rys . 36 ). Opis tego licznika
nie różni się zbytnio od wcześniej
przedstawionych, należy zwrócić je-
dynie uwagę na to, że w każdym
stanie rozpatrywanych jest więcej
warunków, z których jeden ( if
others ) zapewnia zatrzymanie się
licznika w bieżącym stanie z jego
podtrzymaniem. Drugą rzeczą, na
którą warto zwrócić uwagę, jest
występujące w dwóch miejscach
polecenie out CO , za pomocą któ-
rego „wyprowadzany” jest sygnał
przeniesienia.
field mode = [RESET,U_D];
up = mode:0; /* w gore */
down = mode:1; /* w dol */
clear = mode:[2..3]; /* zerowanie */
/***** Opis HDL *****/
sequence licznik {
present S0 if up next S1;
if down next S15;
if clear next S0;
present S1 if up next S2;
if down next S0;
if clear next S0;
present S2 if up next S3;
if down next S1;
if clear next S0;
present S3 if up next S4;
if down next S2;
if clear next S0;
present S4 if up next S5;
if down next S3;
if clear next S0;
present S5 if up next S6;
if down next S4;
if clear next S0;
present S6 if up next S7;
if down next S5;
if clear next S0;
present S7 if up next S8;
if down next S6;
if clear next S0;
present S8 if up next S9;
if down next S7;
if clear next S0;
present S9 if up next S10;
if down next S8;
if clear next S0;
present S10 if up next S11;
if down next S9;
if clear next S0;
present S11 if up next S12;
if down next S10;
if clear next S0;
present S12 if up next S13;
if down next S11;
if clear next S0;
present S13 if up next S14;
if down next S12;
if clear next S0;
present S14 if up next S15;
if down next S13;
if clear next S0;
present S15 if up next S0;
if down next S14;
if clear next S0;
}
List. 17. Opis 4-bitowego liczni-
ka góra/dół liczącego w cyklu
modulo 10 z synchronicznym
wejściem zerującym i skróconym
zapisem deklaracji wartości przypi-
sanych kolejnym stanom
Name cnt_ud_mod10_r;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/***** Wejscia *****/
PIN 2 = CLK; /*Wejscie zegarowe */
PIN 4 = RESET; /*Wejscie asynchronicznego*/
/*zerowania – JP1*/
PIN 6 = U_D; /*Wybor kierunku zliczania*/
/*– JP2 */
/***** Wyjscia *****/
PIN [17..20] = [Q3..0]; /*Wyjscia licznika*/
/***** Deklaracje pomocnicze *****/
field licznik = [Q3..0];
$REPEAT i = [0..9]
$DEFINE S{i} {i}
$REPEND
field mode = [RESET,U_D];
up = mode:0; /* w gore */
down = mode:1; /* w dol */
clear = mode:[2..3]; /* zerowanie */
/***** Opis HDL *****/
sequence licznik {
PRESENT S0
IF up NEXT S1;
IF down NEXT S9;
IF clear NEXT S0;
$REPEAT i = [1..9]
PRESENT S{i}
IF up NEXT S{(i+1)%10};
IF down NEXT S{(i-1)%10};
IF clear NEXT S0;
$REPEND
}
Automaty – krok 3
Automaty opisywane w języku
CUPL można wykorzystać do gene-
rowania sygnałów synchronicznych
i asynchronicznych, które będą wy-
Elektronika Praktyczna 9/2004
95
32814699.036.png 32814699.037.png 32814699.038.png 32814699.039.png 32814699.040.png 32814699.041.png 32814699.042.png 32814699.043.png 32814699.044.png
K U R S
List. 18. Opis 4-bitowego liczni-
ka góra/dół liczącego w cyklu
modulo 10 z synchronicznym
wejściem zerującym i możliwością
łączenia ze sobą liczników w ka-
skady synchroniczne
Name cnt_ud_mod10_rc;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
List. 18 - cd
present S2 next S3 out CO;
present S3 next S0;
}
Jakkolwiek takie rozwiązanie jest
technicznie eleganckie, należy pa-
miętać, że generowany sygnał pojawi
się na wyjściu opóźniony o jeden
takt zegarowy (jeżeli jest generowany
w stanie S2, to na wyjściu pojawi
się na czas trwania stanu S3). Widać
to na rys . 37 (źródło symulowanego
automatu 4-stanowego jest dostępne
na CD-EP9/2004B w katalogu \ OUT _
synchro i na stronie internetowej EP
w dziale Download ).
- w przypadku, gdy sygnał wyjścio-
wy ma być wytwarzany w ukła-
dzie kombinacyjnym (może wtedy
zawierać zakłócenia szpilkowe wy-
wołane przez opóźnienia w funk-
torach logicznych tworzących ten
sygnał), zapis w języku CUPL jest
następujący:
sequence licznik {
present S0 next S1;
present S1 next S2;
present S2 next S3;
out CO ;
present S3 next S0;
W odróżnieniu od synchronicz-
nego „wyprowadzania” sygnału CO,
tym razem pojawia się on dokład-
nie podczas stanu, do którego go
przypisano ( rys . 38 ). Nieco więcej
zabiegów w tym przypadku wyma-
ga opisanie układu generującego wa-
runkowo sygnał wyjściowy, ponieważ
jest on przypisany do danego stanu
– jeżeli automat się w nim znajdzie,
sygnał wyjściowy na pewno się po-
jawi. Z tego wynika konieczność
wcześniejszego, niż ma to miejsce
w układach synchronicznych, rozpa-
trywania warunków zmiany stanu.
Piotr Zbysiński, EP
piotr.zbysinski@ep.com.pl
/***** Opis HDL *****/
sequence licznik {
present S0 if up next S1;
if down next S9;
if others next S0;
if clear next S0;
present S1 if up next S2;
if down next S0 out CO;
if others next S1;
if clear next S0;
present S2 if up next S3;
if down next S1;
if others next S2;
if clear next S0;
present S3 if up next S4;
if down next S2;
if others next S3;
if clear next S0;
present S4 if up next S5;
if down next S3;
if others next S4;
if clear next S0;
present S5 if up next S6;
if down next S4;
if others next S5;
if clear next S0;
present S6 if up next S7;
if down next S5;
if others next S6;
if clear next S0;
present S7 if up next S8;
if down next S6;
if others next S7;
if clear next S0;
present S8 if up next S9 out CO;
if down next S7;
if others next S8;
if clear next S0;
present S9 if up next S0;
if down next S8;
if others next S9;
if clear next S0;
}
/***** Wejscia *****/
PIN 2 = CLK; /*Wejscie zegarowe */
PIN 4 = RESET; /*Wejscie asynchronicznego*/
/*zerowania – JP1*/
PIN 6 = U_D; /* Wybor kierunku zliczania*/
/*– JP2 */
PIN 11 = CI;
/***** Wyjscia *****/
PIN [17..20] = [Q3..0]; /*Wyjscia licznika*/
PIN 26 = CO;
/***** Deklaracje pomocnicze *****/
field licznik = [Q3..0];
$define S0 ‚b’0000
$define S1 ‚b’0001
$define S2 ‚b’0010
$define S3 ‚b’0011
$define S4 ‚b’0100
$define S5 ‚b’0101
$define S6 ‚b’0110
$define S7 ‚b’0111
$define S8 ‚b’1000
$define S9 ‚b’1001
field mode = [U_D,CI,RESET];
up = mode:’b’010; /* w gore */
down = mode:’b’110; /* w dol */
others = mode:’b’x00;
clear = mode:’b’xx1;
stępować wraz z określonymi stana-
mi automatów. Do tego celu służy
polecenie out , które w przykładzie
pokazanym na list. 18 wykorzystano
do „wyprowadzenia” z licznika sy-
gnału przeniesienia CO.
Z polecenia out można skorzy-
stać na dwa sposoby, uzyskując róż-
ne wyniki:
- jeżeli chcemy uzyskać sygnał syn-
chronizowany przebiegiem zegaro-
wym (czyli uzyskiwany na wyjściu
przerzutnika taktowanego tym sa-
mym sygnałem zegarowym, którym
jest taktowany automat), to należy
korzystać z następującego zapisu:
sequence licznik {
present S0 next S1;
present S1 next S2;
present S2 if A next S3 out CO ;
if !A next S1;
present S3 next S0;
}
lub, gdy generowanie sygnału jest
bezwarunkowe:
equence licznik {
present S0 next S1;
present S1 next S2;
Rys. 37
Rys. 38
96
Elektronika Praktyczna 9/2004
32814699.045.png 32814699.046.png 32814699.047.png
Zgłoś jeśli naruszono regulamin