K U R S
Układy programowalne, część 6
Jak już wcześniej wspomniano, Kontynuujemy prezentację przykładowych opisów w języku
za pomocą języka CUPL można opi-
CUPL, w tej części skupiając się na układach kombinacyjnych.
sywać projektowane sprzętowe bloki
Kody zródłowe prezentowanych projektów wraz z plikami
funkcjonalne na wiele sposobów.
Najbardziej oczywistym i przy tym
symulacyjnymi publikujemy na CD-EP8/2004B. Gorąco zachęcamy
najmniej wygodnym są równania bo-
do samodzielnych prób, do których można wykorzystać zestaw
ole owskie, odpowiadające w nomen-
ewaluacyjny AVT-559.
klaturze mikroprocesorowej pisaniu
programów w asemblerze. Pokażemy
teraz kilka przykładów rozwiązania
Inne możliwości
prostych, aczkolwiek często napoty-
stosowania operatora
kanych w praktyce, problemów za
przypisania
pomocą różnych sposobów opisu.
Operator przypisania można
wykorzystać do skrócenia
Dekoder adresowy
zapisu równań logicznych dla
Zaprojektujemy dekoder adresowy
operatorów działań: &, # i $.
z trzema wyjściami (RAM_SEL, IO_
SEL, ROM_SEL), które uaktywniają (poziom aktywny tych sygnałów to
Przykładowo zapisy:
1 ) bloki peryferyjne systemu cyfro- [A3,A2,A1,A0]:&
[B3,B2,B1,B0]:#
wego w zależności do stanu wejść
[A,B,C,D]:$
adresowych Adr4...Adr0 (32 różne
odpowiadają równaniom:
adresy). Mapę przykładowego obsza-
A3 & A2 & A1 & A0
ru adresowego pokazano na rys. 28
B3 # B2 # B1 # B0
(zaciemnione pola wskazują peryferia
A $ B $ C $ D
aktywne pod danym adresem).
Zminimalizowane równania lo-
List. 4. Równania boole owskie
giczne zapewniające realizację
funkcji logicznych dla wyjść IO_SEL
przez układ PLD funkcji zgodnie
i RAM_SEL (funkcje zgodnie z rys. 28)
z podaną specyfikacją dla wyjść
IO_SEL = Adr1 & Adr2 & !Adr3 & !Adr4
# !Adr1 & !Adr2 & Adr3 & !Adr4
IO_SEL i RAM_SEL przedstawio-
# !Adr0 & Adr1 & !Adr2 & Adr3 & !Adr4
# !Adr0 & !Adr1 & Adr2 & !Adr3 & Adr4
no na list. 4. Skonstruowanie tych
# Adr0 & Adr1 & Adr2 & Adr3 & Adr4
równań, jakkolwiek możliwe, jest
RAM_SEL = Adr0 & Adr1 & Adr3 & !Adr4
# !Adr1 & Adr2 & Adr3 & !Adr4
jednak dość kłopotliwe i znacznie
# !Adr0 & Adr1 & Adr2 & Adr3 & !Adr4
utrudnia wprowadzenie do pro- # !Adr2 & Adr4
# Adr0 & Adr2 & !Adr3 & Adr4
jektu ewentualnych zmian jak np.
# !Adr0 & Adr1 & Adr2 & !Adr3 & Adr4
przesunięcia lokalizacji peryferiów
w przestrzeni adresowej. Znacznie
List. 5. Listing projektu dekodera
lepszym i wygodniejszym wyjściem
adresów z pięcioma wejściami
jest zapisanie projektu w sposób i trzema wyjściami (funkcje zgod-
pokazany na list. 5. W opisie tym nie z rys. 28)
Name dekoder;
zastosowano operator przypisania (:
Partno brak;
Revision brak;
), za pomocą którego wcześniej za-
Date 20/05/04;
deklarowanym wektorom są przypi- Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
Kierunek linii I/O
/* Adres ustala sie za pomoca nastawnika
/* SW1(Adr0...Adr3)
Projektant przygotowu-
/* az jumpera JP1 (Adr4) */
jąc opis HDL za pomocą
/***** Wejscia *****/
PIN [7,9..11] = [Adr3..0];
CUPL-a nie musi (nie ma
PIN 4 = Adr4; /* Jumper JP1 */
jak) zadeklarować kierun-
/***** Wyjscia *****/
ków sygnałów przypisanych PIN [26,23,17] = [RAM_SEL,IO_SEL,ROM_SEL];
do wyprowadzeń (wejścia/
/***** Deklaracje pomocnicze *****/
field ADRES = [Adr4..0];
wyjścia/wejścia-wyjścia).
serport_tx = ADRES:[ d 6.. d 10];
serport_rx = ADRES: d 20 # ADRES: d 31;
Kompilator ustala kierunki
ram_rd = ADRES:[ d 11.. d 19];
ram_wr = ADRES:[ d 21.. d 27];
samoczynnie na podstawie
/***** Opis HDL *****/
opisu i w odniesieniu do
RAM_SEL = ram_rd # ram_wr;
fizycznych możliwości doce- IO_SEL = serport_tx # serport_rx;
ROM_SEL = ADRES:[ d 0.. d 5] # ADRES:
lowego układu PLD.
[ d 28.. d 30];
Rys. 28
Elektronika Praktyczna 8/2004
81
K U R S
List. 6. Projekt dekodera wyświe-
tlacza 7-segmentowego opisane-
go równaniami logicznymi
Name dek_wys;
Partno U1;
Revision 01;
Date 20/05/04;
Designer PZb;
Company EP;
Location brak;
Assembly brak;
Device g22v10lcc;
/*Stany na wejsciach D3...D0 ustala sie za */
/* pomoca nastawnika SW1 */
/************************/
/* a */
/* ----- */
/* | | */
/* f| |b */
/* | g | */
/* ----- */
/* | | */
/* e| |c */
/* | | */
/* ----- */
/* d */
/* */
/************************/
/***** Wejscia *****/
PIN [7,9..11] = [D3..0];
/***** Wyjscia *****/
PIN [24,21,23,20,19,25,18] = [G,F,E,D,C,B,A];
/***** Deklaracje pomocnicze *****/
Field dana = [D3..0];
Field segment = [A,B,C,D,E,F,G];
/***** Opis HDL *****/
A = !D0 & !D2 & !D3
# D0 & D1 & D2 & D3
# D0 & D1 & !D3
# D0 & !D1 & D2
Rys. 29 # !D0 & D1 & D2
# !D0 & !D1 & D2 & D3
# !D2 & D3;
B = !D1 & !D2 & D3
# !D2 & !D3
# !D0 & !D1 & D2 & !D3
# D0 & D1 & D2 & !D3;
C = !D1 & !D2 & D3
# !D0 & D1 & D2 & !D3
# D0 & D1 & !D3
# !D1 & !D3;
D = !D0 & !D2 & !D3
# D0 & D1 & D2 & D3
# D0 & D1 & !D2
# D0 & !D1 & D2
# !D0 & D1 & D2
# !D1 & !D2 & D3
# !D0 & D1 & !D2 & D3
Rys. 30
# !D0 & !D1 & D2 & D3;
E = !D0 & !D2 & !D3
# !D0 & !D1 & !D2 & D3
# !D0 & D1 & D2 & !D3;
F = !D0 & !D1 & !D3
# !D1 & !D2 & D3
# D0 & !D1 & D2 & !D3
# !D0 & D1 & D2 & !D3;
G = D0 & D1 & D2 & D3
# D1 & !D2
# !D1 & D2
# !D0 & D1 & D2
# !D1 & !D2 & D3;
sywane oczekiwane wartości lub ich
przedziały, jak np.: serport_tx =
ADRES:[ d 6.. d 10]. Przypisanie
może mieć także postać równania
logicznego, jak np.: serport_rx =
ADRES: d 20 # ADRES: d 31.
Tak zapisane równania kompilator
sam rozwinie do postaci czystych
równań logicznych, znacznie ułatwia-
jąc projektantowi diagnostykę projek-
tu i jego ewentualną modyfikację.
Dekoder-sterownik wyświetlacza
7-segmentowego
W kolejnym przykładzie przedsta-
wimy trzy możliwe sposoby opisu
Rys. 31 dekodera 7-segmentowego współ-
Elektronika Praktyczna 8/2004
82
K U R S
List. 7. Projekt dekodera wyświetlacza 7-segmento- List. 8. Projekt dekodera wyświetlacza 7-segmentowego
wego opisanego równaniami logicznymi o postaci opisanego równaniami za pomocą tablicy prawdy
łatwej do weryfikacji przez projektanta
Name dek_wys;
Name dek_wys; Partno U1;
Partno U1; Revision 01;
Revision 01; Date 20/05/04;
Date 20/05/04; Designer PZb;
Designer PZb; Company EP;
Company EP; Location brak;
Location brak; Assembly brak;
Assembly brak; Device g22v10lcc;
Device g22v10lcc;
/* Stany na wejsciach D3...D0 ustala sie za */
/* Stany na wejsciach D3...D0 ustala sie za */ /* pomoca nastawnika SW1 */
/* pomoca nastawnika SW1 */ /************************/
/************************/ /* a */
/* a */ /* ----- */
/* ----- */ /* | | */
/* | | */ /* f| |b */
/* f| |b */ /* | g | */
/* | g | */ /* ----- */
/* ----- */ /* | | */
/* | | */ /* e| |c */
/* e| |c */ /* | | */
/* | | */ /* ----- */
/* ----- */ /* d */
/* d */ /* */
/* */ /************************/
/************************/
/***** Wejscia *****/
/***** Wejscia *****/ PIN [7,9..11] = [D3..0];
PIN [7,9..11] = [D3..0];
/***** Wyjscia *****/
/***** Wyjscia *****/ PIN [24,21,23,20,19,25,18] = [G,F,E,D,C,B,A];
PIN [24,21,23,20,19,25,18] = [G,F,E,D,C,B,A];
/***** Deklaracje pomocnicze *****/
/***** Deklaracje pomocnicze *****/ Field Dana = [D3..0];
Field dana = [D3..0]; Field Segment = [A,B,C,D,E,F,G];
Field segment = [A,B,C,D,E,F,G];
/***** Opis HDL *****/
$define ON b 1 /* Segment swieci */ Table Dana => Segment {
$define OFF b 0 /* Segment nie swieci */
/* Wejscia Wyjscia segmentowe */
/***** Opis HDL *****/ /* --------------------------------------- */
/* a b c d e f g */ /* AAAA */
segment = /* 3210 ABCDEFG */
/* 0 */ [ ON, ON, ON, ON, ON, ON, OFF] & dana:0 b 0000 => b 1111110; /* 0 */
/* 1 */ # [OFF, ON, ON, OFF, OFF, OFF, OFF] & dana:1 b 0001 => b 0110000; /* 1 */
/* 2 */ # [ ON, ON, OFF, ON, ON, OFF, ON] & dana:2 b 0010 => b 1101101; /* 2 */
/* 3 */ # [ ON, ON, ON, ON, OFF, OFF, ON] & dana:3 b 0011 => b 1111001; /* 3 */
/* 4 */ # [OFF, ON, ON, OFF, OFF, ON, ON] & dana:4 b 0100 => b 0110011; /* 4 */
/* 5 */ # [ ON, OFF, ON, ON, OFF, ON, ON] & dana:5 b 0101 => b 1011011; /* 5 */
/* 6 */ # [ ON, OFF, ON, ON, ON, ON, ON] & dana:6 b 0110 => b 1011111; /* 6 */
/* 7 */ # [ ON, ON, ON, OFF, OFF, OFF, OFF] & dana:7 b 0111 => b 1110000; /* 7 */
/* 8 */ # [ ON, ON, ON, ON, ON, ON, ON] & dana:8 b 1000 => b 1111111; /* 8 */
/* 9 */ # [ ON, ON, ON, ON, OFF, ON, ON] & dana:9 b 1001 => b 1111011; /* 9 */
/* A */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:A b 1010 => b 1001001; /* blad */
/* B */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:B b 1011 => b 1001001; /* blad */
/* C */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:C b 1100 => b 1001001; /* blad */
/* D */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:D b 1101 => b 1001001; /* blad */
/* E */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:E b 1110 => b 1001001; /* blad */
/* F */ # [ ON, OFF, OFF, ON, OFF, OFF, ON] & dana:F; b 1111 => b 1001001; /* blad */
} }
pracującego z wyświetlaczem LED Kolejnym możliwym sposobem
Niuanse negacji o wspólnej katodzie. Na rys. 29 po- opisania dekodera jest zawarcie
kazano sposób wyświetlania znaków zależności pomiędzy stanami na
Twórcy CUPL-a przyjęli,
z zakresu 0...9 oraz znaków o ko- jego wejściach i wyjściach w tabli-
że podczas przygotowywa-
dach powyżej 9 (palą się wyłącznie cy prawdy (list. 8). Poszczególnym
nia opisu sprzętu
poziome segmenty wyświetlacza). wartościom wektora wejściowego
projektant rozważa wyłącz-
Czytelnicy o największym zacię- Dana przypisywane są odpowiednie
nie wartości TRUE/FALSE,
ciu do posługiwania się mapami wartości wyjściowe (wektor Seg-
natomiast o polaryzacji
Karnaugh mogą spróbować zweryfi- ment), a całość jest ulokowana
(aktywne 0 /aktywne 1 )
kować poprawność równań logicz- w tablicy zaczynającej się od słowa
sygnału decyduje podczas
nych, za pomocą których opisano kluczowego Table. Obydwa wektory
deklarowania wyprowadzeń.
dekoder w przypadku pokazanym zdefiniowano w polu deklaracji po-
na list. 6. Te same równania moż- mocniczych za pomocą słów kluczo-
na zapisać w wygodniejszej postaci wych Field.
(list. 7), a ich przekształceniem do
postaci pokazanej na list. 6 zajmie
się kompilator. Jak można zauwa-
żyć, za pomocą deklaracji defi-
ne stałych ON i OFF przypisano
wartości bitów (odpowiednio) 1
i 0 , co pozwala posługiwać się
w dalszej części opisu czytelny-
mi nazwami. Taki sposób opisania
działania dekodera ułatwia diagno-
stykę projektu oraz wprowadzania
do niego zmian. Rys. 32
na 8/2004 Elektronika Praktyczna 8/2004
83
K U R S
Multiplekser
List. 9. Jeden z możliwych sposo- List. 10. Projekt multipleksera 4-
Podobnym do dekodera-sterow-
bów dodania do funkcji sterują- wejściowego
nika wyświetlacza 7-segmentowe-
Name mux;
cej segmentem A wyświetlacza
Partno brak; go przykładem projektu układu
inwertera sterowanego sygnałem
Revision brak;
kombinacyjnego jest multiplekser.
BACKPLANE Date 20/05/04;
Designer PZb; W artykule pokażemy implementację
A = (!D0 & !D2 & !D3
Company EP;
pojedynczego multipleksera 4-wej-
# D0 & D1 & D2 & D3
Location brak;
# D0 & D1 & !D3
Assembly brak; ściowego.
# D0 & !D1 & D2
Device g22v10lcc;
Najbardziej oczywistym sposobem
# !D0 & D1 & D2
# !D0 & !D1 & D2 & D3
opisu jest równanie przypisujące
/* Nastawnik SW1 sluzy do zmiany stanow */
# !D2 & D3)
/* na wejsciach X3...X0 */
wyjściu multipleksera stan wystę-
$ BACKPLANE;
/* Jumpery Sw1 i Sw2 spelniaja role */
pujący na zaadresowanym wejściu.
/* elementow adresujacych */
/* aktywne wejscie multipleksera 4x1 */
Takie równanie może mieć postać
W przypadku, gdy zaprojektowa- jak poniżej:
/***** Wejscia *****/
PIN [7,9..11] = [X0,X1,X2,X3];
ny sterownik będzie współpracował Y = !SEL0 & !SEL1 & X0
PIN [4,6] = [SEL1..0];
z wyświetlaczem LED o wspólnej
# SEL0 & !SEL1 & X1
anodzie wystarczy zmienić aktyw- /***** Wyjscia *****/
# !SEL0 & SEL1 & X2
PIN [25] = Y;
ny stan (z wysokiego na niski) na
# SEL0 & SEL1 & X3
wyjściach dekodera. Najprostszym /***** Deklaracje pomocnicze *****/ Podobnie, jak miało to miejsce
Field SELEKTOR = [SEL1..0];
sposobem jest zastąpienie linii we wcześniejszych przykładach, taki
PIN [24,21,23,20,19,25,18] /***** Opis HDL *****/ sposób opisu, jakkolwiek skuteczny,
Y = (X0 & SELEKTOR:0)
= [G,F,E,D,C,B,A]; linią PIN nie jest wygodny. Zdecydowanie
# (X1 & SELEKTOR:1)
[ 2 4 , 2 1 , 2 3 , 2 0 , 1 9 , 2 5 , 1 8 ] = # (X2 & SELEKTOR:2) lepiej sprawdza się w praktyce (ze
# (X3 & SELEKTOR:3);
![G,F,E,D,C,B,A]; (w której linie względu na wygodę, formalnie oby-
wyjściowe portów zostały zanegowane). dwa zapisy są praktycznie równo-
Prezentowany dekoder można BACKPLANE, np. w taki sposób jak ważne) opis pokazany na list. 10.
łatwo dostosować do sterowania to pokazano na list. 9 (pokazano Jak widać, liczba oferowanych
7-segmentowego wyświetlacza LCD. przykład tylko dla jednego wyjścia). przez CUPL-a sposobów opisu
W tym celu wszystkie wyjścia Schemat blokowy ilustrujący układów kombinacyjnych nie jest
zasilające segmenty wyświetlacza sposób tworzenia sygnałów sterują- duża, ale w zupełności wystarczy
powinny zostać wyposażone w ste- cych segmentami wyświetlacza LCD do realizacji każdego zadania in-
rowane inwertery (wykonane np. na pokazano na rys. 31. Na rys. 32 żynierskiego, dając przy tym moż-
bramkach ExOR), które dostarczą przedstawiono sposób dołączenia wy- liwości wybrania przez projektanta
do segmentów świecących sygnał świetlacza do dekodera zaimplemen- sposobu najbardziej mu odpowia-
w przeciwfazie w stosunku do sy- towanego w układzie PLD. dającego.
gnału zasilającego podłoże (backpla- Przedstawiony mechanizm tworze- Za miesiąc przedstawimy kilka
ne) wyświetlacza, jak to pokazano nia tablic prawdy w CUPL-u pozwala przykładów układów synchronicz-
na rys. 30. Sterowane inwertery na łatwą i wygodną implementacje nych, w kolejnych zajmiemy się pre-
najprościej można uzyskać w CUPL- w układach PLD najróżniejszych tablic zentacją narzędzi.
u XOR-ując funkcje tworzące sygna- przekodowań (transkoderów), często Piotr Zbysiński, EP
ły sterujące segmentami z sygnałem określanych mianem look-up table. piotr.zbysinski@ep.com.pl
Elektronika Praktyczna 8/2004
84
Wyszukiwarka
Podobne podstrony:
Układy programowalne cz 3Układy programowalne cz 7Układy programowalne cz 5Układy programowalne cz 4Ukł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