Mikrokontrolery i Mikrosystemy cz2


Mikrokontrolery i Mikrosystemy
82
3. Układy scalone pamięciowe
W skład mse często mogą wchodzić układy pamięciowe. Szczególnie, gdy użyty mk nie
posiada wewnętrznej pamięci danych i programu. Generalnie pamięci można podzielić na
dwie grupy:
" pamięci ulotne, trzymają dane tylko wtedy, gdy są zasilane. Zanik napięcia zasilania
powoduje utratę przechowywanych informacji,
" pamięci nieulotne, zachowane dane nie ulegają skasowaniu po wyłączeniu napięcia
zasilania.
Pierwsza grypa to pamięci RAM (Random Access Memory). Są one pamięciami, w których
dane mogą być zarówno zapisywane, jak z niej odczytywane. Istnieją dwa główne typy tych
pamięci:
" pamięć statyczna SRAM,
" pamięć dynamiczna DRAM.
Pamięć SRAM przechowuje bity informacji w postaci stanów przerzutników bistabilnych.
Każda komórka pamięci składa się z około od 4 do 6 tranzystorów. Układy SRAM mogą
mieć względnie niski pobór mocy w trybie podtrzymywania zawartości pamięci, natomiast w
trybie pracy pobierają dość duży prąd. Zaletą tych pamięci jest prostota sterowania oraz
szybkość (pamięci te wykonane z arsenku galu GaAs mają czas dostępu poniżej 1ns). Dzięki
prostemu sterowaniu są one najczęściej stosowane w mse.
W pamięci DRAM informacja przechowywana jest w postaci ładunków zgromadzonych w
kondensatorach, jakie powstają pomiędzy emiterami tranzystorów MOS i podłożem układu.
Dane w tych pamięciach mają tendencje do zanikania i wymagają ciągłego odnawiania.
Proces taki nazywa się  odświeżaniem i wymaga specjalnych układów do wytwarzania
sygnałów odświeżających. Zaletą układów DRAM jest niski koszt produkcji, ze względu na
niewielką powierzchnię zajmowanej powierzchni krzemu. Każda komórka pamięci DRAM
ma tylko jeden tranzystor MOS. Z zalety tej wynika również inna cecha: pamięci DRAM
posiadają znacznie większą pojemność od pamięci SRAM (obecnie dostępne są na rynku
pamięci SRAM do 512kB). Wadą tych układów jest skomplikowane sterowanie, wynikające z
multipleksowania adresów rzędów i kolumn (pamięci te adresuje się jak macierz) oraz
wynikającego z tego dłuższego czasu dostępu, który jest dodatkowo zwiększany o czas
potrzebny na odświeżanie.
Istnieje cały szereg pamięci nieulotnych (część z nich zestawiono w tabeli 2.1). Poniżej
przedstawiono najczęściej spotykane typy tych pamięci:
" Pamięć ROM (Read Only Memory) służy tylko do odczytywania. Informacja w pamięci
ROM jest zapisywana w czasie produkcji w formie maski, na podstawie dostarczonego
wzorca. Dla zamawiającego taką pamięć oznacza to wysoki koszt jednostkowy. Dlatego
pamięci ROM używa się jedynie w urządzeniach, które są produkowane w długich seriach.
" Pamięć EPROM jest pamięcią programowaną elektrycznie. Użytkownik sam programuje
swój wzór informacji, jaką chce zapisać. Gdy układ posiada okienko ze szkła
kwarcowego, można taką pamięć kasować i programować ponownie. Jest to duża zaleta w
fazie uruchamiania mse. Kasowanie odbywa się na ogół przy pomocy światła
ultrafioletowego. Pamięć EPROM umieszczona w obudowie plastikowej, znacznie tańszej
od obudowy ceramicznej z okienkiem szklanym, nosi nazwę OTP (One Time
Programmable). Komórki pamięci EPROM są tranzystorami MOS z pływającymi
bramkami. Są one programowane przez wstrzykiwanie elektronów o wysokiej energii.
Komórka taka zawiera  0 , podczas gdy nie zaprogramowane komórki zawierają  1 .
Mikrokontrolery i Mikrosystemy
83
Zaprogramowanego w ten sposób tranzystora nie można wprowadzić w stan
przewodzenia i usunąć zgromadzonego w nim ładunku. Można tego dokonać jedynie
przez kasowanie światłem UV. Promienie UV dostarczają elektronom energii,
wystarczającej do ponownego przejścia przez barierę energetyczną w warstwie izolacyjnej
dwutlenku krzemu wokół pływającej bramki. Układy EPROM mogą być kasowane i
ponownie programowane około 100 razy.
" Pamięci EEPROM są układami, które nie tylko są elektrycznie programowalne, ale
również elektrycznie kasowane. Mają ograniczoną liczbę cyklów programowania od
około 10000 razy do 1000000 razy. Komórka pamięci EEPROM składa się z tranzystora
NMOS (Metal Nitride Oxide Semiconductor). Do każdej komórki można wprowadzić
ładunek elektryczny, który przechowywany jest w izolowanej warstwie azotku krzemu,
znajdującej się między bramką tranzystora, a podłożem z tlenku krzemu. Aadowanie
inicjuje się poprzez tzw. efekt tunelowy. Powstaje on po przyłożeniu wysokiego napięcia
(20-40V) do bramki tranzystora. Przez zmianę polaryzacji tego napięcia, układ można
programować, bądz też kasować.
" Pamięć błyskowa (FLASH) jest również pamięcią programowaną i kasowaną
elektrycznie. Koszt jej produkcji jest niższy niż układu EEPROM. W porównaniu z
pamięcią EEPROM cechuje się ona szybszymi czasami programowania i kasowania.
Najczęściej pamięć ta składa się z sektorów, na których mogą być wykonywane
odpowiednie operacje, posiada własną listę komend automatyzujących programowanie i
kasowanie pamięci.
Poniżej zostaną omówione trzy przykładowe układy pamięciowe, które można spotkać w
mse: najprostszy z możliwych układów  8-bitowy rejestr zatrzaskujący 74HC574, pamięć
SRAM 128kB i pamięć FLASH 128kB.
3.1. 8-bitowy rejestr zatrzaskujący 74HC574
Często istnieje potrzeba zastosowania w mse takich prostych układów jak 8-bitowy rejestr
zatrzaskujący. Np. układy te stosuje się w celu  zwiększenia liczby linii wyjściowych mk,
jako układy pamiętające młodszą część adresu przy adresowaniu zewnętrznej pamięci RAM i
ROM przez mk 8051, itp.
Jednym z takich układów jest 8-bitowy rejestr zatrzaskujący 74HC/HCT574. Posiada on
następujące właściwości:
" trzystanowe nieodwracające wyjścia, co pozwala na stosowanie układu w systemach
magistralowych,
" zawiera w sobie 8-bitowy rejestr składający się z przerzutników typu D wyzwalanych
zboczem narastającym,
" każdemu przerzutnikowi przyporządkowana jest linia wejściowa i wyjściowa,
" dla wszystkich przerzutników jest wspólny sygnał zegara CP (clock) i sygnał sterowania
ich buforami wyjściowymi OE.
Gdy na linii CP pojawi się zbocze narastające, to stan sygnałów na liniach wejściowych
układu (D0  D7) zostaje zapamiętany w rejestrze. Kiedy sygnał OE jest w stanie wysokim
wyjścia układu (Q0  Q7) są w stanie wysokiej impedancji. Stan niski na linii OE spowoduje
wystawienie zawartości rejestru na linie wyjściowe. Linia OE nie wpływa na zawartość
rejestrów układu.
Na rys. 3.1 pokazano wyprowadzenia końcówek układu oraz jego schemat funkcjonalny.
Mikrokontrolery i Mikrosystemy
84
Rys. 3.1. Schemat wyprowadzeń oraz schemat funkcjonalny układu 74HC574
Jak widać z rys. 3.1 układ składa się z rejestru zatrzaskującego złożonego z ośmiu
przerzutnikó typu D oznaczonych od FF1 do FF8 (flip-flop) i bloku ośmiu buforów
trójstanowych. Rejestry są sterowane wyłącznie sygnałem CP, a bufory sygnałem OE.
Poniżej przedstawiono tabelę 3.1 opisującą sposób sterowania tym układem.
Tabela 3.1. Sterowanie układem 74HC574
Na rys. 3.2 pokazano diagram logiczny układu.
Rys. 3.2. Diagram logiczny układu 74HC574
Mikrokontrolery i Mikrosystemy
85
3.2. Pamięć SRAM 128kB
Pamięć SRAM zostanie przedstawiona na przykładzie układu K6T1008C2E firmy
Samsung Electronics. Jest to pamięć SRAM o pojemności 128Kx8 bitów wykonana w
technologii CMOS o małym poborze mocy.
Na rys. 3.3 pokazano wyprowadzenia układu. Są one zgodne ze standardem dla pamięci o
tej pojemności. Również identyczne wyprowadzenia mają pamięci np. 512Kx8 bitów, przy
czym pin 1 jest linią A17, a pin 30 linią A18.
Rys. 3.3. Wyprowadzenia układu K6T1008C2E
Rys. 3.4. Schemat blokowy układu K6T1008C2E
Mikrokontrolery i Mikrosystemy
86
Na rys. 3.4 pokazano schemat blokowy układu pamięci SRAM. Składa się on z układu
kontrolnego, do którego podłączone są sygnały CS1, CS2, WE i OE za pośrednictwem których
steruje się pamięcią, układu we/wy służącego do wymiany danych pomiędzy matrycą pamięci
składającej się z 1024 rzędów i 128x8 kolumn, a liniami danych I/O1 do I/O8. Wybór
komórki (bajtu) do zapisu lub odczytu odbywa się za pomocą układów wyboru wierszy i
rzędów do których podłączone są linie adresowe A0  A16.
W tabeli 3.2 przedstawiono znaczenie poszczególnych sygnałów.
Tabela 3.2. Funkcje sygnałów dla układu K6T1008C2E
Sygnały CS1 i CS2 służą do uaktywnienia układu. Najczęściej steruje się pierwszym
sygnałem, drugi jest na stałe podłączony do  1 . Sygnał OE jest wykorzystywany w trakcie
czytania danej, a sygnał WE w trakcie pisania danej do pamięci za pośrednictwem
dwukierunkowych linii I/O1  I/O8 pod adres wskazany przez linie A0  A16.
Zastosowanie tych sygnałów pokazano w następnej tabeli (tabela 3.3).
Tabela 3.3. Zastosowanie sygnałów sterujących dla układu K6T1008C2E
Jak widać z tabeli 3.3, aby móc zapisać bajt do pamięci musi być ona aktywna (CS1  stan
niski (L), CS2  stan wysoki (H)) oraz na linii OE ma być stan niski (aktywny), a na linii WE
stan wysoki (nieaktywny). Podobnie jest dla zapisu. W tym przypadku sygnał WE jest niski
(warto aby OE było w stanie wysokim).
Na poniższych rysunkach pokazano przebiegi cyklu odczytu bajtu z pamięci SRAM (rys.
3.5) oraz zapisu do niej bajtu dwoma sposobami, przy czym zakłada się, że sygnał CS2 jest
nieaktywny (na zacisku jest stan wysoki). Pierwszy sposób oparty jest na sterowaniu zapisem
danej sygnałem WE (rys. 3.6), natomiast drugi bazuje na sterowaniu zapisem za pomocą
sygnału CS1 (rys. 3.7).
Mikrokontrolery i Mikrosystemy
87
Rys. 3.5. Przebiegi czasowe cyklu odczytu danych z pamięci (sygnał WE w stanie  Hi )
Rys. 3.6. Przebiegi czasowe cyklu zapisu danych do pamięci (sterowanie sygnałem WE)
Rys. 3.7. Przebiegi czasowe cyklu zapisu danych do pamięci (sterowanie sygnałem CS1)
Mikrokontrolery i Mikrosystemy
88
3.2. Pamięć FLASH 128kB
Szczególną zaletą pamięci błyskowych (FLASH) w stosunku do pamięci EEPROM jest
krótki czas kasowania i zapisu. Do programowania i kasowania pamięci błyskowych
potrzebne jest podwyższone napięcie 11,5 - 13,5V, które w zależności od typu układu może
być podawane z zewnątrz lub wytwarzane przez wbudowaną przetwornicę.
Pamięci FLASH przyjmują oprócz danych polecenia, które umożliwiają realizację różnych
rodzajów operacji.
Ten typ pamięci zostanie przedstawiony na przykładzie popularnej pamięci typu 29F010
firmy AMD (Advanced Micro Devices) o organizacji 128k x 8 bitów. Na rys. 3.8 pokazano
symbol logiczny pamięci wraz z opisem linii.
Rys. 3.8. Symbol logiczny pamięci Am29F010
Pamięć ta posiada następujące właściwości:
" pojedyncze zasilanie, 5V +-10% dla czytania, zapisu i operacji kasowania programu,
" maksymalny czas dostępu 45ns,
" niskie zużycie energii, maksymalnie 30mA na odczyt i 50mA na programowanie oraz
czyszczenie, mniej niż 25A podczas trybu standby,
" elastyczna architektura oparta na sektorach, 8 zunifikowanych sektorów, wszystkie
kombinacje sektorów mogą być czyszczone,
" możliwość wymazania całego chipu,
" ochrona sektorów przed zapisem,
" wsparcie sprzętowe dla zablokowania i odblokowania programowania i czyszczenia dla
wszystkich kombinacji sektorów,
" wbudowany algorytm czyszczenia automatycznie przeprogramuje i czyści chip lub
wszystkie kombinacje wybranych sektorów,
" wbudowany algorytm programowania automatycznie programujący i sprawdzający dane z
zadanego adresu,
" minimum 100000 gwarantowanych cykli programowania i czyszczenia,
" programowe metody detekcji końca cyklu programowania i czyszczenia.
Pamięć Am29F010 jest 1Mbit, 5V pamięcią FLASH zorganizowaną jako 131072 bajtów.
Produkowana jest w 32-pinowych obudowach typu PLCC ,TSOP i PDIP. Zaprojektowano ją
z możliwością programowania w systemie ze standardowym 5V zasilaniem. Ponadto może
być programowana za pomocą standardowego programatora do pamięci EPROM.
Pamięć posiada wbudowany algorytm programowania (wewnętrzny algorytm, który
automatycznie weryfikuje szerokość i czas trwania impulsów programowania). Zawiera ona
Mikrokontrolery i Mikrosystemy
89
także wbudowany algorytm czyszczenia. Podczas czyszczenia urządzenie automatycznie
kontroluje czas i szerokość sygnałów oraz weryfikuje właściwe komórki docelowe.
System nadrzędny może wykrywać zakończenia operacji czyszczenia/programowania
poprzez czytanie bitów statusu : DQ7 (DATA#Polling) i DQ6 (toggle). Po zakończeniu cyklu
programowania/czyszczenia pamięć jest gotowa do czytania z niej danych lub oczekuje na
następną komendę.
Sektorowa architektura pamięci pozwala na czyszczenie, czy ponowne programowanie
wybranych sektorów pamięci bez wpływu na pozostałe sektory. Sprzętowa ochrona danych
wykrywa niski poziom napięcia zasilania i wstrzymuje proces zapisywania podczas zmiany
napięcia. Pamięć można przełączyć w tryb standby, w celu znacznej redukcji pobieranej
mocy.
Rys. 3.9. Schemat blokowy pamięci Am29F010
Na rys. 3.9 przedstawiono schemat blokowy pamięci Am29F010. Jak widać, składa się ona
z wielu bloków, z których część służy do obsługi procesu zapisu do pamięci (blok Cell
Matrix), są nimi generatory napięć PGM Voltage Generator i Erase Voltage Generator. Pracą
całego układu zarządza blok State Control / Command Register. Komórki pamięci są
wybierane za pomocą układu dekodera adresu. Sterowanie przepływem danych odbywa się za
pośrednictwem dwukierunkowego bufora i rejestru zatrzaskującego oraz bloku Chip Enable /
Output Enable Logic.
Rejestr komend (Command Register) składa się z zatrzasków, które przechowują komendy
z adresami i danymi potrzebnymi do wykonania komendy. Zawartość rejestru służy jako
wejścia dla  wewnętrznej maszyny stanu . Wyjścia maszyny stanu dyktują funkcje
urządzenia. Funkcje te (operacje na szynie danych) zestawiono w tabeli 3.4.
Mikrokontrolery i Mikrosystemy
90
Tabela 3.4. Operacje na szynie danych pamięci Am29F010
Aby odczytać dane z pamięci system musi zapewnić niski stan linii CE# i OE#. Linia CE#
kontroluje odczyt. Linia OE# steruje buforem wyjściowym. Sygnał na linii WE# powinien
być na poziomie VIH. Żadna komenda nie jest wymagana w tym trybie. Jest on trybem
domyślnym po włączeniu napięcia zasilania. Zatem mk może podawać na linie adresowe A0
 A16 adresy danych, które chce otrzymać na liniach danych DQ0  DQ7. Urządzenie
pozostaje dostępne do odczytu dopóki nie zmieni się zawartość rejestru komend.
Aby zapisać komendę lub sekwencję komend (które zawierają dane programujące czy
czyszczące wybrane sektory pamięci), system musi zapewnić następujące stany: na liniach
WE# i CE# stan niski VIL oraz na linii OE# stan wysoki VIH .
Operacja czyszczenia może skasować jeden sektor, wiele sektorów lub całe urządzenie.
Tablica adresów sektorów wskazuje na adres w przestrzeni jaką każdy sektor zajmuje.  Adres
sektora to bity adresu potrzebne aby jednoznacznie zidentyfikować sektor (patrz tabela 3.5).
Tabela 3.5. Tablica adresów sektorów pamięci Am29F010
Podczas operacji czyszczenia lub programowania system może sprawdzić status operacji
przez czytanie bitów statusu DQ7-DQ0.
Pamięć posiada tryb autoselect, który umożliwia identyfikację urządzenia oraz producenta,
a także weryfikację chronionych sektorów przez kody identyfikacyjne podane na DQ7-DQ0.
Ten tryb jest niezbędny dla urządzeń programujących, aby mogły wykorzystać odpowiedni
algorytm programujący. Ten tryb może być także wykorzystany w systemie przez rejestr
komend. Pamięć można wprowadzić w tryb autoselect wydając odpowiednią komendę (tabela
3.6).
Zapis adresu i danej rozkazu lub całej sekwencji rozkazowej do rejestru rozkazów inicjuje
wykonanie operacji. Poprawne sekwencje rozkazowe przedstawia tabela rozkazów (tabela
3.6). Zapis niepoprawnych wartości adresu i danych lub zapis sekwencji w nieodpowiedniej
kolejności przestawia pamięć w tryb odczytu danych.
Mikrokontrolery i Mikrosystemy
91
Adres jest "zatrzaskiwany" w momencie pojawienia się opadającego zbocza na linii WE#
lub CE#, w zależności od tego, które z tych zdarzeń wystąpi jako ostatnie.
Tabela 3.6. Formaty poleceń sterowania pamięcią Am29F010
Po włączeniu zasilania domyślnie ustawiany jest tryb odczytu danych. Tryb ten jest
ustawiany domyślnie także po wykonaniu wbudowanego algorytmu programowania
(Embedded Program Algorithm) lub wbudowanego algorytmu kasowania (Embedded Erase
Algorithm). Odczyt jest możliwy bez użycia jakichkolwiek rozkazów.
Rozkaz AUTOSELECT umożliwia uzyskanie dostępu do kodów producenta i pamięci, a
także pozwala na ustalenie, czy dany sektor jest chroniony. Na sekwencję rozkazową składa
się rozkaz AUTOSELECT poprzedzony zapisem 2 cykli odblokowujących. Następnie pamięć
wchodzi w tryb autoselect i możliwy jest odczyt spod każdego adresu dowolną ilość razy bez
inicjowania kolejnej sekwencji rozkazowej. Cykl odczytu spod adresu XX00h zwraca kod
producenta, a spod adresu XX01h kod urządzenia. Cykl odczytu zawierający adres sektora
(SA) i adres 02h zwraca 01h jeśli ten sektor jest chroniony, a 00h w przeciwnym wypadku. W
celu wyjścia z trybu autoselect do pamięci trzeba przesłać rozkaz RESET.
Programowanie pamięci składa się z 4 cykli szyny (rozkaz PROGARM). Na sekwencję
rozkazową składa się rozkaz ustawiający tryb programowania poprzedzony zapisem 2 cykli
odblokowujących. Dane i adres są wysyłane w następnej kolejności. Operacja ta inicjuje
wykonanie wbudowanego algorytmu programowania. System programujący nie musi
dostarczać dodatkowych sygnałów sterujących czy taktujących. Urządzenie samo generuje
wewnętrzne impulsy programujące i weryfikuje poprawność zaprogramowania komórki.
Kiedy wbudowany algorytm programowania zakończy działanie urządzenie wraca do trybu
odczytu danych i zwalniany jest przerzutnik "zatrzaskujący" adresy. System nadrzędny może
ustalić status operacji programowania na podstawie stanu linii DQ6 i DQ7. Wszystkie
rozkazy wysyłane do urządzenia podczas wykonywania wbudowanego algorytmu
Mikrokontrolery i Mikrosystemy
92
programowania są ignorowane. Programowanie może odbywać się w dowolnej kolejności i
może przekraczać granice sektorów.
Sekwencja kasowania pamięci składa się 6 cykli szyny. W jej skład wchodzi rozkaz
ustawienia (set-up) poprzedzony zapisem 2 cykli odblokowujących. Po nich następują kolejne
2 cykle odblokowujące zapis i rozkaz kasowania, który uruchamia wbudowany algorytm
kasowania. Wszystkie rozkazy wysyłane do urządzenia podczas wykonywania wbudowany
algorytm kasowania są ignorowane. Kiedy ten algorytm zakończy działanie urządzenie wraca
do trybu odczytu danych i zwalniany jest przerzutnik "zatrzaskujący" adresy.
Na rozkaz kasowanie sektora również składa się 6 cykli szyny. Pierwszym jest rozkaz
ustawienia (set-up) poprzedzony zapisem 2 cykli odblokowujących. W następnej kolejności
wysyłane są 2 dodatkowe cykle odblokowujące. Potem zapisywane są: adres sektora do
kasowania oraz rozkaz kasowania. Po zapisie sekwencji rozkazowej rozpoczyna się 50s
przerwy. W trakcie tej przerwy mogą zostać przesłane dodatkowe adresy i rozkazy kasowania
sektorów. Załadowanie bufora kasowania sektorów może się odbyć w dowolnej kolejności.
Dowolna może być także liczba sektorów przeznaczonych do skasowania. Odstęp czasu
między tymi dodatkowymi cyklami, w których przesyłane są informacje o dodatkowych
sektorach do skasowania musi być mniejszy niż 50s. Jakikolwiek rozkaz wysłany podczas
50s przerwy przestawia urządzenie w tryb odczytu. System musi ponownie wysłać
sekwencje rozkazową oraz adresy dodatkowych sektorów i rozkazy. System może
nadzorować stan linii DQ3 w celu sprawdzenia, czy minął czas przerwy. Przerwa zaczyna się
od narastającego zbocza ostatniego impulsu w sekwencji rozkazowej na linii WE#. Wszystkie
rozkazy wysyłane do urządzenia podczas kasowania sektora są ignorowane. Kiedy
wbudowany algorytm kasowania zakończy działanie urządzenie wraca do trybu odczytu
danych i zwalniany jest przerzutnik "zatrzaskujący" adresy. System nadrzędny może ustalić
status operacji programowania przy wykorzystaniu linii DQ6 i DQ7.
Stan operacji zapisu można sprawdzić wykorzystując linie: DQ3, DQ5, DQ6 i DQ7. Za
pomocą pinów DQ7 i DQ6 można sprawdzić, czy operacja programowania lub kasowania
została zakończona (tabela 3.7).
Tabela 3.7. Status operacji zapisu
Na poniższych rysunkach pokazano przebiegi czasowe operacji odczytu (rys. 3.10),
operacji zapisu danej do pamięci (rys. 3.11) oraz operacji kasowania pamięci (rys. 3.12).
Mikrokontrolery i Mikrosystemy
93
Rys. 3.10. Przebieg czasowy operacji odczytu z pamięci Am29F010
Rys. 3.11. Przebieg czasowy operacji programowania pamięci Am29F010
Rys. 3.12. Przebieg czasowy operacji kasowania pamięci Am29F010
Mikrokontrolery i Mikrosystemy
94
4. Programowalne układy logiczne
Termin logiczne układy programowalne PLD (Programmable Logic Devices) odnosi się
do każdego cyfrowego układu scalonego, którego właściwości funkcjonalne mogą być
zdefiniowane (ustalane) przez końcowego użytkownika, który może zaimplementować w
jego strukturze opracowany przez siebie projekt jakiegoś wyspecjalizowanego układu
cyfrowego. Najważniejszą cechą tych układów jest więc ich konfigurowalność przez
użytkownika w jego własnym laboratorium.
Współczesne układy programowalne klasyfikuje się najczęściej w trzech grupach, przy
czym kryterium klasyfikacji są głównie cechy ich architektury. Najczęściej przyjmuje się, że
układy PLD dzieli się na:
" SPLD (Simple Programmable Logic Device)  proste układy programowalne,
" CPLD (Complex Programmable Logic Devices)  złożone układy programowalne,
" FPGA (Field Programmable Gate Array)  programowalne matryce bramkowe.
Do układów SPLD zalicza się układy programowalne o architekturach PLA
(Programmable Logic Array), PAL (Programmable Array Logic) i GAL (Generic Array
Logic). Są to układy o najskromniejszych możliwościach logicznych, a więc i najtańsze ze
wszystkich układów programowalnych. Niemniej jednak ich zasoby logiczne są spore,
zawierają bowiem typowo od 4 do 22 makrokomórek logicznych o dwupoziomowej
strukturze logicznej i mogą zwykle zastąpić kilka standardowych układów scalonych rodziny
74xx. Każda z komórek jest zwykle w pełni połączona z innymi komórkami w danym
układzie scalonym. Do określenia funkcji realizowanych przez makrokomórki (ich
skonfigurowania) stosowane są łączniki (klucze), którymi są w większości przypadków
przepalane fragmenty ścieżek (łączniki rozwarciowe  dla układów PLA i PAL) lub
tranzystory MOS (dla układów GAL).
Układy CPLD są koncepcyjnie podobne do układów SPLD, lecz są bardziej złożone: mają
większe zasoby logiczne i możliwości funkcjonalne. Ich architektura ma strukturę
hierarchiczną opartą na makrokomórkach logicznych, których zawierają od kilkudziesięciu
do kilkuset. Typowo od czterech do szesnastu makrokomórek jest połączonych w większy
blok funkcjonalny. Jedną z ważniejszych cech architektury układów CPLD jest liczba
termów przypadających na pojedynczą makrokomórkę oraz możliwość pożyczki termów z
sąsiednich makrokomórek. Jeśli układ zawiera wiele bloków funkcjonalnych, są one łączone
między sobą za pomocą matrycy połączeniowej kluczy, której zdolność łączeniowa jest
ważną cechą układów CPLD. Ta liczba połączeń wewnątrz matrycy określa bowiem, jak
łatwo jest  wpasować jakiś projekt w dany układ programowalny.
Architektura układów FPGA różni się od architektury układów CPLD. Na ogół układy
FPGA zawierają rozmieszczone matrycowo boki logiczne CLB (rys. 4.1). Poszczególne
bloki są łączone ze sobą za pośrednictwem linii traktów połączeniowych (Routing Channels)
oraz programowalnych matryc kluczy połączeniowych umieszczonych w miejscu
krzyżowania się traktów poziomych i pionowych. Na obrzeżach matrycy bloków logicznych
znajdują się programowalne bloki IOB (wejściowo-wyjściowe). Struktury FPGA zawierają od
64 do dziesiątków tysięcy bloków logicznych o bardzo zróżnicowanej budowie. Bloki
logiczne mogą być bardzo złożone, jest ich wówczas mniej w układzie, lub względnie proste i
jest ich wówczas więcej. Zazwyczaj złożone bloki logiczne zawierają dwie lub więcej
pamięci RAM umożliwiających tworzenie tablic wartości funkcji LUT (Look-up Table) i dwa
lub więcej przerzutników. W większości układów są to tablice czterowejściowe (pamięć
RAM o pojemności 16 bitów). W układach o prostszej budowie, bloki logiczne zawierają
Mikrokontrolery i Mikrosystemy
95
zwykle dwuwejściowe układy generacji funkcji kombinacyjnych lub multipleksery
czterowejściowe i ewentualnie przerzutniki.
Rys. 4.1. Schemat blokowy układu FPGA
Do grupy największych producentów układów programowalnych i narzędzi
komputerowych do ich syntezy należą następujące firmy: Altera (www.altera.com), Lattice
(www.latticesemi.com), Xilinx (www.xilinx.com), Cypress (www.cypress.com), Atmel
(www.atmel.com) i QuickLogic (www.quicklogic.com).
W dalszej części wykładu zostaną omówione dwie pierwsze grupy układów PLD: SPLD
na przykładzie układu GAL16V8 firmy Lattice i CPLD na przykładzie rodziny układów
XC9500 firmy Xilinx.
4.1. Układy logiczne SPLD na przykładzie układu GAL16V8
Obecnie najpopularniejszą grupą układów SPLD są układy GAL, w których wykorzystano
architekturę PAL wzbogaconą o konfigurowalne makrokomórki wyjściowe zawierające
przerzutniki typu D. Przerzutniki te spełniają rolę wyjściowych elementów pamięciowych
umożliwiających budowanie układów synchronicznych.
Układy programowalne GAL zostaną przedstawione na przykładzie układu GAL16V8
firmy Lattice. Jest on wykonany w technologii CMOS i zawiera elektrycznie
reprogramowalne komórki pamięci typu E2CMOS. Układ ten charakteryzuje się
następującymi cechami:
" Wysoko wydajna technologia E2CMOS (3,5ns maksymalny czas propagacji, Fmax=
250MHz, 3ns od wejścia zegara do wyjścia danych).
" Rezystory podwieszone na każdej końcówce (active pull-up).
" Technologia E2CELL (rekonfigurowalna logika, reprogramowalne komórki, bardzo
szybkie elektrycznie kasowanie (poniżej 100ms), czas podtrzymywania danych 20 lat).
Mikrokontrolery i Mikrosystemy
96
" Osiem wyjściowych makrokomórek (programowalna polaryzacja wyjść, emulacja 20-
pinowych układów PAL).
" Wstępny zapis (preload) i reset po włączeniu zasilania (power-on reset) wszystkich
rejestrów .
" Identyfikacyjny  elektroniczny podpis zawarty w układzie.
Układ składa się z następujących bloków (rys. 4.2):
" z 9 buforów wejściowych,
" matrycy połączeń logicznych PROGRAMMABLE AND-ARRAY,
" z 8 programowalnych logicznych wyjściowych makrokomórek OLMC (Output Logic
MacroCell),
" 8 trójstanowych buforów wyjściowych konfigurowanych przez użytkownika,
" układu ochrony danych przed odczytem.
Rys. 4.2. Schemat blokowy układu GAL16V8
Bufory wejściowe układu GAL16V8 są kompatybilne ze standartowymi poziomami TTL.
Bufory te charakteryzują się wysoka impedancją i reprezentują o wiele mniejsze obciążenie
dla sterującej logiki niż bipolarne układy TTL.
Mikrokontrolery i Mikrosystemy
97
Wejścia układu maja wbudowane aktywne rezystory podwieszające (Active Pull-Up), więc
niepołączone będą w stanie  wysokim (logiczna  1 ). Producent zaleca aby wszystkie
nieużywane wejścia układu i trzystanowe piny I/O były podłączone do zasilania układu lub
masy. Zwiększa to odporność na zakłócenia i redukuje prąd pobierany przez układ.
Matryca połączeń logicznych składa się z programowalnej macierzy typu AND array z
ustalonymi połączeniami do bramek typu OR. Pole logicznych połączeń jest zorganizowane
jako 16 komplementarnych linii wejściowych (z sygnałami i ich negacjami) krzyżujących się
z 64 liniami typu  product term . Na każdym skrzyżowaniu linii znajduje się komórka typu
E2PROM, która w zależności od zaprogramowania zwiera lub rozwiera linię poziomą od
pionowej. Aącznie w matrycy znajduje się 2048 komórek (rys. 4.3).
Rys. 4.3. Matryca połączeń logicznych w trybie rejestrowym układu GAL16V8
Każda komórka powinna zapewnić połączenie pomiędzy linią wejściową (sygnał normalny
lub zanegowany) i końcówką wytwarzającą funkcje sygnału. Lina pozioma jest w stanie
logicznym true jeżeli wszystkie linie  podłączane do niej są w wysokim stanie. 64 linii
product term jest zorganizowanych w osiem grup wyjściowych z ośmioma końcówkami
(liniami) każda. Grupa jest przyporządkowana do danego układu OLMC . Siedem z ośmiu
linii product terms w każdej grupie wyjściowej wchodzi do bramki OR układu OLMC, jedna
służy do sterowania buforem trójstanowym.
Mikrokontrolery i Mikrosystemy
98
Dwie linie wejściowe pin 1 (CLK) i pin 11 (OE) mają szczególne znaczenie. Pierwszy z
nich w trybie rejestrowym (rys. 3.15) pełni funkcje sygnału zegarowego podawanego na
wszystkie przerzutniki typu D układów OLMC. Sygnał OE w tym trybie steruje wyjściowymi
buforami trójstanowymi. W pozostałych trybach pracy (rys. 4.4) te zaciski są normalnymi
wejściami.
Rys. 4.4. Konfiguracja linii wejściowych CLK (pin 1) i OE (pin 2) w trybach prostym i
złożonym układu GAL16V8
Konfiguracja komórki OLMC jest ustawiana przez programatory i oprogramowanie
narzędziowe oraz jest całkowicie niewidoczna (przezroczysta) dla użytkownika. Komórkę
OLMC można ustawić w trzech trybach:
" prostym (simple),
" złożonym (complex),
" rejestrowym (registered).
O konfiguracji wszystkich makrokomórek OLMC decydują dwa globalne bity SYN i AC0.
Bit XOR każdej komórki ustawia polaryzację wyjścia w każdym z trzech trybów, natomiast
bit AC1 ustala kierunek (wejście lub wyjście). Dwa globalne i 16 indywidualnych bitów
definiuje wszystkie możliwe konfiguracje układu GAL16V8. Kompilatory ustawią te bity
automatycznie tak, iż użytkownik nie musi ich samodzielnie ustawiać. Niżej podana jest w
tabeli 4.1 lista deklaracji układu GAL dla poszczególnych kompilatorów, za pomocą których
można wybrać tryb pracy układu GAL (typ wyjścia komórki OLMC). W pierwszej kolumnie
tabeli zawarto listę dostępnych kompilatorów.
Tabela 4.1. Lista deklaracji trybów pracy układu GAL16V8
Większość kompilatorów ma możliwość automatycznego wyboru trybu pracy układu.
Wybór jest dokonywany na podstawie kodu programu napisanego przez użytkownika. Jeżeli
w kodzie zostanie użyty choćby jeden rejestr, to kompilator wybiera tryb rejestrowy. Gdy
wyjścia kombinacyjne są kontrolowane przez linie product term to kompilator używa trybu
Mikrokontrolery i Mikrosystemy
99
złożonego. Oprogramowanie wybierze tryb prosty jedynie wtedy, gdy wszystkie wyjścia są
zadeklarowane jako kombinacyjne bez kontroli sygnałem OE.
Używając kompilatorów do konfiguracji układu należy zwrócić uwagę na następujące
ograniczenia poszczególnych trybów:
" W trybie rejestrowym piny 1 i 11 są stale skonfigurowane odpowiednio jako zegar CLK i
wejście OE. Nie mogą być one dedykowanymi wejściami.
" W trybie złożonym piny 1 i 11 stają się dedykowanymi wejściami i używają ścieżek
sprzężenia zwrotnego (feedback paths) odpowiednio pinów 19 i 12. Z tego powodu piny
19 i 12 nie mają opcji sprzężenia w tym trybie, są wyłącznie wyjściami.
" W trybie prostym wszystkie ścieżki sprzężenia zwrotnego pinów wyjściowych są
poprowadzone przez przyległe piny. Z tego powodu dwa wewnętrzne piny (15 i 16) nie
mają opcji sprzężenia zwrotnego i są zawsze skonfigurowane jako dedykowane
kombinacyjne wyjścia.
W trybie rejestrowym makrokomórki OLMC (rys. 4.5) są skonfigurowane jako
dedykowane wyjścia rejestrowe lub jako funkcje wejściowo-wyjściowe (I/O functions).
Wszystkie makrokomórki dzielą wspólny zegar CLK i pin kontroli OE. Każda makrokomórka
może być skonfigurowana jako rejestrowa lub wejście albo wyjście kombinacyjne.
Dedykowana funkcja wejścia lub wyjścia może być zaimplementowana jako podzestaw
funkcji wejściowo-wyjściowej (I/O function).
Rys. 4.5. Konfiguracja makrokomórki OLMC dla trybu rejestrowego
W trybie złożonym makrokomórki są skonfigurowane tylko jako wyjścia lub jako funkcje
wejściowo-wyjściowe (I/O functions) (rys. 4.6). W tym trybie można uzyskać maksymalnie
sześć linii wejściowo-wyjściowych. Dwie zewnętrzne makrokomórki (piny 12 i 19) nie mają
możliwości pracy jako wejście (input). Projekty wymagające ośmiu I/O mogą być
zaimplementowane w trybie rejestrowym.
Mikrokontrolery i Mikrosystemy
100
Do wszystkich makrokomórek dochodzi siedem linii product term. Ósma linia product
term jest używana do sterowania buforem trójstanowym. Piny 1 i 11 są zawsze dostępne jako
wejścia danych dla matrycy iloczynu logicznego.
Rys. 4.6. Konfiguracja makrokomórki OLMC dla trybu złożonego
W trybie prostym makrokomórki są skonfigurowane jako dedykowane wejścia lub jako
dedykowane, zawsze aktywne, kombinacyjne wyjścia (rys. 4.7). Do makrokomórki OLMC
dochodzi osiem linii product term kontrolujących jej logikę. Dodatkowo każde wyjście ma
programowalną polaryzację. Piny 1 i 11 są zawsze dostępne jako wejścia danych matrycy
iloczynów logicznych. Dwie środkowe makrokomórki (piny 15 i 16) są zawsze dostępne jako
dedykowane wyjścia.
Każdy układ GAL16V8 posiada elektroniczny podpis. Składa się on z 64 bitów
zawartych w reprogramowalnej pamięci. Służy on do przechowywania danych użytkownika.
Niektórzy użytkownicy zapisują w niej kody identyfikacyjne, numery wersji, numer
kontrolne. Zawartość podpisu jest zawsze dostępna dla użytkownika niezależnie od stanu
komórki ochrony danych (zawartość elektronicznego podpisu jest wliczana do obliczania
sumy kontrolnej. Zmiana elektronicznego podpisu spowoduje zmianę sumy kontrolnej).
W układach GAL16V8 zaimplementowano komórkę ochrony danych (Security Cell),
służącą do blokady odczytu zaprogramowanej struktury. Raz zaprogramowana komórka
zapobiega odczytowi bitów konfiguracyjnych układu. Może być ona skasowana tylko przez
przeprogramowanie całego układu, czyli oryginalna konfiguracja nigdy nie będzie odczytana.
Elektroniczny podpis jest zawsze możliwy do odczytania niezależnie od stanu komórki
ochrony danych.
Specjalne obwody wewnątrz układu GAL16V8 zapewniają po włączeniu zasilania sygnał
reset wszystkim rejestrom. Rejestry ustawiają swoje wyjścia Q w stan niski po określonym
czasie (maksymalnie 1s), wynikiem tego stan pinów wyjść rejestrowych (jeśli są włączone)
będzie zawsze  wysoki po włączeniu zasilania, niezależnie od zaprogramowanej polaryzacji
końcówek wyjściowych.
Mikrokontrolery i Mikrosystemy
101
Rys. 4.7. Konfiguracja makrokomórki OLMC dla trybu prostego
4.2. Układy logiczne CPLD na przykładzie rodziny układów XC9500 firmy
Xilinx
Układy logiczne CPLD zostaną przedstawione na przykładzie rodziny układów XC9500
firmy Xilinx. Są one programowalne i testowalne w docelowym mse. Rodzina ta
charakteryzuje się następującymi właściwościami:
" duża szybkość działania (5ns opóznienia pomiędzy pinami, fCNT do 125 MHz),
" duża gęstość upakowania (od 36 do 288 makrokomórek z 800 do 6,400 użytecznymi
bramkami),
" układy programowalne w systemie o napięciu zasilania 5V (możliwość wykonania 10000
cykli programowania/kasowania),
" układy składają się z  elastycznych bloków funkcyjnych (odpowiadających układom
GAL typu 36V18), 90 linii product terms sterujących pojedynczymi lub wszystkimi 18
makrokomórkami wewnątrz bloku funkcyjnego,
" posiadają interfejs standardu IEEE 1149.1 (JTAG),
" zapewniają programowalny tryb redukcji mocy dla każdej komórki,
" wyjścia układów przewodzą prąd do 24mA,
" piny wejściowo-wyjściowe mogą być ustawione na standard 3,3V lub 5V.
Mikrokontrolery i Mikrosystemy
102
W tabeli 4.2 zestawiono układy rodziny XC9500. Jak widać gęstość upakowania
używanych bramek logicznych mieści się w przedziale od 800 do ponad 6400, a rejestrów od
36 do 288.
Tabela 4.2. Rodzina układów XC9500
Na potrzeby programowania i testowania układów w systemie rozszerzono listę instrukcji
sterujących interfejsem JTAG. Zatem interfejs ten pozwala nie tylko na testowanie zgodnie
ze standardem IEEE 1149.1, ale również i programowanie układów zamontowanych już w
systemie.
Rys. 4.8. Architektura układów rodziny XC9500
Możliwość przeprowadzania wielokrotnej liczby cykli programowania/kasowania
zapewnia dużą swobodę w zmienianiu wewnętrznej konfiguracji układów, czy uaktualnianiu
zawartych w nich projektów. Dodatkowo zapewniono kontrolę szybkości narastania napięć
Mikrokontrolery i Mikrosystemy
103
wyjściowych oraz umożliwiono programowe uziemienie pinów w celu lepszej redukcji
szumów. Urządzenia wejścia/wyjścia mogą być konfigurowane dla napięć 3,3V oraz 5V.
Wszystkie wyjścia przewodzą prąd do 24mA.
Każdy układ XC9500 jest podsystemem zawierającym bloki funkcyjne (FB  Function
Block) i bloki wejścia/wyjścia (IOB  I/O Block), które są łączone między sobą za pomocą
matrycy przełączającej (FastCONNECT switch matrix) (rys. 4.8).
Bloki IOB między innymi buforują sygnały wejściowe i wyjściowe z układu oraz
zapewniają odpowiednie parametry elektryczne zacisków.
Każdy blok funkcyjny FB daje możliwość zaprogramowania 36 wejść i 18 wyjść. Matryca
przełączająca łączy wszystkie wyjścia bloku FB z wejściami innego bloku FB. Dla każdego
bloku FB wyjścia w liczbie od 12 do 18 (w zależności od liczby wyprowadzeń obudowy)
skojarzone z sygnałami output enable sterują bezpośrednio blokami IOB.
Rys. 4.9. Blok funkcyjny (FB) układów rodziny XC9500
Każdy blok funkcyjny, jak przedstawiono na rys. 4.9, składa się z 18 niezależnych
makrokomórek, z których każda może realizować funkcję kombinacyjną bądz rejestrową. Do
bloku funkcyjnego doprowadzony jest sygnał zegara oraz sygnały set/reset. Blok funkcyjny
poprzez generację stanów na 18 wyjściach steruje matrycą przełączającą. Wyjścia te wraz z
sygnałami output enable sterują blokami IOB.
Do programowalnej matrycy iloczynów logicznych dochodzą 72 sygnały (36 normalnych
sygnałów i 36 ich negacji). Sygnały te są przez nią łączone do 90 linii product term
dochodzących do 18 makrokomórek. Wewnątrz każdego bloku FB możliwe jest
zrealizowanie połączeń (ścieżek) z wyjść makrokomórek do matrycy iloczynów logicznych,
bez potrzeby wyprowadzania ich poza dany blok FB. Ścieżki te wykorzystywane są do
tworzenia bardzo szybkich liczników oraz układów stanów, gdzie wszystkie rejestry stanu są
wewnątrz tego samego bloku FB.
Mikrokontrolery i Mikrosystemy
104
Każda makrokomórka w bloku FB układu XC9500 może być indywidualnie
skonfigurowana tak, aby realizować funkcje kombinacyjne lub rejestrowe. Rys. 4.10
przedstawia makrokomórkę i towarzysząca jej strukturę logiczną bloku FB.
Rys. 4.10. Makrokomórka bloku FB układów rodziny XC9500
Pięciu linii product terms bezpośrednio wyprowadzonych z matrycy iloczynów logicznych
można użyć jako podstawowych wejść danych (do bramek OR i XOR). Pozwalają one na
implementację funkcji kombinacyjnej lub mogą posłużyć jako wejścia sterujące włączając w
to sygnały zegara, set/reset i output enable. Blok PTA (Product Term Allocator), zawarty w
każdej makrokomórce, służy do wyboru sposobu użycia tych pięciu linii. Rejestr
makrokomórki może być skonfigurowany jako przerzutnik D lub T, lub też może być
przeznaczony do operacji kombinacyjnych. Każdy rejestr wyposażony jest w dwie
asynchroniczne operacje ustawiania (set) i zerowania (reset). Podczas włączania zasilania
wszystkie wykorzystywane rejestry są inicjalizowane do stanu zdefiniowanego przez
użytkownika (w przypadku braku specyfikacji domyślnie ustawiane jest 0).
Wszystkie globalne sygnały takie jak sygnały zegara, set/reset oraz output enable są
dostępne dla każdej makrokomórki. Sygnał zegarowy dochodzący do rejestru makrokomórki
może być jednym z trzech globalnych sygnałów zegara lub sygnałem zegara pochodzącym z
linii product term, co przedstawiono na rys. 4.11. Dodatkowo istnieje możliwość wyboru
aktywnego zbocza sygnału zegarowego. Poprzez wejście GSR możliwe jest ustawienie
rejestru użytkownika do zdefiniowanego przez niego stanu.
Mikrokontrolery i Mikrosystemy
105
Rys. 4.11. Sposób wyboru sygnałów zegarowych set/reset w makrokomórce bloku FB
układów rodziny XC9500
Blok PTA makrokomórki steruje wykorzystaniem pięciu bezpośrednich linii product terms
dochodzących do niej. Np. wszystkie pięć linii może być dołączonych do bramki OR, jak
pokazano na rys. 4.12.
Rys. 4.12. Wykorzystanie bezpośrednich linii product terms w makrokomórce
Blok PTA może dokonywać zmian wewnątrz FB i przydzielać makrokomórce dodatkowe
linie, oprócz pięciu podstawowych dochodzących już do niej. Każda makrokomórka
wymagająca dodatkowej linii product term może skorzystać z niewykorzystanej linii innej
makrokomórki wewnątrz bloku FB. Pojedyncza makrokomórka może użyć 15 linii product
terms, przy czym należy uwzględnić dodatkowe opóznienia sygnałów na dodanych liniach,
wynikające z wydłużenia się ich drogi wewnątrz bloku FB (rys. 4.13).
Mikrokontrolery i Mikrosystemy
106
Rys. 4.13. Blok PTA z 15 liniami product terms
Elastyczność ta wynika z budowy bloku PTA pokazanej na rys. 4.14.
Rys. 4.14. Schemat logiczny bloku PTA
Matryca przełączająca dostarcza sygnały z bloków IOB i FB do wejść bloków FB (rys.
4.15). Wszystkie wyjścia bloków FB i wejścia/wyjścia bloków IOB są podawane na tę
matrycę. Za pomocą matrycy użytkownik wybiera sygnały, które mają dochodzić do danego
bloku FB. Dodatkowo realizuje ona iloczyn logiczny na drucie co zwiększa funkcjonalność
całego układu.
Mikrokontrolery i Mikrosystemy
107
Rys. 4.15. Schemat logiczny matrycy przełączającej (FastCONNECT Switch Matrix)
Bloki wejścia/wyjścia IOB stanowią interfejs pomiędzy wewnętrzną logiką, a pinami
wejścia/wyjścia układu. Każdy blok zawiera bufor wejściowy, sterownik wyjściowy,
multiplekser wyboru output enable oraz programowalne uziemienie (rys. 4.16). Bufor
wejściowy jest kompatybilny ze standardami 5V CMOS, 5V TTL i poziomami sygnału 3,3V.
Bufor wejściowy używa wewnętrznego 5V zródła zasilania (VCCINT) w celu zapewnienia
stałych progów wejścia i eliminacji wahań napięcia VCCIO. Sygnał output enable może być
generowany w następujący sposób, jako: sygnał product term z makrokomórki, dowolny
sygnał zegara globalnego, zawsze  1 lub zawsze  0 . Występują dwa globalne sygnały
output enable dla układów do 144 makrokomórek oraz cztery sygnały globalne output enable
dla układów z 180 lub większą liczbą makrokomórek.
Każde wyjście umożliwia kontrolę szybkości narastania napięcia wyjściowego. Szybkość
narastania sygnału wyjściowego może być programowo spowalniana w celu redukcji
szumów. Każdy blok IOB zapewnia programową obsługę pinu uziemienia. Pozwala to na
dodatkową konfigurację pinów układów wejścia/wyjścia jako pinów uziemienia. Dzięki temu
można znacznie zredukować poziom szumów. Rezystory podciągające (typowa wartość
10k&!) są dołączone do każdego układu wejścia/wyjścia w celu zabezpieczenia go przed
stanem nieokreślonym, w przypadku niewykorzystania tego układu przez projekt
użytkownika. Rezystory te są aktywne w trybie programowania oraz kasowania układu, a
także w momencie włączania zasilania systemu.
Mikrokontrolery i Mikrosystemy
108
Rys. 4.16. Schemat logiczny bloku IOB wraz z układami sterującymi sygnałami output enable
Rezystory są de aktywowane podczas normalnych operacji. Sterownik wyjściowy jest
zdolny do przewodzenia prądu 24mA. Wszystkie sterowniki wyjściowe w układzie mogą być
skonfigurowane dla poziomu 5V lub poziomu 3,3V przez połączenie wyjściowego pinu
zasilania (VCCIO) do 5V lub do zródła zasilania 3,3V. Rys. 4.17 pokazuje jak układ XC9500
może być zasilany tylko napięciem 5V lub napięciem 5V i 3,3V.
Rys. 4.17. Sposoby zasilania układu rodziny XC9500: a) jedno zródło zasilania 5V,
b)dwa zródła zasilania 5V i 3,3V
Mikrokontrolery i Mikrosystemy
109
Programowanie i testowanie układów rodziny XC9500 jest realizowane za pomocą
interfejsu standardu IEEE 1149.1 (JTAG). Interfejs ten posiada następującą listę instrukcji:
EXTES, SAMPLE/PRELOAD, BYPASS, USER-CODE, INTEST, IDCODE, HIGHZ.
Dodatkowo na potrzeby programowania układów w systemie (ISP) dodano 5 instrukcji:
ISPEN, FERASE, FPGM, FVFY, ISPEX. Stanowią one rozszerzenie zestawu instrukcji
1149.1. Zgodnie ze specyfikacją standardu IEEE 1149.1 piny TMS i TCK układu interfejsu
JTAG są podwieszone poprzez rezystory pull-up do zasilania.
Układy XC9500 zawierają zaawansowane sposoby ochrony danych, które całkowicie
zabezpieczają program przed nieautoryzowanym czytaniem lub pomyłkowym skasowaniem,
czy przeprogramowaniem. Użytkownik może ustawić odpowiednie bity w celu ochrony kodu
programu zawartego w układzie przed jego przeczytaniem. Skasowanie w całości programu
jest jedynym sposobem na wyzerowanie bitów zabezpieczających, tym samym na
odblokowanie odczytu z układu.
Wszystkie układy XC9500 oferują możliwość ustawienia trybu niskiego poboru mocy dla
każdej makrokomórki z osobna lub dla wszystkich jednocześnie. Zatem ważne dla danej
aplikacji części układu mogą pozostać w standardowym trybie poboru mocy, podczas gdy
pozostałe mogą zostać zaprogramowane na operacje przy niskim poborze mocy.
W czasie włączania zasilania (power-up time) układy XC9500 są w stanie uśpienia dopóki
napięcie zasilające VCCINT nie osiągnie bezpiecznego poziomu (około 3,8 V). Do tego czasu
wszystkie piny układu oraz interfejsu JTAG są wyłączone i podwieszone do zasilania za
pomocą rezystorów pull-up. Kiedy napięcie zasilania osiągnie bezpieczny poziom wszystkie
rejestry użytkownika są inicjalizowane (typowo w czasie 100s dla 9536 - 95144, 200s dla
95216, 300s dla 95288) po czym układ jest gotowy do pracy.
4.3. Język ABEL opisu układów realizowalnych w strukturach
programowalnych
Podczas projektowania układu zazwyczaj wiemy, jakie są sygnały wejściowe do
przetwarzania w układzie oraz jakie sygnały wyjściowe powinny wystąpić na wyjściach
układu. W większości języków służących do opisu układów realizowalnych w strukturach
programowalnych wejścia i wyjścia są nazywane portami układu. W każdym języku opis
układu składa się z dwóch bloków: tzw. bloku deklaracji zawierającego przypisania
sygnałów, identyfikowanych nazwami, do odpowiednich portów oraz z bloku opisu budowy
i działania układu.
Język ABEL (Advanced Boolean Expression Language), to jeden z najstarszych języków
opisu układów implementowanych w strukturach programowalnych. Opracowany został
przez firmę DATA I/O. Opis układu w języku ABEL ma postać modułu tekstowego, lub
modułów połączonych w strukturę hierarchiczną. Język ABEL daje możliwość opisu
zachowania systemu na wiele sposobów, włączając równania logiczne, tablice prawdy i opis
stanowy, podobny w zapisie do warunków języka C. Kompilatory do języka ABEL dają
możliwość projektowania i programowania struktur PLD takich jak: SPLD, CPLD i FPGA.
4.3.1. Podstawowa struktura pliku zródłowego w języku ABEL
Plik zródłowy w języku ABEL składa się z następujących części:
" nagłówek: załączone moduły, opcje i tytuł,
" opis logiczny: równania, tablica prawdy, opis stanowy,
Mikrokontrolery i Mikrosystemy
110
" wektory testujące,
" koniec.
Uwaga: dla słów kluczowych języka ABEL wielkość liter nie jest istotna. Natomiast nazwy
nadane przez użytkownika i etykiety są identyfikowane również po wielkości liter (np.
input1 i Input1 są różnymi nazwami bądz etykietami).
W tabeli 4.3 pokazano listing opisu zródłowego w języku ABEL.
Tabela 4.3. Listing opisu zródłowego w języku ABEL
"Struktura pliku zródłowego
Komentarz
" w języku ABEL
module nazwa_modułu
Nagłówek
title 'tytuł projektu'
deviceID device deviceType;
declarations
Deklaracje sygnałów wejściowych i
sygnały_we pin;
wyjściowych, stałych zmiennych
sygnały_wy pin istype 'com';
pomocniczych w postaci wektorów
nazwa =.c.;
nazwa = [nazwa1, nazwa2,..];
equations
Opis logiczny układu
równania, lub/i
truth_table
tablice wartości, przejść
lub/i
state_diagram
opis tekstowy grafu przejść
test_vectors
Wektory testowe
wartości sygnałów wejściowych
-> spodziewane odpowiedzi
end nazwa_modułu
Zakończenie opisu modułu
Plik zródłowy musi zaczynać się słowem kluczowym module, a kończyć słowem end.
W nagłówku opisu zródłowego występuje nazwa modułu po słowie kluczowym module.
Nazwa modułu określa również nazwę plików wyjściowych tworzonych przez
oprogramowanie przetwarzające systemu syntezy (kompilator, program optymalizacji,
symulator, fitter, itd.). Tytuł projektu wprowadzony po słowie title umożliwia łatwą
identyfikację plików związanych z danym projektem.
Kolejnym blokiem jest blok deklaracji, w którym deklarowane są nazwy (identyfikatory)
sygnałów wejściowych (pin) oraz wyjściowych (pin istype 'typ_końcówki').
Można również wskazać (opcjonalnie) numery pinów wejściowych i wyjściowych układu
programowalnego, który zamierzamy zastosować (zadeklarowanego słowem device). W
tym bloku deklarowane są również nazwy sygnałów wewnętrznych, pomocnicze zmienne,
stałe itp.
Kolejnym blokiem jest blok opisu logicznego, w którym definiuje się właściwości
logiczne projektowanego układu. Możliwy jest opis działania układu za pomocą:
" równań, po słowie kluczowym equations, z operatorami logicznymi, ale także równań
z operatorami arytmetycznymi i operacjami relacji,
" tablicy wartości funkcji (dla układów kombinacyjnych) lub tablicy przejść (dla układów
sekwencyjnych) po słowie kluczowym truth_table,
Mikrokontrolery i Mikrosystemy
111
" tekstowego opisu grafu przejść po słowie kluczowym state_diagram
Opcjonalnym blokiem w pliku zródłowym jest blok wektorów testowych
przygotowanych w postaci tablicy, w której wpisuje się arbitralnie wybrane kombinacje
sygnałów wejściowych (wektory pobudzeń) i oczekiwane dla nich wartości sygnałów
wyjściowych (odpowiedzi na wyjściu układu). Wektory testowe są wykorzystywane przez
program symulacji funkcjonalnej (poprawności opisu logicznego) lub program symulacji
układu po jego implementacji w wybranej strukturze programowalnej, a więc już po
przygotowaniu wynikowego pliku konfiguracyjnego.
4.3.2. Słowa kluczowe języka ABEL
Module: każdy plik zródłowy rozpoczyna się konstrukcją module a zaraz za nią występuje
nazwa modułu (identyfikator). Duże zródła składają się często z wielu modułów z
ich własnymi tytułami, równaniami, itd.
Title: jest opcjonalny i może być używany do identyfikacji projektu. Tytuł musi być
umieszczony w pojedynczych cudzysłowach. Linia Title jest ignorowana przez
kompilator, ale jest bardzo przydatna przy tworzeniu dokumentacji.
String: tekst jest łańcuchem znaków ASCII umieszczonym w pojedynczych cudzysłowach.
Strings są używane do wpisania nazw Tytułu(Title), Opcji(Options), oraz nazw
końcówek układu, węzłów i deklaracji atrybutów.
device: ta deklaracja jest opcjonalna i stowarzysza identyfikator układu z konkretną
programowalną strukturą logiczną. Deklaracja device musi być zakończona
średnikiem. Np. MY_DECODER device 'XC4003E';
comments: komentarze mogą być umieszczane w dowolnym miejscu pliku. Rozpoczynają się
podwójnym cudzysłowem, a kończą końcem linii, lub podwójnym cudzysłowem, w
zależności od tego co będzie pierwsze.
pin: deklaracja ta służy to poinformowania kompilatora, które nazwy użytkownika są
powiązane z końcówkami urządzenia. Zapis:
[!]pin_id pin [pin#] [istype 'attributes'];
Jedna deklaracja pin może opisywać więcej końcówek:
[!]pin_id , pin_id, pin_id pin [pin#, [pin#, [pin#]]] [istype 'attributes'];
Przykład 4.1:
IN1, IN2, A1 pin 2, 3, 4;
OUT1 pin 9 istype 'reg';
ENABLE pin;
!Chip_select pin 12 istype 'com';
!S0..!S6 pin istype 'com';
Nie jest konieczne do określenia końcówek układu. Numery końcówek mogą być
określone podczas kompilacji używając np. Xilinx CAD. Jest to bardzo dobra własność
dająca możliwość tworzenia projektów bardziej ogólnych i elastycznych.
Znak ! opisuje końcówkę jako aktywną stanem niskim (sygnał będzie negowany).
Atrybut istype jest powiązaniem dającym możliwość wybrania trybu pracy końcówki,
takich jak  com wyjście wówczas jest kombinacyjne, lub  reg tryb rejestrowy taktowany
zegarem. Ten atrybut jest tylko dla wyjścia.
Mikrokontrolery i Mikrosystemy
112
: węzeł jest deklaracją wewnętrznego sygnału, który nie ma połączenia z końcówką
node
układu, ale ma taki sam format jak deklaracja pin. Np.:
tmp1 node [istype 'com'];
Inne deklaracje: pozwalają na definicje stałych, zmiennych makr i wyrażeń, które mogą
uprościć program. Przykładowa deklaracja stałej ma postać: id [, id],... = expr [, expr];
Przykład 4.2:
A = 21;
C=2*7;
ADDR = [1,0,11];
LARGE = B & C;
D = [D3, D2, D1, D0];
D = [D3..D0];
Dwa ostatnie równania są sobie równoważne. Użycie  ..  jest bardzo przydatne do
określenia zakresu. Przedstawiają one zapis wektora, za każdym odwołaniem do D będzie to
równoznaczne odwołaniu do wektora [D3, D2, D1. D0].
4.3.3. Liczby
Liczby mogą być wprowadzane w czterech różnych systemach: binarnym, ósemkowym,
dziesiętnym i szesnastkowym. Systemem domyślnym jest dziesiętny. Istnieje możliwość
zmiany bazy domyślnej przy użyciu dyrektywy Radix
Tabela 4.4. Systemy liczb w języku ABEL
Nazwa systemu Podstawa Symbol
Binarny 2 ^b
Ósemkowy 8 ^o
Dziesiętny 10 ^d (domyślny)
Szesnastkowy 16^h
4.3.4. Dyrektywy
Dyrektywy pozwalają na zaawansowane zarządzanie plikiem zródłowym i mogą być
używane w każdym miejscu pliku, gdy tylko zajdzie taka potrzeba.
@ALTERNATE
Zapis: @alternate
@ALTERNATE włącza alternatywny zestaw operatorów. Użycie operatora @alternate
wyklucza użycie operatorów ABEL-HDL dodawania(+), mnożenia(*) i dzielenia(/), ponieważ
reprezentują one operatory logiczne AND i NOT w trybie @alternate. Operatory standardowe
działają podczas trybu @alternate.
Powrót do trybu normalnego odbywa się przez dyrektywę @STANDARD, lub koniec
modułu.
@RADIX
Zapis: @radix expr ;
Mikrokontrolery i Mikrosystemy
113
Expr: określa bazę systemu liczb jaki ma być domyślny : 2,8,10,16. Np.:
@radix 2;  zmień system domyślny na binarny
@radix 10;  zamień z powrotem system binarny na dziesiętny
@STANDARD
Zapis: @standard
Dyrektywa @standard przywraca ustawienia ABEL-HDL do standardowych.
4.3.5. Zmienne zespołowe (SET) - wektory
Wektor (SET) jest zespołem sygnałów lub stałych używanych do opisu grupy sygnałów
przez nazwę. Dyrektywa Set jest bardzo użyteczna przy upraszczaniu zapisu logicznego
równań.
Wektor (SET) jest listą stałych lub sygnałów oddzielonych przecinkami lub operatorem
zakresy  ..  umieszczonymi koniecznie w nawiasach kwadratowych.
Przykład 4.3:
[D0,D1,D2,D4,D5]
[D0..D6]
" zakres rosnący
[b6..b0]
" zakres malejący
[D7..D15]
[b1,b2,a0..a3]
" zakres z podzakresem
"zakres malejący z aktywnym
[!S7..!S0]
stanem niskim
Jednakże niedozwolony jest zapis: [D0, X];
gdzie X = [X3..X0];
Można zapisać takie wyrażenie w następujący sposób:
[D0, X3..X0];
4.3.5.1. Indeksowanie i dostęp do wektora (SET)
Indeksowanie daje możliwość dostępu do elementów wewnątrz wektora. Do elementów
wewnątrz wektora odwoływać się przez numer pozycji, który element zajmuje w wektorze.
Przykład 4.4:
D1 = [D15..D0]; "deklaracja wektora
X2 = [X3..X0]; "deklaracja wektora
X2 := D1[3..0]; "X2 równy [D3, D2, D1, D0]
X2 := D1[7..4]; "X2 równy [D7, D6, D5, D4]
Aby uzyskać dostęp do jednego z elementów wektora można użyć zapisu:
OUT = (X[2] == 1);
Operator(= =) jest użyty to konwersji pojedynczego elementu X[2] do wartości bitowej jemu
równoważnej, operator (= =) daje wynik  1 lub  0 w zależności od tego czy porównanie
Mikrokontrolery i Mikrosystemy
114
jest prawdą, czy fałszem. Operator (=) jest operatorem przypisania i przypisuje wynik
komparacji do wyjścia OUT.
4.3.5.2. Operacje na wektorze
Większość operatorów może być używana do wykonywania operacji na wektorach. Operacje
te wykonywane są zgodnie z zasadami algebry boolowskiej, według ustalonych priorytetów.
Przykład 4.5:
Signal = [D2,D1,D0]; "deklaracja wektora
Signal = [1,0,1] & [0,1,1];" wynik dzia" ania [0,0,1]
Przykład 4.6:
[A,B] = C & D;
inny zapis:
A = C & D;
B = C & D;
Przykład 4.7:
[A1,B1] = [D1,D2] & [C3,C2];
równoważne z:
[A1,B1] = [D1 & C3, D2 & C2];
inny zapis:
A1 = D1 & C3;
B1 = D2 & C2;
Przykład 4.8:
X & [A,B,C];
równoważne z:
[X&A, X&B, X&C];
jednakże zapis:
2 & [A,B,C];
zostanie zinterpretowany jako:
[0 & A, 1 & B, 0 & C];
Przykład 4.9:
A=[A2,A1,A0]; "deklaracja wektora
B=[B2,B1,B0]; "deklaracja wektora
A # B; równoważne z [A2 # B2, A1 # B1, A0 # B0];
!A; równoważne z [!A2,!A1,!A0];
Przykład 4.10:
[b3,b2,b1,b0] = 2;"równowa" ne z b3=0,b2=0,b1=1,b0=0.
Wektory są bardzo przydatne w opisie równań logicznych:
Mikrokontrolery i Mikrosystemy
115
Przykład 4.11:
Chip_Sel = !A7 & A6 & A5;
Można to zrobić za pomocą wektora
Addr = [A7,A6,A5];" tworzymy sta" y wektor
I używając równania wybrać adres
Chip_Sel = Addr == [0,1,1];
Co jest równoważne:
Chip_Sel = !A7 & A6 & A5;
Można również zapisać
Chip_Sel = Addr == 3; " dziesi" tnie 3 to binarnie 011.
Przykład 4.12:
Dla tych samych stałych co powyżej wyrażenie
3 & Addr;
co jest równoważne
[0,1,1] & [A7,A6,A5]
[0 & A7, 1 & A6, 1 & A5]
[0,A6,A5]
Jednakże zapis jest wówczas inny
3 & (Addr == 1);
co jest równoważne:
3 & (!A7 & !A6 & A5).
Operator(==) daje wynik bitowy, reszta wyrażenia jest też bitowa, a 3 jest obcinane do 1 i
w rzeczywistości równanie jest równoważne:
1& !A7 & !A6 & A5.
4.3.6. Operatory
W języku ABEL istnieją cztery podstawowe typy operatorów: Logiczne, arytmetyczne,
relacji i przypisania.
4.3.6.1. Operatory logiczne
Tablica poniżej zawiera wszystkie dostępne operatory logiczne, operacje wykonywane są
bit po bicie. Jeżeli aktywna jest dyrektywa @ALTERNATE można używać alternatywnego
zapisu operatorów.
Tabela 4.5. Operatory logiczne w języku ABEL
Operator
Operator (domyślny) Opis
alternatywny
NOT
! /
(uzupełnienie do jednego)
& AND *
#OR +
$ XOR: exclusive or :+:
!$ XNOR: exclusive nor :*:
4.3.6.2. Operatory arytmetyczne
Mikrokontrolery i Mikrosystemy
116
Tabela poniżej zawiera wszystkie dostępne operatory arytmetyczne.
Tabela 4.6. Operatory arytmetyczne w języku ABEL
Operator Przykład Opis
Uzupełnienie do
--D1
dwóch(negacja)
-C1-C2 Odejmowanie
+ A+B Dodawanie
Poniższe nie są dozwolone z wektorami:
* A*B Mnożenie
/ A/B Dzielenie całkowite
% A%B Reszta z dzielenia
<< A<>> A>>B Obróć A o B botów w prawo
4.3.6.3. Operatory relacji
Operatory te generują wartości Boolowskie prawda (-1) i fałsz (0). (W kodzie uzupełnień
do dwóch na 16-bitach " 1" jest reprezentowany jako 1111 1111 1111 1111).
Tabela 4.7. Operatory relacji w języku ABEL
Operator Przykład Opis
== A==B or 3==5 (fałsz) równe
A!=B or 3 != 5
!= Nie równe
(prawda)
A< Mniej niż
(prawda)
A<=B or 3 <= 5
<= Mniejszy lub równy
(prawda)
A>B or -1 > 5
> Miększy niż
(prawda)
A>=B or !0 >= 5
>= Większy lub równy
(prawda)
Operatory relacji działają bez znaku. Zatem !0 jest dopełnieniem do 0 lub 11111111 (8
bitowa dana) co jest równe 255 w kodzie bez znaku. Dlatego !0 > 9 jest prawdą. Wyrażenie -
1>5 jest prawdą z tego samego powodu. Np.:
A = B !$ (C == D);
A będzie równe B jeżeli C jest równe D, w innym przypadku A będzie równe dopełnieniu B
(jeżeli C nie jest równe B (fałsz lub zero)).
4.3.6.4. Operatory przypisania
Operatory te są stosowane do przypisywania wartości w równaniach do sygnałów i węzłów
wyjściowych. Rozróżnia się dwa typy operatorów: kombinacyjne i rejestrowe. W
kombinacyjnych przypisanie następuje natychmiast, w rejestrowych przypisanie następuje
przy następnym takcie zegara.
Mikrokontrolery i Mikrosystemy
117
Q1 pin istype 'reg';
Q1 := D;
Pierwsze wyrażenie definiuje Q1 jako przerzutnik przy użyciu  reg istype (wyjście
rejestrowe), drugie wyrażenie dokonuje powiązania wyjścia Q1 z wejściem D. Jeżeli nastąpi
zmiana D to przy następnym takcie zegara nastąpi zmiana na Q1.
Tabela 4.8. Operatory przypisania w języku ABEL
Operator Opis
= Przypisanie kombinacyjne
:= Przypisanie rejestrowe
4.3.6.5. Operatory priorytetu
Poniższa tabela przedstawia zestawienie priorytetów poszczególnych operatorów, gdzie 1
jest najwyższym 4 najniższym. W przypadku gdy dwa operatory maja priorytet tego samego
poziomu, to wykonywane są zgodnie z regułą od lewej do prawej strony.
Tabela 4.9. Zestawienie priorytetów operatorów w języku ABEL
Priorytet Operator Opis
1 - Negacja
1 ! NOT
2 & AND
2 << Obrót w lewo
2 >> Obrót w prawo
2* Mnożenie
2 / Dzielenie bez znaku
2 % Reszta z dzielenia
3 + dodawanie
3 - Odejmowania
3# OR
3 $ XOR
3 !$ XNOR
4== Równy
4!= Nie równy
4 < Mniejszy niż
4 <= Mniejszy równy
4> Większy niż
4>= Większy równy
4.3.7. Opis logiki projektowanego układu
Projekt logiki projektowanego układu może być przedstawiony za pomocą:
" równań,
" tablicy prawdy,
" opisu stanów.
4.3.7.1. Równania
Mikrokontrolery i Mikrosystemy
118
Użycie słowa kluczowego equations rozpoczyna opis logiki za pomocą równań. Równania
można konstruować używając operatorów jak powyżej, lub za pomocą wyrażenia WHEN-
THEN-ELSE (uwaga: IF-THEN-ELSE używane jest przy opisie stanowym).
Sposób zapisu wyrażenia "When-Then-Else":
WHEN [warunek] THEN [element]=[wyra" enie];
ELSE [równanie];
lub
WHEN [warunek] THEN [równanie];
Przykład 4.13:
SUM = (A & !B) # (!A & B) ;
A0 := EN & !D1 & D3 & !D7;
WHEN (A == B) THEN D1_out = A1;
ELSE WHEN (A == C) THEN D1_out = A0;
WHEN (A>B) THEN { X1 :=D1; X2 :=D2; }
Nawiasy klamrowe { }grupują sekcje w bloki.
4.3.7.2. Tablica prawdy
Dla zapisu tablicy prawdy słowem kluczowym jest np.:
truth-table
TRUTH_TABLE ( in_ids -> out_ids )
inputs -> outputs ;
lub
TRUTH_TABLE ( in_ids :> reg_ids )
inputs :> reg_outs ;
lub
TRUTH_TABLE
( in_ids :> reg_ids -> out_ids )
inputs :> reg_outs -> outputs ;
W powyższych zapisach  -> jest wyjściem kombinacyjnym, a  :> wyjściem rejestrowym.
Pierwsza linia tablicy prawdy definiuje wejścia i wyjścia sygnałów. Następne linie opisują
wartości wejść i wyjść, każda linia musi być oddzielona średnikiem. Wejścia i wyjścia mogą
być pojedyncze, lub wektorowe.
Przykład 4.14. (sumator połówkowy):
TRUTH_TABLE ( [ A, B] -> [Sum, Carry_out] )
[ 0, 0 ] -> [0, 0 ];
[ 0, 1 ] -> [1, 0 ];
[ 1, 0 ] -> [1, 0 ];
[ 1, 1 ] -> [1, 1 ];
Jeżeli zdefiniujemy IN = [A,B] i OUT = [Sum,Carry_out] to można zapisać tablice w postaci:
TRUTH_TABLE (IN -> OUT )
0 -> 0;
1 -> 2;
2 -> 2;
Mikrokontrolery i Mikrosystemy
119
3 -> 3;
Przykład 4.15. (EXOR z dwoma wejściami i wejściem enable (EN), .X. oznacza że stan nie
jest istotny):
TRUTH_TABLE ([EN, A, B] -> OUT )
[ 0, .X.,.X.] -> .X.;
[ 1, 0 , 0 ] -> 0;
[ 1, 0 , 1 ] -> 1;
[ 1, 1 , 0 ] -> 1;
[ 1, 1 , 1 ] -> 0;
Przykład 4.16. (Trzybitowy licznik, zliczający do góry od 000 do 111, a następnie od 111 w
dół do 000. Wyjścia typu rejestrowego nazwane kolejno QA, QB, QC. Na wyjsciu OUT będą
sygnalizowane stany 111 licznika. Licznik będzie zerowany, gdy na wejściu RESET będzie
stan wysoki):
MODULE CNT3;
CLOCK pin; " wej" cie zegarowe
RESET pin; " wej" cie resetuj" ce
OUT pin istype 'com'; " wyj" cie sygna" u (kombinacyjne)
QC,QB,QA pin istype 'reg'; " wyj" cie sygna" u (rejestrowe)
[QC,QB,QA].CLK = CLOCK; "FF taktowane na wej" ciu CLOCK
[QC,QB,QA].AR = RESET; "asynchroniczny reset przez wej" cie
" RESET
TRUTH_TABLE ( [QC, QB, QA] :> [QC,QB,QA] -> OUT)
[ 0 0 0 ] :> [ 0 0 1 ] -> 0;
[ 0 0 1 ] :> [ 0 1 0 ] -> 0;
[ 0 1 0 ] :> [ 0 1 1 ] -> 0;
[ 0 1 1 ] :> [ 1 0 0 ] -> 0;
[ 1 0 0 ] :> [ 1 0 1 ] -> 0;
[ 1 0 1 ] :> [ 1 1 0 ] -> 0;
[ 1 1 0 ] :> [ 1 1 1 ] -> 0;
[ 1 1 1 ] :> [ 0 0 0 ] -> 1;
END CNT3;
4.3.7.3. Opis stanowy
Opis stanowy jest metodą analizy projektu logicznego na podstawie przejść stanów
urządzenia. Opis stanowy zawiera wyrażenia  IF-THEN-ELSE ,  GOTO ,  WITH .
Zazwyczaj stany deklaruje się w tablicy nazw stanów, co czyni program łatwiejszym w
czytaniu.
Deklaracja stanów (w części deklaracyjnej) posiada następującą formę:
state_id [, state_id ...] STATE;
Np.: SREG = [Q1, Q2]; powiązanie nazwy stanu SREG ze stanem zdefiniowanym przez
Q1 i Q2.
Zapis diagramu stanowego:
Mikrokontrolery i Mikrosystemy
120
State_diagram state_reg
STATE state_value : [equation;]
[equation;]
:
:
trans_stmt; ...
Słowo kluczowe state_diagram wyznacza początek opisu maszyny stanowej. Natomiast
słowo kluczowe STATE opisuje jeden stan włączając wartość stanu lub jego nazwę.
state_reg: jest to identyfikator, który definiuje i determinuje stan urządzenia. Może to być
symboliczny rejestr stanu, który został zadeklarowany w części deklaracyjnej.
state_value: może być wyrażeniem, wartością lub symboliczną nazwą aktualnego stanu.
equation: równanie opisujące wyjścia maszyny stanowej.
trans_stmt: wyrażenie definiujące stan następny. Mogą tu być użyte wyrażenia "If-Then-
Else", CASE, GOTO , mogą być poprzedzone wyrażeniem obrębu WITH.
Wyrażenie If-Then-Else jest używane w opisie stanowym i służy do definiowania stanu
następnego i do określenia wyjątków przejść stanowych. Zapis:
IF [wyra" enie] THEN state_exp
[ELSE state_exp] ;
W wyrażeniu  IF-THEN-ELSE state_exp może być wyrażeniem logicznym, lub
symboliczną nazwa stanu. Warto zauważyć, że wyrażenie  IF-THEN-ELSE może być
używane tylko w opisie stanowym do opisu funkcji logicznych. ELSE jest opcjonalne,  IF-
THEN-ELSE może być poprzedzone wyrażeniem Goto, Case i With.
Przykład 4.17:
SREG = [Q1, Q0]; "definicja rejestru stanów
S0 = [0, 0];
S1 = [1, 1];
state_diagram SREG
state S0: OUT1 = 1;
if A then S1
else S0;
state S1: OUT2 =1;
if A then S0
else S1;
Wyrażenie WITH: używa się następująco:
trans_stmt state_exp WITH [równanie]
[równanie ] ... ;
W zapisie trans_stmt może być wyrażeniem  If-then-else ,  Goto lub  Case . state_exp
jest następnym stanem, a równanie jest równaniem opisującym wyjścia maszyny stanowej.
Wyrażenie  WITH może być użyte z wyrażeniami:  If-Then-Else ,  Goto lub  Case , w
Mikrokontrolery i Mikrosystemy
121
miejsce wyrażeń prostych. Wyrażenie  WITH daje możliwość zapisu wyjść maszyny
stanowej w postaci:
if X#Y==1 then S1 with Z=1 else S2;
W poniższym przykładzie wyjście Z będzie ustawione, jeśli tylko testowane wyrażenie
logiczne przyjmie wartość jedynki logicznej (prawda  1 ). Wyrażenie  WITH może być
równaniem, które będzie wykonane jeśli tylko warunek testowany w części  IF-THEN-
ELSE zostanie spełniony.
Przykład 4.18:
if X&!Y then S3 with Z=X#Y else S2 with Z=Y;
Wyrażenie  WITH jest również przydatne do opisu zachowania rejestrów wyjściowych.
Można na przykład określić konkretną zmianę stanu wyjścia, przy konkretnym warunku;
Przykład 4.19:
state S1:
if RST then S2 with { OUT1 := 1; Error-Adrs := ADDRESS; }
else if (ADDRESS <= ^hC101)
then S4
else S1;
Wyrażenie Case: posiada postać:
CASE expression : state_exp;
[ expression : state_exp; ]
:
ENDCASE ;
Wyrażenie expression jest jakimkolwiek dozwolonym w zapisie języka ABEL
wyrażeniem logicznym, a state_exp jest wyrażeniem opisującym następny stan (ewentualnie
poprzedzony wyrażeniem  WITH ).
Przykład 4.20:
State S0:
case ( A == 0) : S1;
( A == 1) : S0;
endcase;
4.3.8. Rozszerzenie z kropką w deklaracji pinów
Rozszerzenia wyrażenia z kropką używa się w celu precyzyjniejszego opisu zachowania
projektowanego układu, a ściślej do sposobu realizacji pewnych funkcji. Pozwala to na
precyzyjną specyfikację sygnałów i węzłów powiązanych z rzeczywistym sygnałem. Zapis
tego rozszerzenia jest następujący:
signal_name.ext
Mikrokontrolery i Mikrosystemy
122
Niektóre z rozszerzeń z kropką opisano poniżej w tabeli. Rozszerzenia z kropką mogą być
ogólne lub mogą dotyczyć konfiguracji pin-pin.
Tabela 4.10. Znaczenie rozszerzeń z kropką w języku ABEL
Rozszerzenie z kropką Opis
Do opisu niezależnej architektury, lub konfiguracja pin-pin
.ACLR Asynchroniczne kasowanie rejestru
.ASET Asynchroniczne ustawianie rejestru
Połącz Zegar do wejść przerzutników
.CLK
wyzwalanych zboczem
.CLR Synchroniczne kasowanie rejestru
Kombinacyjne sprzężenie zwrotne z
.COM
przerzutnika na wejście
.FG Rejestr sprzężenia zwrotnego
.OE Wyjścia dostępne
.PIN Końcówka sprzężenia zwrotnego
.SET Synchroniczne ustawianie rejestru
Specyficzne rozszerzenia urządzenia(dla konkretnej architektury)
.D Wejście danych przerzutnika D
.J Wejście J przerzutnika JK
.K Wejście K przerzutnika JK
.S Wejście S przerzutnika SR
.R Wejście R przerzutnika SR
.T Wejście T przerzutnika T
.Q Rejestr wyjścia(sprzężenie zwrotne)
.PR Rejestr ustawiania
.RE Rejestr kasowania
.AP Asynchroniczny rejestr ustawiający
.AR Asynchroniczny rejestr kasujący
.SP Synchroniczny rejestr ustawiający
.SR Synchroniczny rejestr kasujący
Przykład 4.21:
[S6..S0].OE = ACTIVE;
Jeżeli ACTIVE jest w stanie wysokim to sygnały składające się na wektor [S6..S0] będą
miały załączone wyjścia, jeżeli natomiast ACTIVE będzie w stanie niskim, to wyjścia
wektora [S6..S0] będą w stanie wysokiej impedancji.
Przykład 4.22:
Q.AR = reset;
[Z.ar, Q.ar] = reset;
Jeżeli reset jest w stanie wysokim, to następuje kasowanie przerzutników składających się na
rejestr.
Mikrokontrolery i Mikrosystemy
123
4.3.9. Wektory testujące
Wektory testujące są opcjonalne i mają za zadanie zweryfikowanie poprawności działania
maszyny stanowej. Wektory te określają oczekiwane wyniki pewnych operacji zapisywanych
na wyjściach w funkcji zmiany wejść. Ich zapis przyjmuje postać:
Test_vectors [note]
(input [, input ].. -> output [, output ] .. )
[invalues -> outvalues ; ]
:
:
Przykład 4.23:
Test_vectors
( [A, B] -> [Sum, Carry] )
[ 0, 0 ] -> [0, 0];
[ 0, 1 ] -> [1, 0];
[ 1, 0 ] -> [1, 0];
[ 1, 1 ] -> [1, 1];
Dla wektorów można również określać wartości numeryczne określające zwartość rejestru.
Test_vectors
( [A, B] -> [Sum, Carry] )
0 -> 0;
1 -> 2;
2 -> 2;
3 -> 3;
Pola bez znaczenia (.X.), wejścia zegarowe (.C.), jak również zapis symboliczny stałych
mogą być używane w wektorach testujących.
Test_vectors
( [CLK, RESET, A, B ] -> [ Y0, Y1, Y3] )
[.X., 1, .X.,.X.]->[ S0, 0, 0];
[.C., 0, 0, 1 ] -> [ S0, 0, 0];
[.C., 1, 1, 0 ] -> [ S0, 0, 1];
4.3.10. Deklaracje aktywności stanem niskim
Definicji sygnału aktywnego stanem niskim dokonuje się przy użyciu operatora  ! :
!OUT pin istype 'com' ;
Jeżeli ten sygnał będzie używany w rozbudowanym opisie projektu, to automatyczne będzie
on uzupełniany do jedynki.
Przykład 4.24:
module EXAMPLE
Mikrokontrolery i Mikrosystemy
124
A, B pin ;
!OUT pin istype 'com';
equations
OUT = A & !B # !A & B ;
end
W powyższym przykładzie sygnał OUT jest wynikiem operacji XOR sygnałów A i B. Wobec
czego OUT (stan wysoki lub on) będzie miał miejsce dla sygnału A różnego od B. Jednakże
OUT został zadeklarowany jako aktywny stanem niskim wobec czego wyniki operacji będą
przeciwne. Wydawałby się że można to samo osiągnąć przez negację OUT. Lecz to
rozwiązanie nie będzie aktywne stanem niskim.
Aktywność stanem niskim można również zapisać w inny sposób. Wezmy wektory A, B i
X:
A = [A2,A1,A0]; "deklaracja wektora
B = [B2,B1.B0]; "deklaracja wektora
X = [X2,X1.X0]; "deklaracja wektora
!X = A & !B # !A & B;
Powyższe równanie jest równoznaczne zapisowi:
!X0 = A0 & !B0 # !A0 & B0;
!X1 = A1 & !B1 # !A1 & B1;
!X2 = A2 & !B2 # !A2 & B2;
4.3.11. Przykłady wykorzystania języka ABEL
Poniżej zostanie przedstawionych kilka przykładów wykorzystania języka ABEL opartych
na układzie GAL16V8.
Przykład 4.25:
Proste bramki logiczne zaimplementowane w układzie GAL16V8:
" bramka AND o wejściach A i B oraz wyjściu C,
" bramka OR o wejściach D i E oraz wyjściu F,
" negator o wejściu G i wyjściu H,
" bramka NAND o wejściach A i B oraz wyjściu I,
" bramka NOR o wejściach D i E oraz wyjściu J,
" bramka EX-OR o wejściach K i L oraz wyjściu M.
Postać pliku zródłowego napisanego w języku ABEL dla powyższego projektu jest
następująca:
Module proste_bramki
Title  podstawowe bramki logiczne
bramki device  P16V8 ;
 Piny wejsciowe
A, B pin 2, 3;  wejscia bramek AND i NAND
D, E pin 4, 5;  wejscia bramek OR i NOR
Mikrokontrolery i Mikrosystemy
125
G pin 6;  wejscie bramki NOT
K, L pin 7, 8;  wejscia bramki EX-OR
 Piny wyjsciowe
C pin 12 istype 'com';  wyjscie bramki AND
F pin 13 istype 'com';  wyjscie bramki OR
H pin 14 istype 'com';  wyjscie bramki NOT
I pin 15 istype 'com';  wyjscie bramki NAND
J pin 12 istype 'com';  wyjscie bramki NOR
M pin 12 istype 'com';  wyjscie bramki EX-OR
Equations
C = A & B;  AND
F = D # E;  OR
H = !G;  NOT
I = !(A & B);  NAND
J = !(D # E);  NOR
M = K $ L;  EX-OR
end proste_bramki
Przykład 4.26:
W przykładzie tym układ GAL16V8 ma za zadanie pracować jako 8-bitowy rejestr typu D
wyzwalany zboczem, czyli jako układ 74HCT374. Realizację tę pokazano na rys. 4.18.
Rys. 4.18. Realizacja za pomocą układu GAL16V8 8-bitowego rejestru 74HCT374
Plik zródłowy ma następującą postać
Module osmio_bitowy_rej
Title  8-bitowy rejestr typu 74HCT374
74HCT374 device  P16V8 ;
 wejscia
CLK, !OE pin 1, 11;
D1, D2, D3, D4, D5, D6, D7, D8 pin 2, 3, 4, 5, 6, 7, 8, 9;
 wyjscia
Mikrokontrolery i Mikrosystemy
126
Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 pin 19, 18, 17, 16, 15, 14,
13, 12 istype 'reg';
 definicje
D = [D1, D2, D3, D4, D5, D6, D7, D8];
Q = [Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8];
Equations
Q := D;
end osmio_bitowy_rej
Przykład 4.27:
W przykładzie tym przedstawiono implementację podstawowych typów przerzutników: RS,
T, D i JK (rys. 4.19).
a) b)
c) d)
Rys. 4.19. Schematy i opis w postaci równań przerzutników: a) RS, b) T, c) D i d) JK
Sposób implementacji (umiejscowienia) tych przerzutników w układzie GAL16V8 pokazano
na rys. 4.20.
Mikrokontrolery i Mikrosystemy
127
Rys. 4.20. Sposób umiejscowienia przerzutników w układzie GAL16V8
Zatem plik zródłowy projektu jest następujący:
Module podstawowe_przerzutniki
Title  Podstawowe przerzutniki: RS, T, D, JK
przerzutniki device  P16V8 ;
 wejscia
CLK,PR, CLR, !OE pin 1, 4, 9, 11;  sygnaly kontrolne
S, R pin 2, 3;  RS
T pin 5;  T
D pin 6;  D
J, K pin 7, 8;  JK
 wyjscia
QST, QSC pin 19, 18 istype 'com';  RS
QTT, QTC pin 17, 16 istype 'reg';  T
QDT, QDC pin 15, 14 istype 'reg';  D
QJT, QJC pin 13, 12 istype 'reg';  JK
Equations
 RS
QST = !S # (R & QST);
Mikrokontrolery i Mikrosystemy
128
QSC = !R # (S & QSC);
 T
QTT := PR # (!CLR & !T & QTT) # (!CLR & T & QTC);
QTC := CLR # (!PR & !T & QTC) # (!PR & T & QTT);
 D
QDT := PR # (D & !CLR);
QDC := CLR # (!D & !PR);
 JK
QJT := PR # (J & QJC & !CLR) # (!K & QJT & !CLR);
QJC := CLR # (!J & QJC & !PR) # (!K & QJT & !PR);
end podstawowe_przerzutniki
Pliki zródłowe zawierające kod w języku ABEL (rozszerzenie .abl) poddaje się kompilacji
przez odpowiednio do tego celu stworzone kompilatory. W wyniku kompilacji, dla układów
typu SPLD, jak i również układów CPLD, uzyskuje się pliki w standardzie JEDEC
zawierające mapę wewnętrznych połączeń w programowalnym układzie.
W kolejnym etapie przy pomocy odpowiednich programatorów i dostarczonego do nich
oprogramowania wprowadza się ten kod do układów.
Mikrokontrolery i Mikrosystemy
129
5. Układy peryferyjne z interfejsem szeregowym
standardu SPI
W rozdziale tym zostaną omówione wyłącznie układy peryferyjne z interfejsem SPI,
ponieważ coraz więcej układów jest wyposażanych w ten standard, a ponadto jest on znacznie
prostszy i łatwiejszy w implementacji niż standard I2C.
Ponieważ opis interfejsu SPI został przedstawiony w podrozdziale 2.6.5.2 zatem tutaj
zostaną omówione tylko jego właściwości wynikające ze współpracy mk z urządzeniami
peryferyjnymi.
Do komunikacji pomiędzy mk a układami peryferyjnymi oraz do komunikacji pomiędzy
samymi układami peryferyjnymi w mse stosuje się współcześnie interfejsy szeregowe
standardu SPI, jak i standardu I2C. Transmisja równoległa pozwala na osiągniecie
większych szybkości, lecz wymaga stosowania magistrali o wielu (przynajmniej 8) liniach.
Natomiast transmisja szeregowa w porównaniu z równoległą wymaga:
" mniej linii połączeniowych (przeważnie trzy lub dwie),
" mniej dodatkowych układów,
" charakteryzują ją łagodniejsze wymagania czasowe,
" układy transmisyjne zajmują mniej miejsca i zacisków we/wy układu scalonego.
W interfejsie SPI formaty danych układów peryferyjnych nie są określone. Bitowe ciągi
danych transmitowane interfejsem SPI nie maja ustalonej długości (jest to zazwyczaj
krotność ośmiu bitów)oraz kolejność bitów nie jest określona (najczęściej transmisja
zaczyna się od MSB i kończy na LSB). Długość transmitowanych danych ulega zmianie,
nawet przy transmisjach do tego samego układu scalonego. Stąd stosuje się przeważnie dwie
metody zapisu/odczytu danych:
" W przypadku prostych układów (o jednym typie danych i niezależnym sygnale zapisu
danych) możliwe jest przepełnienie zawartości odbiorczego rejestru szeregowego.
Zatem w układzie po przesłaniu do niego dowolnej ilości bitów zostaje zapamiętane tylko
N ostatnich bitów (N  długość danych dla danego układu) w rejestrze odbiorczym.
Wysyłany po transmisji danych sygnał zapisu przepisze do wnętrza układu te N bitów.
Właściwość ta pozwala na zaokrąglenie w górę długości wysyłanego słowa do
wielokrotności liczby 8, co pozwala na korzystanie z interfejsu SPI mk, który jak
wiadomo operuje na danych 8-bitowych. W tym przypadku pierwsze bity są nieistotne,
gdyż nie są zapamiętywane. Jest ich 8n  N (gdzie n  wielokrotność 8 bitów, tak aby
zawsze 8n > N).
" Przy bardziej złożonych układach wprowadza się do formatu danych bit startu. Czyli
układ pomija kolejno przychodzące bity dopóki nie pojawi się pierwsza jedynka będąca
bitem startu. Po niej dane są ważne.
" Słowa sterujące są krotnością 8 bitów. Liczba wysyłanych bajtów zależy od typu rozkazu.
W interfejsie SPI stosuje się różne techniki adresowania układów peryferyjnych. Muszą
one uwzględnić fakt różnorodnych wymagań wynikających np. z obecności wielu
niezależnych układów korzystających z tego samego portu transmisyjnego, konieczności
wysyłania rozkazów przed, w trakcie i po transmisji danych. Dwie najpopularniejsze to:
" Najczęściej spotykana w przypadku układów pojedynczych technika, polegająca na
wydzieleniu jednej linii adresującej układ (CS- chip select). Wprowadzenie tej linii w
stan aktywny (najczęściej niski) jest jednoznaczne z zaadresowaniem układu do udziału w
transmisji.
Mikrokontrolery i Mikrosystemy
130
" Kolejna technika polega na zawarciu adresu w przesyłanym ciągu danych. Gdy układ
odbiorczy stwierdzi zgodność adresu, to odbiera dane zawarte po adresie. Np. stosuje się
tę technikę w układach składających się z wielu niezależnie programowanych bloków, z
których każdy ma swój własny adres.
Obecnie produkuje się coraz szerszą gamę układów peryferyjnych wyposażonych w
interfejsy szeregowe standardu SPI oraz kompatybilne z nim. Wśród nich można wymienić
między innymi następujące układy:
" mikrokontrolery,
" przetworniki A/C (np. AD7866  12-bitowy, LTC2400  24-bitowy),
" przetworniki C/A (np. AD7394  12-bitowy, LTC1650  16-bitowy),
" cyfrowe potencjometry (np. AD5260  256 pozycji, 20k, 59k, 200k, 12V; AD5235  1024
pozycji z pamięcią nieulotną, 25k, 250k; MCP42100  256 pozycji, 100k),
" multipleksery analogowe (np. ADG708  multiplekser 8:1 typu RF/Video CMOS,
LTC1391  8 kanałowy MUX),
" czujniki temperatury (np. ADT7320  10-bitowy),
" sterowniki interfejsów UART, CAN, itd. (np. MAX3100  SPI na UART, MCP2510 SPI
na CAN 2.0B),
" zegary czasu rzeczywistego (np. MAX6902),
" generatory sygnałów (np. DS1050  5-bitowy generator sygnału PWM o częstotliwości
1kHz),
" pamięci EEPROM (np. 25LC16  16Kbits (x8)),
" pamięci FLASH (np. AT45D081  1Mbits),
" sterowniki LCD (np. STE2001  wymiar ekranu 65x128),
" sterowniki LED (np. MAX6950  5 cyfr, MAX6952  macierz 5x7, MAX7221  8 cyfr,
NLSF595 firmy ON Semiconductor  kontroler trzech diod czerwonej, zielonej i
niebieskiej),
Obecnie coraz więcej specjalizowanych układów peryferyjnych jest wyposażanych w
procesor (mk), zatem i one w naturalny sposób posiadają interfejs SPI (np. ADuC812  mk
oparty na mk 8052).
5.1. Szeregowe pamięci EEPROM
Pamięci nieulotne EEPROM i FLASH z szeregowym wejściem i wyjściem danych są
coraz częściej stosowane w mse ze względu na możliwość programowania ich zawartości w
układzie, w którym pracują (in-circuit programming). Przechowują one dane, które po zaniku
napięcia zasilania nie mogą ulec skasowaniu. Dane te najczęściej są wykorzystywane do
indywidualnej linearyzacji charakterystyk czujników, zbierania danych pomiarowych,
parametryzacji wbudowanych algorytmów itd. Ich zaletą, oprócz niskiej ceny i małych
rozmiarów obudowy, jest standardowe napięcie zasilania równe zwykle +5V lub +3V. Układy
te mają zwykle wbudowaną przetwornicę napięcia i nie wymagają do programowania i
kasowania zewnętrznego napięcia programującego. Ponadto posiadają własną automatykę,
tzn. odczyt, zapis, kasowanie oraz funkcje związane z ochroną danych są obsługiwane za
pomocą odpowiednich rozkazów wprowadzanych do układu i przez niego interpretowanych.
Spotykane pamięci szeregowe EEPROM mają pojemność: 1Kbit, 2Kbit, 4Kbit, 8Kbit,
16Kbit, 32Kbit i 64Kbit. Pamięć jest zorganizowana bajtowo (x8), dwubajtowo (x16) i
bajtowo lub dwubajtowo (x8 lub x16  wybór przez użytkownika).
Mikrokontrolery i Mikrosystemy
131
W praktyce spotyka się trzy podstawowe odmiany pamięci EEPROM z szeregowym
wejściem i wyjściem danych:
" układy z interfejsem SPI,
" układy pracujące z niestandardowym protokołem wymiany danych (przeważnie
standard przemysłowy Microwire),
" układy z interfejsem I2C.
Do sterowania pamięci EEPROM z szeregowym dostępem stosuje się powszechnie dwie
metody:
" sterowanie przy użyciu linii portów we/wy mk (dla pamięci z niestandardowym
protokołem wymiany danych),
" sterowanie przez interfejs komunikacji szeregowej (dla pamięci z interfejsem SPI i I2C).
Zasadniczą wadą pamięci EEPROM jest długi czas zapisu informacji, jak i kasowania
układu wynoszący typowo od 2ms do 5ms, a nawet 10ms.
5.1.1. Szeregowe pamięci EEPROM z interfejsem SPI
Zaletą pamięci szeregowych EEPROM z interfejsem SPI jest możliwość ich
bezpośredniego podłączenia do interfejsu SPI mk. Zatem obsługa tych pamięci przez mk
może odbywać się w trybie przerwaniowym. W tym trybie mk może realizować inne zadania,
podczas gdy trwa transmisja. Jc jest angażowana tylko przy odczycie lub zapisie danych do
rejestru szeregowego interfejsu SPI. Powiadomienie jc o zakończeniu transmisji bajtu odbywa
się za pomocą przerwania od interfejsu SPI, który wpierw musi być właściwie
skonfigurowany. Kolejną zaletą jest fakt, iż konwersja równoległo-szeregowa (wpis danej
przez jc do bufora szeregowego i wysłanie jej szeregowo przez wyjście danych interfejsu) i
szeregowo-równoległa (szeregowy odczyt danej z wejścia interfejsu do bufora i odczyt jej
przez jc z tego bufora) danych odbywa się sprzętowo, a nie programowo jak ma to miejsce
przy zastosowaniu popularnych pamięci EEPROM, umówionych w kolejnym podrozdziale, z
niestandardowym interfejsem Microwire.
Pamięci szeregowe EEPROM i interfejsem SPI zostaną przedstawione na przykładzie
układu 25C080 firmy Microchip. Jest to 8Kbitowa pamięć o architekturze bajtowej (1024x8
bitów). Dostęp do pamięci, jak i jej sterowanie odbywa się za pomocą interfejsu SPI, który
składa się z linii: sygnał zegara SCK, sygnał danych wejściowych SI oraz sygnał danych
wyjściowych SO. Dostęp do urządzenia jest kontrolowany poprzez sygnał wyboru układu CS
(Chip Select). Istnieje możliwość wstrzymania komunikacji z pamięcią poprzez sygnał
HOLD.
Układ ten ma następujące właściwości:
" Niski pobór mocy: prąd podczas zapisu maksymalnie 3mA, prąd podczas odczytu typowo
500A, prąd spoczynkowy typowo 500nA.
" Organizacja pamięci: 1024x8 bity.
" 16 bajtowa strona.
" Czas cyklu zapisu maksymalnie 5ms.
" Wewnętrzne automatyczne cykle kasowania i zapisu.
" Ochrona zapisu bloku: ochrona żadnej,1/4,1/2 lub całej tablicy.
" Wbudowana ochrona zapisu: ochrona danych podczas włączania/wyłączania układu,
zatrzask umożliwiający zapis, pin ochrony przed zapisem.
Mikrokontrolery i Mikrosystemy
132
" Sekwencyjny odczyt danych.
" Wysoka niezawodność: wytrzymałość 1M cykli kasowania/zapisu, czas przechowywania
danych > 200 lat, ochrona wejść cyfrowych przed przepięciami typu ESD.
" Obudowa 8-pinowa PDIP oraz SOIC (rys. 5.1).
Rys. 5.1. Wyprowadzenia układu 25C080 firmy Microchop
Na rys. 5.1 pokazano wyprowadzenia pamięci EEPROM. Opis tych wyprowadzeń zebrano w
tabeli 5.1.
Tabela. 5.1. Opis wyprowadzeń układu 25C080 firmy Microchip
Nazwa Obudowa Obudowa Funkcja
pinu PDIP SOIC
CS 11 Wejście wyboru układu
SO 2 2 Wyjście danych szeregowych
WP 3 3 Wyprowadzenie do ochrony zapisu
Vss 4 4 Uziemienie
SI 5 5 Wejście danych szeregowych
SCK 6 6 Wejście szeregowe zegara
HOLD 7 7 Wyprowadzenie pauzujące transmisję
Vcc 8 8 Zasilanie
Rys. 5.2. Schemat blokowy układu 25C080 firmy Microchip
Mikrokontrolery i Mikrosystemy
133
Na rys. 5.2 pokazano schemat blokowy układu 25C080. Jak widać składa się on z dwóch
części: pierwszą część stanowi zespół bloków związanych z interfejsem SPI i sterowaniem
pamięcią. Są to bloki: we/wy układ sterujący (I/O Control Logic), rejestr statusu, układ
sterujący pamięcią (Memory Control Logic), generator wysokiego napięcia (HV Generator),
układ kontroli amplitudy przy odczycie/zapisie (Sense Amp. R/W Control). Druga część to
pamięć "właściwa". Składa się ona z dekodera wierszy (X Dec) i dekodera kolumn (Y Dec),
rejestru zatrzaskowego stron (Page Latches) i matrycy komórek EEPROM (EEPROM Array).
Zastosowania i funkcje pinów układu są następujące:
" Linia CS służy do uaktywnienia pamięci przez układ nadrzędny z nią współpracujący (np.
mk). Uaktywnienie pamięci dokonuje się poprzez wystawienie na wejście CS niskiego
poziomu sygnału. Wysoki poziom na tej linii dezaktywuje układ. Podczas inicjacji bądz
trwania cyklu programowania wysoki stan sygnału CS nie powoduje przerwania procesu
zapisu/odczytu. Zostaje on dokończony, po czym następuje dezaktywacja układu pamięci
i przejście w stan czuwania. W tym trybie pracy wyjście SO przechodzi w stan wysokiej
impedancji umożliwiając innym układom korzystanie z magistrali SPI. Zmiana stanu na
wejściu CS z niskiego na wysoki po zakończonej sekwencji wprowadzania rozkazów do
pamięci inicjuje wewnętrzny cykl zapisu.
" Wyjście SO jest używane w celu wysyłania danych z układu pamięci 25C080. Podczas
cyklu odczytu dane są wystawiane na to wyjście na opadające zbocze sygnału
zegarowego.
" Wejście WP wraz z bitem WPEN rejestru statusu służą do blokady zapisu rejestru statusu
pamięci. Ochronę tę uzyskuje się, gdy na linii WP wystawiony jest niski poziom, zaś
bitowi WPEN przypisana jest jedynka. W przypadku gdy bit WPEN jest ustawiony, to
pojawienie się niskiego poziomu na linii WP podczas sekwencji zapisu rejestru statusu
spowoduje przerwanie tej operacji. Jeżeli zaś wewnętrzny cykl zapisu został rozpoczęty
wszelkie zmiany na linii WP nie wpływają na kontynuację wykonywania operacji zapisu.
Gdy bit WPEN jest wyzerowany funkcja linii WP jest nieaktywna. Ustawienie bitu
WPEN odblokowuje funkcję wyprowadzenia WP.
" Wejście SI jest używane do szeregowego wprowadzania instrukcji, adresów oraz danych
z urządzenia nadrzędnego do pamięci. Dane na SI zatrzaskiwane są na narastające zbocze
sygnału zegarowego.
" Sygnał wejściowy SCK służy do synchronizacji komunikacji pomiędzy urządzeniem
nadrzędnym, a pamięcią. Narastające zbocze zegara zatrzaskuje (próbkuje) dane
wprowadzane na wejściu SI, zaś opadające wystawia dane na wyjściu SO.
" Wejście HOLD służy do wstrzymania transmisji do pamięci, bez konieczności
powtarzania całego cyklu transmisyjnego od nowa. W celu wstrzymania transmisji na
pinie HOLD powinien być stan niski w momencie, gdy sygnał zegara SCK jest również w
stanie niskim. W innym przypadku zawieszenie transmisji zostanie wykonane przy
kolejnym przejściu sygnału SCK z poziomu wysokiego do niskiego. Istotne jest, aby
układ pamięci pozostawał aktywny podczas wstrzymywania transmisji. Gdy transmisja
zostaje zawieszona linie SI, SCK oraz SO przechodzą w stan wysokiej impedancji.
Wymuszenie na linii HOLD wysokiego poziomu podczas niskiego poziomu sygnału
zegara powoduje wznowienie transmisji.
Układ 25C080 zawiera 8 bitowy rejestr instrukcji. Aby układ był aktywny i przyjmował
rozkazy/dane na linii CS musi panować stan niski, zaś na linii HOLD stan wysoki. Aby
można było dokonywać operacji zapisu do tablicy pamięci na linii WP powinien być stan
wysoki.
Mikrokontrolery i Mikrosystemy
134
Tabela 5.2 zawiera listę i formaty instrukcji dostępnych dla układu 25C080. We
wszystkich instrukcjach, adresach czy danych pierwszy jest przesyłany najbardziej znaczący
bit MSB, a jako ostatni bit LSB. Wszelkie instrukcje, adresy, czy dane przesyłane są do
pamięci paczkami 8-bitowymi, co pozwala na bezpośrednie stosowanie w tym celu interfejsu
SPI mk.
Tablela 5.2. Zestaw instrukcji sterujących układem 25C080
Nazwa Format instrukcji Opis
instrukcji
READ 0000 0011 Odczyt danych z tablicy pamięci od wybranego adresu
WRITE 0000 0010 Zapis danych do tablicy pamięci od wybranego adresu
WRDI 0000 0100 Zerowanie zatrzasku zezwolenia zapisu (niedostępne
operacje zapisu )
WREN 0000 0110 Ustawienie zatrzasku zezwolenia zapisu (dostępne
operacje zapisu)
RDSR 0000 0101 Odczyt rejestru statusu
WRSR 0000 0001 Zapis rejestru statusu
Dane są próbkowane na pierwsze narastające zbocze sygnału zegara SCK po wymuszeniu
na linii CS niskiego poziomu. W przypadku, gdy sygnał zegara na magistrali SPI jest
współdzielony przez inne urządzenia peryferyjne, użytkownik może wprowadzić pamięć
25C080 w stan wstrzymania  HOLD poprzez wymuszenie niskiego stanu na linii HOLD. Po
zmianie poziomu sygnału na tej linii z niskiego na wysoki następuje kontynuacja wstrzymanej
transmisji.
Poniżej zestawiono opis rozkazów zawartych w tabeli 5.2:
" Sekwencja odczytu READ rozpoczyna się od wyboru pamięci poprzez wymuszenie na
linii CS stanu niskiego. Następnie wysyłana jest 8-bitowa instrukcja odczytu oraz 16-
bitowy adres, gdzie sześć najbardziej znaczących bitów adresu nie jest brane pod uwagę.
Po prawidłowej transmisji instrukcji i adresu, dane umieszczone pod wybranym adresem
są wystawiane szeregowo na wyjściu SO. Po każdorazowym wysłaniu bajta danych
wewnętrzny wskaznik adresu jest automatycznie inkrementowany, aby wskazywać na
kolejną daną w pamięci. Kiedy osiągnie adres 03FFH następuje zmiana jego wskazania na
adres 0000H. Operacja transmisji sekwencji odczytu jest kończona na narastającym
zboczem sygnału CS.
Rys. 5.3. Przebieg czasowy rozkazu READ
" Przed jakąkolwiek próbą zapisu danych do układu rozkazem WRITE, zatrzask zezwolenia
zapisu musi być ustawiony poprzez wykonanie instrukcji WREN. Sekwencja zapisu tej
Mikrokontrolery i Mikrosystemy
135
instrukcji sprowadza się do wybrania układu niskim poziomem sygnału CS oraz wysłania
kodu WREN do układu. Po transmisji 8 bitów tej instrukcji, poziom sygnału na linii CS
musi zostać ustawiony z powrotem w stan wysoki, co w rezultacie powoduje ustawienie
zatrzasku zezwolenia zapisu. Próba rozpoczęcia transmisji zaraz po wysłaniu instrukcji
WREN, bez zmiany stanu sygnału na linii CS pomiędzy tymi operacjami, nie powiedzie
się ze względu na niewłaściwe ustawienia zatrzasku zezwolenia zapisu. W momencie
prawidłowego ustawienia tego zatrzasku, użytkownik może rozpocząć operację zapisu
danych do układu wcześniej wymusiwszy na pinie CS stan niski. Sekwencja zapisu
sprowadza się do wysłania instrukcji zapisu WRITE, 16-bitowego adresu z sześcioma
najbardziej znaczącymi bitami nie branymi pod uwagę oraz danej przeznaczonej do zapisu
pod przesłany adres. Przed wymaganym cyklem zapisu do pamięci może być wysłanych
16 bajtów danych. Jedynym ograniczeniem w tym przypadku jest to, iż wszystkie bajty
muszą mieścić się w obszarze jednej strony pamięci. Adres strony zaczyna się od XXXX
XXXX XXXX 0000 i kończy na XXXX XXXX XXXX 1111. W przypadku kiedy
wewnętrzny licznik adresu osiągnie wartość graniczną, wskazuje on z powrotem na
pierwszy adres strony i następuje nadpisywanie danych na już wcześniej zachowane. Aby
zakończyć sekwencję zapisu danych do tablicy pamięci sygnał na wyprowadzeniu CS
powinien zostać ustawiony w stan wysoki tuż po otrzymaniu ostatniego najmniej
znaczącego bitu n-bajtowej danej. W przypadku gdy sygnał CS zostanie wcześniej
ustawiony w stan wysoki operacja zapisu nie zostanie skompletowana. Podczas trwania
sekwencji zapisu rejestr statusu może być odczytywany w celu sprawdzenia bitów WPEN,
WIP, WEL, BP1 oraz BP0. Podczas trwania cyklu zapisu nie jest możliwy odczyt tablicy
lokacji pamięci. Po zakończeniu tego cyklu zatrzask zezwolenia zapisu jest zerowany.
Rys. 5.4. Przebieg czasowy rozkazu WRITE dla zapisu pojedynczego bajta
Rys. 5.5. Przebieg czasowy rozkazu WRITE dla zapisu wielu bajtów
Mikrokontrolery i Mikrosystemy
136
" Instrukcja WREN (Write Enable) zezwala na zapis do pamięci. Jej przebieg czasowy
pokazano na rys. 5.6.
Rys. 5.6. Przebieg czasowy rozkazu WREN
" Instrukcja WRDI (Write Disable) blokuje zapis do pamięci. Przebiegi czasowe tej
instrukcji przedstawiono na rys. 5.7.
Rys. 5.7. Przebieg czasowy rozkazu WRDI
" Instrukcja RDSR odczytu rejestru statusu (Read Status Register) zapewnia dostęp do
rejestru statusu. Rejestr ten można odczytać w każdej chwili, nawet podczas cyklu zapisu.
Rys. 5.8. Przebieg czasowy rozkazu RDSR
" Instrukcja WRSR zapisu rejestru statusu (Write Status Register) pozwala
użytkownikowi na wybór jednego z czterech poziomów ochrony tablicy pamięci
Mikrokontrolery i Mikrosystemy
137
EEPROM. Odbywa się to poprzez zapis bitów BP0 i BP1 w rejestrze statusu. Tablica
pamięci podzielona jest na cztery segmenty. Użytkownik ma możliwość ochrony zapisu
żadnego, jednego, dwóch lub wszystkich segmentów tablicy.
Rys. 5.9. Przebieg czasowy rozkazu WRSR
Format rejestru statusu jest następujący:
7 654321 0
WPEN XXXBP1 BP0 WEL WIP
gdzie:
Bit WIP (Write-in-Process  zapis w trakcie) wskazuje czy układ pamięci jest w trakcie
operacji zapisu, czy nie. WIP =1  pamięć w trakcie operacji zapisu, zaś WIP =0 
żadna operacja zapisu nie jest przeprowadzana. Bit WIP jest bitem przeznaczonym
tylko do odczytu.
Bit WEL (Write Enable Latch  zatrzask zezwolenia zapisu) wskazuje na status zatrzasku
zezwolenia zapisu. WEL =1  zezwolenie zapisu do tablicy, WEL =0  zakaz
zapisu do tablicy. Stan tego bitu może być zawsze zmieniony poprzez polecenia
WREN lub WRDI. Bit WEL jest bitem przeznaczonym tylko do odczytu.
Bity BP0 i BP1 (Block Protection  ochrona bloku) informują, który blok obecnie jest
chroniony przed zapisem (patrz tabela 5.3). Stan tych bitów jest nieulotny i może
być zmieniany przez użytkownika poprzez wykonanie instrukcji WRSR.
Bit WPEN (Write Protect Enable  zezwolenie ochrony zapisu) jest nieulotnym bitem
dostępnym jako bit zezwalający dla wejścia WP.
Tabela 5.3. Znaczenie bitów BP0 i BP1
BP1 BP0 Adresy Tablicy Chronione przed Zapisem
0 0 brak
0 1 wyższa ćwiartka
(0300H-03FFH)
1 0 wyższa połówka
(0200H-03FFH)
1 1 wszystkie
(0000H-03FFH)
Wejście WP (Write Protect  ochrona zapisu) i bit rejestru statusu WPEN służą do
sprzętowej ochrony pamięci przed zapisem. Ochrona ta jest aktywna jeśli wyprowadzenie
WP jest w stanie niskim zaś bit WPEN =1. Dotyczy ona ochrony nieulotnych bitów rejestru
statusu.
Mikrokontrolery i Mikrosystemy
138
Układy pamięci 25C080 zawierają zatrzask zezwolenia zapisu. Zatrzask musi być
ustawiony przed tym, jak dowolna operacja zapisu zostanie  wewnętrznie zakończona.
Instrukcja WREN ustawia ten zatrzask, natomiast instrukcja WRDI go zeruje. Poniżej została
przedstawiona lista warunków, pod którymi nastąpi wyzerowanie zatrzasku:
" włączenie zasilania,
" wykonanie instrukcji WRDI zakończone sukcesem,
" wykonanie instrukcji WRSR zakończone sukcesem,
" wykonanie instrukcji WRITE zakończone sukcesem.
Czyli przed każdym zapisem danych do pamięci należy ustawić ten zatrzask instrukcją
WREN.
Zastosowano następujące środki ochrony tablicy pamięci EEPROM przed przypadkowymi
wpisami:
" zatrzask zezwolenia zapisu jest zerowany natychmiast po włączeniu zasilania,
" w celu ustawienia zatrzasku zezwolenia zapisu wymagana jest odpowiednia instrukcja,
" zatrzask zezwolenia zapisu jest zerowany zaraz po zakończonym cyklu zapisu bajtu,
strony lub statusu rejestru,
" sygnał na linii CS musi być ustawiony w stan wysoki po odpowiedniej liczbie cykli
zegara w celu rozpoczęcia wewnętrznego cyklu zapisu,
" próba dostępu do tablicy podczas wewnętrznego cyklu zapisu jest odrzucana, zaś
programowanie jest nadal kontynuowane.
W tabeli 5.4 zestawiono stan ochrony bloków pamięci i rejestru statusu w zależności od
bitów WPEN i WEL oraz stanu na linii WP.
Tablica 5.4. Macierz Funkcjonalności Ochrony Zapisu
WPEN WP WEL Bloki Chronione Bloki Niechronione Rejestr Statusu
x x 0 chroniony chroniony chroniony
0x 1 chroniony zapisywalne zapisywalny
1 low 1 chroniony zapisywalne chroniony
x high 1 chroniony zapisywalne zapisywalny
Układ pamięci 25C080 po włączeniu zasilania przyjmuje następujący stan:
" układ jest w trybie czuwania, mały pobór mocy CS=1,
" zatrzask zezwolenia zapisu jest wyzerowany,
" wyjście SO jest w stanie wysokiej impedancji,
" przejście ze stanu wysokiego do niskiego na linii CS powoduje wejście układu w stan
aktywny.
5.1.2. Szeregowe pamięci EEPROM z interfejsem Microwire
Przykładem pamięci EEPROM tego typu jest rodzina układów 93x4/6/7/8 produkowana
między innymi przez takie firmy, jak Microchip, National Semiconductors, Catalyst,
STMicroelectronics. Protokół wymiany danych bazuje na standardzie Microwire, który nie
jest zgodny z żadnym standardem międzynarodowym. Jednak wszystkie pamięci tej rodziny
wykorzystują identyczny zbór poleceń dwójkowych potrzebnych do kasowania,
programowania i odczytu ich zawartości. Zatem są układami popularnymi, często
Mikrokontrolery i Mikrosystemy
139
stosowanymi w mse. Są dostępne w odmianach o pojemności 1Kbit (128x8 lub 64x16), 2Kbit
(256x8 lub 128x16), 4Kbit (512x8, 256x16), 8Kbit (1024x8 lub 512x16) i 16Kbit (2048x8 lub
1024x16).
Pamięci tego typu zostaną przedstawione na przykładzie układu 93C46B firmy Microchip.
Jest to pamięć o pojemności 1Kbit i organizacji 16-bitowej (64x16 bitów). Jest umieszczona
w obudowie ośmionóżkowej.
Cechy układu:
" pojedyncze zródło zasilania + 5V,
" technologia Low Power CMOS: 1 mA prąd pracy (typowo), 1A prąd czuwania
(maksymalnie),
" organizacja 64x16 bitów,
" wewnętrzne taktowane dla cyklów ERASE i WRITE,
" automatyczne ustawienie stanu ERAL przed cyklem WRAL,
" układ protekcji danych w trakcie włączenia/wyłączenia napięcia zasilania,
" standardowy 3-przewodowy szeregowy interfejs,
" wystawianie sygnału statusu urządzenia podczas cyklów ERASE/WRITE,
" posiada sekwencyjną funkcję READ,
" zapewnione 1000000 cykli kasowania i zapisu,
" zachowanie danych w pamięci > 200 lat,
" obudowy: 8-pinowe PDIP/SOIC i 8-pinowa TSSOP.
Rys. 5.10. Schemat blokowy układu 93C46B
Na rys. 5.10 pokazano schemat blokowy tej pamięci. Składa się ona z dwóch części.
Pierwszą część stanowi interfejs szeregowy, w którego skład wchodzą układ kontrolny
(Memory Decode Logic), rejestr danych (Data Register), bufor wyjściowy (Output Buffer) i
generator sygnału zegarowego (Clock Generator). Druga część to  właściwa pamięć danych.
Składa się ona z licznika adresu (Address Counter), dekodera adresu (Address Decoder) i
pamięci EEPROM (Memory Array).
Mikrokontrolery i Mikrosystemy
140
Tabela 5.5. Opis funkcji pinów układu 93C46B (rys. 5.11)
Nazwa Funkcja
CS Wybór urządzenia
CLK Zegar dla danych szeregowych
DI Wejście danych szeregowych
DO Wyjście danych szeregowych
Vss Masa
NC Bez połączenia
Vcc Napięcie zasilania
Rys. 5.11. Wyprowadzenia układu 93C46B
Zastosowania i funkcje pinów układu są następujące:
" Wysoki poziom sygnału na linii CS wybiera (uaktywnia) urządzenie, natomiast niski
poziom dezaktywuje urządzenie i wymusza tryb oczekiwania. Dezaktywacja w trakcie
cyklu programującego, nie spowoduje jego przerwania  cykl zostanie kontynuowany, aż
do zakończenia, niezależnie od stanu linii wejściowej CS. Przejście linii CS w stan niski
podczas cyklu programującego, spowoduje przejście urządzenia do trybu oczekiwania,
zaraz po zakończeniu tego cyklu. Sygnał CS musi być w stanie niskim przynajmniej przez
250ns (TCSL) pomiędzy kolejnymi instrukcjami. Jeżeli CS jest w stanie niskim,
wewnętrzny układ kontrolny jest trzymany w stanie RESET.
" Zegar CLK jest używany do synchronizowania komunikacji pomiędzy urządzeniem
sterującym, a układem 93C46B. Bity kodu, adresu i danych wejściowych są
wprowadzane, a bity danych wyjściowych wyprowadzane narastającym zboczem
zegarowym. Sygnał CLK może być wstrzymany w każdym momencie transmisji, po
czym może nastąpić jego kontynuacja. Właściwość ta pozwala na swobodne
przygotowanie kodu programującego, adresu i danych przez mk. Stan linii CLK jest
nieistotny, jeżeli CS jest w stanie niskim.
" Wejście danych DI jest używane do wprowadzania bitu START, kodów rozkazów,
adresów i danych. Dane te są synchronizowane sygnałem zegarowym CLK.
" Wyjście danych DO używa się do wyprowadzania danych wyjściowych, zgodnie z
taktami sygnału zegarowego CLK. Linię tę stosuje się do odczytu statusu READY/BUSY
podczas cyklu ERASE i WRITE. Informacja ta jest dostępna na pinie DO, jeżeli linia CS
została ustawiona w stan wysoki, po stanie niskim trwającym przez czas TCSL, i
zainicjowano operacje ERESE lub WRITE.
Mikrokontrolery i Mikrosystemy
141
Tabela 5.6. Lista instrukcji sterujących układ 93C46B
Instrukcja SB Kod Adres Dane Dane Cykle
wejściowe wyjściowe zegara CLK
ERASE 1 11 A5 A4 A3 A2 A1 A0 -- 9
(RDY/BSY)
ERAL 1 00 1 0 X X X X -- (RDY/BSY) 9
EWDS 1 00 0 0 X X X X -- High-Z 9
EWEN 1 00 1 1 X X X X -- Hihg-Z 9
READ 1 10 A5 A4 A3 A2 A1 A0 -- D15-D0 25
WRITE 1 01 A5 A4 A3 A2 A1 A0 D15  D0 (RDY/BSY) 25
WRAL 1 00 0 1 X X X X D15  D0 25
(RDY/BSY)
Instrukcje, adresy i dane są wprowadzane na pin DI na narastające zbocze sygnału zegara
CLK dopiero jak zostanie wykryty bit START. Należy zawsze wprowadzić odpowiednią ilość
impulsów zegarowych dla danego rozkazu (patrz tabela 5.6). Przed pojawieniem się tego bitu
dane wejściowe na linii DI są ignorowane. Linia DO jest zazwyczaj w stanie wysokiej
impedancji, z wyjątkiem odczytu danych z urządzenia, oraz sprawdzania statusu
READY/BUSY podczas operacji programowania. Podczas operacji ERASE/WRITE status
ten sprawdza się przez odpytywanie pinu DO. Stan niski na tym pinie oznacza, że
programowanie jest w toku. Pojawienie się stanu wysokiego na linii DO świadczy o
zakończeniu operacji kasowania/zapisu i gotowości układu do przyjęcia kolejnego rozkazu.
Gdy na linii CS pojawi się opadające zbocze to pin DO wchodzi w stan wysokiej impedancji.
Podczas włączenia zasilania (power-up), wszystkie tryby programowania, są zablokowane
dopóki Vcc nie osiągnie poziomu większego niż 3,8V. Podczas wyłączania napięcia zasilania
(power-down), obwód ochrony danych zatrzymuje wszystkie tryby, gdy Vcc spadnie poniżej
3,8V.
Po włączeniu zasilania, urządzenie automatycznie znajduje się w trybie EWDS. (blokada
zapisu i kasowania pamięci). Stąd aby mogła być wykonana instrukcja ERASE lub WRITE,
najpierw należy odblokować pamięć wysyłając do układu instrukcję EWEN. Odczyt z
pamięci jest zawsze możliwy.
Zastosowanie instrukcji zawartych w tabeli 5.6 jest następujące:
" Instrukcja ERASE wymusza na wszystkich bitach danych o podanym adresie, logiczny
stan  1 . Cykl rozpoczyna się narastającym zboczem zegarowym, ostatniego bitu adresu.
Linia DO wskazuje status READY/BUSY urządzenia, jeżeli na linii CS jest stan wysoki,
po zatwierdzeniu instrukcji ujemnym impulsem przynajmniej 250ns na linii CS.
Rys. 5.12. Przebiegi czasowe dla instrukcji ERASE układu 93C46B
Mikrokontrolery i Mikrosystemy
142
" Instrukcja ERAL (usuń wszystko) kasuje całą pamięć, ustawiając wszystkie bity w stan
logiczny  1 . Cykl ERAL jest identyczny z cyklem ERASE.
Rys. 5.13. Przebiegi czasowe dla instrukcji ERAL układu 93C46B
" Instrukcja EWDS powoduje zablokowanie kasowania/zapisu do pamięci (wprowadzenie
układu w tryb EWDS). Odczyt z tej pamięci jest zawsze możliwy.
Rys. 5.14. Przebiegi czasowe dla instrukcji EWDS układu 93C46B
" Instrukcja EWEN odblokowuje możliwość kasowania/zapisu. Powinno ją się wykonać
po włączeniu zasilania, aby wyjść z trybu EWDS lub w celu odblokowania
kasowania/zapisu zablokowanego instrukcją EWDS.
Rys. 5.15. Przebiegi czasowe dla instrukcji EWEN układu 93C46B
" Instrukcja READ (czytaj) wysyła szeregowo dane spod zaadresowanego obszaru
pamięci, na pin DO. Bit  stucznego zera rozpoczyna 16-bitowe słowo wyjściowe. Bity
danych wyjściowych są wystawiane na narastające zbocze zegara CLK i są utrzymywane
przez określony czas opóznienia (TPD). Sekwencyjne czytanie jest możliwe jeżeli linia CS
jest trzymana na wysokim poziomie.
Mikrokontrolery i Mikrosystemy
143
Rys. 5.16. Przebiegi czasowe dla instrukcji READ układu 93C46B
" Po instrukcja WRITE (wpisz) przesyłanych jest 16-bitów danych, które zostają wpisane
pod określony adres. Po ostatnim bicie danych wprowadzonych na pin DI, rozpoczyna się
tryb samo-taktowanego cyklu auto-usuwania (auto-erese) i programowania. Linia DO
wskazuje status READY/BUSY urządzenia, jeżeli na linii CS jest stan wysoki, po
zatwierdzeniu instrukcji ujemnym impulsem przynajmniej 250ns na linii CS.
Rys. 5.17. Przebiegi czasowe dla instrukcji WRITE układu 93C46B
" Instrukcja WRAL (WRITE ALL) wypełnia całą pamięć daną określoną w komendzie.
Cykl WRAL jest całkowicie samo-taktowalny i zaczyna się wraz z narastającym zboczem
ostatniego bitu danych. Komenda WRAL zawiera automatyczny cykl ERAL, dlatego
instrukcja WRAL nie wymaga, aby wcześniej wykonano instrukcję ERAL.
Kasowanie/zapis pamięci muszą być odblokowane. Linia DO wskazuje status
READY/BUSY urządzenia, jeżeli na linii CS jest stan wysoki, po zatwierdzeniu instrukcji
ujemnym impulsem przynajmniej 250ns na linii CS.
Rys. 5.18. Przebiegi czasowe dla instrukcji WRAL układu 93C46B
Mikrokontrolery i Mikrosystemy
144
5.2. Zewnętrzne przetworniki analogowo-cyfrowe (A/C)
Jak wspomniano w podrozdziale 2.3.2 przetworniki umieszczone w strukturze mk nie
posiadają rozdzielczości większej niż 10-bitowej oraz charakteryzują się stosunkowo dużym
błędem całkowitym. Stąd, gdy zależy nam na dokładnych pomiarach napięcia musimy
korzystać ze znacznie lepszych zewnętrznych przetworników A/C, które z reguły wyposażone
są w interfejs SPI. Przetworniki te mają rozdzielczość od 8 bitów, aż do 24 bitów (typowe
rozdzielczości to: 8, 10, 12, 14, 16, 24 bity). Przy czym przetworniki o większej
rozdzielczości korzystają z metody sigma-delta, pozostałe przeważnie bazują na metodzie
SAR.
Zewnętrzne przetworniki A/C sterowane interfejsem SPI zostaną przedstawione na
przykładzie układu AD7866 firmy Analog Devices.
AD7866 jest szybkim, o niskim poborze mocy, podwójnym, 12-bitowym przetwornikiem
analogowo-cyfrowym z pojedynczym zasilaniem, operującym w zakresie napięć zasilania od
2,7V do 5,25V. Działając z zasilaniem 5V lub 3V AD7866 jest zdolny do osiągnięcia
prędkości transmisji danych (przepustowości) 1MSPS (miliona próbek na sekundę) przy
taktowaniu zegarem o częstotliwości 20MHz.
Rys. 5.19. Schemat blokowy układu AD7866 firmy Analog Devices
Układ AD7866 zawiera w sobie dwa śledząco-podtrzymujące wzmacniacze, dwa
przetworniki analogowo-cyfrowe działające na zasadzie SAR i dwa szeregowe wyjścia
oddzielne dla każdego przetwornika, przez które są wysyłane dane wyjściowe (rys. 5.19).
Urządzenie znajduje się w 20-nóżkowej obudowie typu TSSOP (rys. 5.20). Szeregowe
impulsy zegara wejściowego pobierają dane z urządzenia oraz zapewniają zródło impulsów
zegarowych potrzebnych do konwersji dla każdego z przetworników analogowo-cyfrowych.
Mikrokontrolery i Mikrosystemy
145
Zakres pomiarowy można ustawić w zakresie od 0V do VREF lub do 2* VREF. Układ AD7866
posiada własne wewnętrzne napięcie odniesienia 2,5V, które może w razie potrzeby zostać
zastąpione przez zewnętrzne napięcie odniesienia. Dodatkowo, każdy z przetworników może
być zasilany osobnym, indywidualnym napięciem odniesienia.
Rys. 5.20. Rozmieszczenie pinów układu AD7866
Układ AD7866 ma możliwość zmniejszenia poboru mocy w stanie spoczynku poprzez
wprowadzenie układu w stan uśpienia, co pozwala na znaczną oszczędność energii pomiędzy
konwersjami. W trakcie konwersji przy zasilaniu 3V i przepustowości 1MSPS, układ pobiera
maksymalnie 3,8mA. Przy zasilaniu 5V i przepustowości 1MSPS, pobór prądu wynosi do
4,8mA.
W tabeli 5.7 zawarto opis funkcji pełnionych przez piny układu AD7866.
Tabela 5.7.Opis funkcji pinów układu AD7866
Numer Symbol Funkcja
pinu
1 REF SELECT Wybór wewnętrznego lub zewnętrznego napięcia odniesienia.
Jeżeli nóżka jest przyłączona do GND, wówczas wewnętrzne
napięcie 2,5V jest używane jako napięcie odniesienia dla obu
przetworników (ADC A i ADC B). Dodatkowo, do nóżek VREF,
DCAPA, DCAPB muszą być przyłączone w odpowiedni sposób
kondensatory odsprzęgające. Jeżeli na nóżce REF SELECT
ustawiona jest logiczna jedynka, wówczas używane jest
zewnętrzne napięcie odniesienia na VREF. W takim przypadku do
pinów DCAPA i DCAPB są podłączone te kondensatory. Gdy nóżka
VREF jest zwarta do AGND i na REF SELECT ustawiony jest stan
niski, to każdy z przetworników (ADC A i ADC B) może
pracować z własnym napięciem odniesienia podawanym
odpowiednio poprzez nóżki DCAPA, DCAPB.
2, 9 DCAPA, DCAPB Do tych nóżek przyłącza się kondensatory sprzęgające do masy. Z
tych pinów można pobrać wewnętrzne napięcie odniesienia i
przyłożyć do reszty systemu. W zależności od polaryzacji na REF
SELECT i od konfiguracji VREF, nóżki mogą także być użyte do
dostarczenia oddzielnych napięć odniesienia dla każdego z
przetworników. Zakres zewnętrznego odniesienia jest zależny od
wybranego zakresu analogowego wejścia.
Mikrokontrolery i Mikrosystemy
146
3, 8 AGND Analogowa masa dla wszelkich analogowych sygnałów
wejściowych i zewnętrznych sygnałów odniesienia. Napięcia na
AGND i DGND powinny być na tym samym potencjale, i nie
mogą nawet na chwilę różnić się więcej niż 0,3V.
4, 5 VB2, VB1 Analogowe wejścia przetwornika B (ADC B). Analogowe kanały
wejściowe. Zakres na wejściu dla każdego kanału jest od 0V do
VREF lub do 2 * VREF w zależności od polaryzacji pinu RANGE w
trakcie występowania opadającego zbocza sygnału na CS.
6, 7 VA2, VA1 Analogowe wejścia przetwornika A (ADC A). Analogowe kanały
wejściowe. Zakres na wejściu dla każdego kanału jest od 0V do
VREF lub do 2 * VREF w zależności od polaryzacji pinu RANGE w
trakcie występowania opadającego zbocza sygnału na CS.
10 VREF Nóżka do której podłącza się napięcie odniesienia lub nóżka
służąca do wyboru zewnętrznego odniesienia. Wymaga ona
dołączenia kondensatora odprzęgającego. Nominalne napięcie
odniesienia wynosi 2,5V i jest wystawione na tym pinie. Jeżeli
wewnętrzne napięcie odniesienia ma zostać wykorzystane w
systemie, to musi ono zostać pobrane z pinu DCAPA albo DCAPB.
Nóżka ta jest także używana w powiązaniu z nóżką REF
SELECT, gdy dostarczane jest zewnętrzne napięcie odniesienia
do AD7866.
11 RANGE Nóżka zakresu wejścia analogowego i wyboru kodowania danych
na wyjściu. Polaryzacja na tej nóżce określa jaki będzie
wejściowy zakres napięć analogowych kanałów wejściowych
AD7866 i także określa wybór sposobu kodowania danych na
wyjściu. Na opadającym zboczu CS sprawdzana jest polaryzacja
na nóżce, aby określić zakres wejścia analogowego dla następnej
konwersji. Jeżeli z nóżką związany jest stan niski, to zakres
analogowego wejścia określony jest jako 0V do VREF i kodowanie
na wyjściu ustawiane jest jako bezpośrednie binarne (dla
następnej konwersji). Jeżeli z nóżką związany jest stan wysoki
gdy CS przechodzi do stanu niskiego, to zakres analogowego
wejścia wynosi 2* VREF i kodowanie na wyjściu ustawiane jest na
kod z uzupełnieniem do 2. Jednakże, jeżeli po opadającym zboczu
CS poziom na nóżce RANGE zmieni się na opadającym zboczu
ósmego sygnału zegara (SCLK), wówczas kodowanie na wyjściu
zmieni się na drugą opcję bez żadnej zmiany w zakresie
analogowego wejścia.
12 AVDD Analogowe napięcie zasilania, 2,7V do 5,25V. Jest to jedyne
napięcie zasilania dla wszystkich analogowych obwodów w
AD7866. Idealnie, napięcia AVDD i DVDD powinny być na tym
samym potencjale i nie mogą różnić się o więcej niż 0,3V nawet
w przypadku wystąpienia stananów przejściowych. Zasilanie te
powinno być odniesione do AGND.
13 DVDD Cyfrowe napięcie zasilania, 2,7V do 5,25V. Jest to napięcie
zasilania dla wszystkich cyfrowych obwodów w AD7866.
Idealnie, napięcia AVDD i DVDD powinny być na tym samym
potencjale i nie mogą różnić się o więcej niż 0,3V nawet w
Mikrokontrolery i Mikrosystemy
147
przypadku wystąpienia stananów przejściowych. Zasilanie te
powinno być odniesione do DGND.
14 DGND Cyfrowa masa. Punkt odniesienia dla wszystkich cyfrowych
obwodów w AD7866. Napięcia AGND i DGND powinny
(idealnie) być na tym samym potencjale, i nie mogą nawet
chwilowo różnić się więcej niż o 0.3V.
15,16 DOUTA, DOUTB Szeregowe wyjście danych. Dane wyjściowe dostarczane są na tą
nóżkę w sposób szeregowy. Bity są podawane na opadającym
zboczu sygnału SCLK. Dane pojawiają się jednocześnie na obu
nóżkach z obu przetworników. Strumień danych składa się z
jednego prowadzącego zera, po którym następują trzy bity
STATUS, a następnie 12 bitów danych konwersji. W danych
najpierw występuje bit MSB. Jeżeli na CS jest stan niski przez
następne 16 cykli SCLK po tym, gdy dane z konwersji zostały
wyprowadzone przez DOUTA lub przez DOUTB, wówczas dane z
innego przetwornika są podawane na nóżkę DOUT. Pozwala to, by
dane uzyskane z jednoczesnych konwersji obu przetworników
były zbierane szeregowo jedne po drugich tylko na DOUTA lub
tylko na DOUTB.
17 VDRIVE Wejście zasilania logiki. Napięcie przyłożone do tej nóżki
determinuje (określa) na jakim napięciu będzie działać interfejs,
czy na 3V, czy na 5V. To zasilanie powinno być odniesione do
DGND.
18 SCLK Zegar szeregowy. Szeregowe wejście zegara dostarcza sygnał
SCLK taktujący transmisję danych. Zegar ten jest także używany
jako zródło sygnałów zegarowych dla procesu konwersji.
19 CS Stan niski na tym wejściu uaktywnia układu.
20 A0 Wejście służące do wyboru kanału multiplekserów. Wejście te
używane jest do wyboru pary kanałów do jednoczesnej konwersji,
np. kanał 1 obu przetworników (A i B) lub kanał 2 obu
przetworników (A i B). Stan na tej nóżce sprawdzany jest na
opadającym zboczu CS. Jeżeli jest stan niski, następna konwersja
wykonana będzie na kanale 1 każdego przetwornika; jeżeli jest
wysoki, następna konwersja wykonana będzie na kanale 2
każdego przetwornika.
AD7866 posiada dwa przetworniki analogowo-cyfrowe. Każdy przetwornik składa się z
układu kontroli logiki, SAR i pojemnościowego przetwornika cyfrowo-analogowego C/A,
które są używane do dodawania i odejmowania stałych wielkości ładunków z próbkującego
kondensatora aby sprowadzić układ porównujący z powrotem do stanu równowagi. Rys.
5.21a pokazuje przetwornik analogowo-cyfrowy podczas fazy akwizycji (pobierania danych).
SW2 jest zwarty i SW1 jest w pozycji A, układ porównujący jest utrzymywany w stanie
równowagi, a próbkujący kondensator pobiera sygnał na VA1.
Mikrokontrolery i Mikrosystemy
148
a) b)
Rys. 5.21. Fazy pracy przetwornika A/C w układzie AD7866: a) faza akwizycji danych, b)
faza konwersji
Gdy przetwornik analogowo-cyfrowy rozpoczyna konwersję (patrz rys. 5.21b), SW2
otwiera się, a SW1 przestawi się w pozycję B powodując, że komparator będzie
niezrównoważony. Układ kontroli logiki i pojemnościowy przetwornik cyfrowo-analogowy
są wykorzystywane do dodania lub odjęcia stałych wielkości ładunku z próbkującego
kondensatora w celu sprowadzenia komparatora z powrotem do stanu równowagi. Gdy
komparator jest ponownie zrównoważony, konwersja kończy się. Układ kontroli logiki
generuje kod wyjściowy.
W tabeli 5.8 pokazano sposoby wyboru napięć odniesienia dla układu AD7866.
Tabela 5.8. Sposoby wyboru napięć odniesienia dla układu AD7866.
VREF1
Opcja odniesienia REF SELECT DCAPA i DCAPB2
wewnętrzne niski kondensator kondensator sprzęgający
sprzęgający
zewnętrzne przez VREF wysoki zewnętrzne kondensator sprzęgający
odniesienie
zewnętrzne przez niski AGND zewnętrzne odniesienie A i/lub
DCAPA i/lub DCAPB zewnętrzne odniesienie B
UWAGI:
1
Zalecana wartość kondensatora sprzęgającego = 100 nF.
2
Zalecana wartość kondensatora sprzęgającego = 470 nF.
Układ AD7866 jest sterowany za pomocą interfejsu SPI. Sygnał zegara tego interfejsu
dostarcza sygnał zegarowy potrzebny do konwersji, jak i steruje odbiorem danych z
układu. Na rys. 5.22 pokazano przebiegi czasowe dla tego interfejsu.
Rys. 5.22. Przebiegi czasowe interfejsu SPI
Sygnał CS inicjuje transfer danych i konwersję. Opadające zbocze tego sygnału
rozpoczyna konwersję, która wymaga 16 impulsów zegarowych SCLK. Linie danych DOUTA
i DOUTB wychodzą ze stanu wysokiej impedancji. Najpierw pojawia się na nich wiodące zero,
po którym występują trzy bity statusu:
Mikrokontrolery i Mikrosystemy
149
" RANGE  0  konwersja dla zakresu od 0 do VREF,  1  konwersja dla zakresu 2 *
VREF,
" A0  0  dane z kanału 1,  1  dane z kanału 2,
" A/B  0  dane z przetwornika ADC A,  1  dane z przetwornika ADC B.
Ostatni bit jest szczególnie użyteczny w przypadku transmitowania rezultatów konwersji obu
przetworników przez jedno wyjście danych. Następnie następuje przesłanie wyniku konwersji
od najstarszego bitu DB11 do najmłodszego DB0. Należy pamiętać, że wraz z przesyłaniem
danych trwa konwersja napięcia wejściowego na wartość cyfrową zgodnie z prędkością
sygnału zegarowego SCLK. Zatem zmieniając częstotliwość sygnału SCLK sterujemy
prędkością konwersji. Dane są wysyłane z wyjścia danych na opadające zbocze sygnału
zegarowego. Po 16 impulsach zegarowych proces konwersji i transferu danych jest kompletny
i może zostać zakończony poprzez wprowadzenie linii CS w stan wysoki. Linie danych
ponownie znajdują się w stanie wysokiej impedancji.
Jak wspomniano z jednego wyjścia danych przypisanego do danego przetwornika można
odczytać wyniki konwersji z obu przetworników. W tym przypadku po kompletnej konwersji
(16 impulsów zegarowych) sygnał CS nadal musi pozostać w stanie niskim. Następnie należy
podać na wejście zegarowe kolejne 16 impulsów, co łącznie daje 32 impulsy zegarowe. Na
rys. 5.23 pokazano przebiegi czasowe dla takiego przypadku. Zakłada się, że dane są czytane
z wyjścia DOUTA, stąd w pierwszym 16-bitowym łańcuchu bit statusu A/B przyjmuje wartość
 ZERO , co oznacza iż dane zawarte w nim są z przetwornika ADC A. Drugi 16-bitowy
łańcuch składa się z danych pochodzących od przetwornika ADC B (bit statusu A/D wynosi
 ONE ).
Rys. 5.23. Przebiegi czasowe interfejsu SPI dla przypadku odczytu danych z obu
przetworników przez jedno wyjście danych
5.3. Zewnętrzne przetworniki cyfrowo- analogowe (C/A)
Również oferowana jest przez producentów szeroka gama przetworników C/A z
interfejsem SPI. Dokonują one konwersji kodu cyfrowego na wartość napięcia (właściwie
prądu) wyjściowego. Najczęściej konwersja odbywa się z wykorzystaniem drabinki R-2R.
Spotykane rozdzielczości przetworników C/A to 8, 10, 12, 14 i 16 bitów.
Przetworniki te zostaną przedstawione na przykładzie układu DAC8043 firmy Analog
Devices (jego odpowiednikiem jest LCT8043 firmy Linear Technology). Układ ten jest 12-
bitowym przetwornikiem C/A wykonanym w technologii CMOS, umieszczonym w 8-
nóżkowej obudowie. Operuje on na pojedynczym napięciu zasilania +5V.
Mikrokontrolery i Mikrosystemy
150
Rys. 5.24. Schemat blokowy przetwornika C/A DAC8043
Układ składa się z (rys. 5.24):
" 12-bitowego szeregowego rejestru z wejściem szeregowym i wyjściem równoległym,
" 12-bitowego rejestru zatrzaskowego DAC z wejściem i wyjściem równoległym,
" 12-bitowego przetwornika C/A (drabinki R-2R),
" układu kontrolnego.
Układ DAC8043 posiada następujące cechy:
" 12-bitowy przetwornik C/A w 8-nóżkowej obudowie (rys. 5.25),
" szybki port szeregowy danych,
" podwójnie buforowane dane,
" niskie błąd nieliniowości i różnicowy błąd nieliniowości ą LSB,
" maksymalny błąd wzmocnienia ą1 LSB,
" niska wartość zmian rezystancji względem zmian temperatury 5 ppm/C,
" napięcie referencyjne (odniesienia) VREF względem GND ą25V,
" prąd zasilania w zakresie IDD=100  500A ,
" rezystancja ESD.
Rys. 5.25. Wyprowadzenia układu DAC8043
Pracą układu steruje interfejs szeregowy. Składa się on z trzech linii wejściowych SRI, LD,
CLK. Wejścia te są kompatybilne ze standardem TTL. Obwody wejściowe tych linii
posiadają rezystancję ESD, co zapewnia zwiększone bezpieczeństwo układu. Obwód
zabezpieczający składa się z diod i rezystora szeregowego.
Mikrokontrolery i Mikrosystemy
151
Rys. 5.26. Przebiegi czasowe interfejsu szeregowego układu DAC8043
Dane od najbardziej znaczącego bitu (MSB) do najmniej znaczącego (LSB) poprzez linię
SDI są wprowadzane do rejestru szeregowego na narastające zbocze sygnału zegarowego na
linii CLK (rys. 5.26). Jeżeli nowe 12-bitowe słowo programujące zostało wprowadzone do
rejestru szeregowego, jest ono ładowane do rejestru zatrzaskującego DAC poprzez podanie
 ujemnego impulsu na linii LD. Dane w tym rejestrze bezpośrednio sterują kluczami
drabinki R-2R, tym samym są przetwarzane na wartość prądu wyjściowego. Maksymalna
częstotliwość zegara wynosi 4MHz.
W rejestrze roboczym układu jest zapamiętywane 12 ostatnio przesłanych bitów. Zatem, w
celu zaprogramowania określonej wartości prądu przez mk, musi on do tego przetwornika za
pomocą interfejsu SPI przesłać dwa bajty, przy czym starszy nibl pierwszego bajta jest
nieistotny, gdyż i tak nie zostanie zachowany w rejestrze odbiorczym (metoda przepełnienia
zawartości rejestru odbiorczego).
Przetwornik C/A składa się z drabinki rezystorowej R-2R. Drabinka ta jest wykonana z
materiału silikon-chrom, cechującego się wysoką stabilnością temperaturową (+50 ppm/C),
oraz z dwunastu par kluczy typu NMOS (rys. 5.27).
Rys. 5.27. Schemat drabinki R-2R przetwornika C/A DAC8043
Klucze te dołączają nogę drabinki do GND lub IOUT. Całkowity prąd wyjściowy zależy więc
od kodu cyfrowego sterującego kluczami. Poważnym problemem jest zmiana rezystancji
kluczy względem temperatury. Aby zniwelować ten wpływ, kolejne klucze mają rezystancje
włączenia 10&!, 20&!, 40&! itd., aby na każdym z nich było napięcie 5mV, oraz stosuje się
rezystor RFEEDBACK.
Mikrokontrolery i Mikrosystemy
152
Układ DAC8043 może pracować w dwóch konfiguracjach, jako:
" układ unipolarny,
" układ bipolarny.
W pierwszym przypadku (rys. 2.28) może pełnić funkcje programowalnego zródła
referencyjnego napięcia stałego DC lub zmiennego AC (w zależności od tego, jaki jest rodzaj
napięcia referencyjnego). Napięcie wyjściowe układu można zmieniać w zakresie od 0V do
-VREF"(4095/4096). Zależność pomiędzy napięciem wyjściowym, a kodem jest
przedstawiona w tabeli 5.9.
Tabela 5.9. Kody wprowadzane do przetwornika DAC8043 i odpowiadające
im wartości napięć dla konfiguracji unipolarnej.
Dla tej konfiguracji rozdzielczość napięcia określona jest zależnością LSB= VREF(1/4096) lub
LSB= VREF(2- n).
Rys. 5.28. Przetwornik DAC8043 w układzie unipolarnym
W drugiej konfiguracji przetwornik pracuje jako układ bipolarny. Na rys. 5.29 pokazano
przykładowe rozwiązanie układu bipolarnego. Stan bitu MSB decyduje o kierunku napięcia.
Rezystory R3, R4 i R5 muszą być wybrane z dokładnością 0,01% i muszą być tego samego
typu. Niedokładność dopasowania wartości rezystorów R3 i R4 wpływa na offset i błąd skali,
natomiast dokładność doboru rezystorów R5 w stosunku do R4 oraz R3 decyduje o błędzie skali.
Mikrokontrolery i Mikrosystemy
153
Rys. 5.29. Przetwornik DAC8043 w układzie bipolarnym
W tabeli 5.10 zebrano kody i odpowiadające im wartości napięć wyjściowych dla układu
bipolarnego.
Tabela 5.10. Kody wprowadzane do przetwornika DAC8043 i odpowiadające
im wartości napięć dla konfiguracji bipolarnej.
Dla tego układu napięcie wyjściowe wyrażone jest wzorem:
A1 A2 A12
ł ł
VOUT = -VIN + +...+ gdzie AX = 1 dla ON,  0 dla OFF.
ł ł
ł łł
21 22 212
Warto zauważyć, że dla kodu 1000 0000 0000 napięcie wyjściowe powinno przyjmować
wartość 0V. Fakt ten, może posłużyć do kalibracji całego układu. Dokonuje się tego regulując
potencjometrem R1, aż uzyska się napięcie 0V na wyjściu przy tym kodzie. Przy pomocy
rezystorów R3 i R4 dobiera się wartość zakresową. W tym celu należy do przetwornika wysłać
kod 1111 1111 1111.
Innym rozwiązaniem może być umieszczenie przetwornika C/A w pętli sprzężenia
zwrotnego wzmacniacza operacyjnego, jak pokazano na rys. 5.30.
Mikrokontrolery i Mikrosystemy
154
Rys. 5.30. Przetwornik DAC8043 w układzie bipolarnym umieszczony w sprzężeniu
zwrotnym wzmacniacza operacyjnego
W tym przypadku napięcie wyjściowe jest równe ilorazowi wartości napięcia
referencyjnego VIN przez kod cyfrowy, zgodnie ze wzorem:
ł ł
ł ł
- VIN
ł ł
VOUT = .
ł
A1 A2 A12 ł ł
ł
ł ł + +...+ ł ł
ł łł
ł 21 22 212 łł
Należy uważać, aby kod cyfrowy nie składał się z samych zer, gdyż wzmacniacz będzie
pracował w otwartej pętli sprzężenia zwrotnego. Gdy kod składa się z samych jedynek to
uzyskuje się wzmocnienie równe 1. Największe wzmocnienie równe 4096 jest dla kodu 0000
0000 0001.
5.4. Cyfrowe potencjometry sterowane interfejsem SPI
Obecnie na rynku oferowana jest coraz większa gama potencjometrów, których wartość
rezystancji można zmieniać programowo (np. układy firm Analog Devices lub Linear
Technology). Grupę takich układów nazwano cyfrowymi potencjometrami. Najczęściej
nastawę (wartość rezystancji jaką ma przyjąć potencjometr) wprowadza się do takiego układu
za pośrednictwem interfejsu SPI.
Jednym z przedstawicieli potencjometrów cyfrowych jest układ AD5260 firmy Analog
Devices. Posiada on następujące cechy:
" 256 nastaw,
" jeden kanał,
" zamiennik potencjometrów mechanicznych 20k&!, 50k&!, 200k&!,
" niski współczynnik temperaturowy zmian rezystancji 35ppm/C,
" cztero-liniowe wejście kompatybilne ze standardem SPI,
" pojedyncze zasilanie od 5 V do 15 V lub podwójne zasilanie +/-5.5 V,
Mikrokontrolery i Mikrosystemy
155
Rys. 5.31. Schemat blokowy układu AD5260 firmy Analog Devices
Układ AD5260 (rys. 5.31) posiada jeden kanał z 256-pozycyjnym, cyfrowo sterowanym
rezystorem regulowanym (VR  variable resistor). Kanał ten można traktować jako oddzielny
opornik z ruchomym kontaktem. Wartość rezystancji jest ustalana przez kod cyfrowy
załadowany do rejestru RDAC. Kod ten wprowadzany jest najpierw do rejestru szeregowego
wejściem SDI na narastające zbocze sygnału CLK, po czym po skompletowaniu ośmiu bitów
przesyłany do rej. RDAC. Opór między suwakiem (linia W) i punktami przytwierdzonego
opornika (linie A i B) zmienia się liniowo w zależności do kodu cyfrowego (rys. 5.32).
Normalna rezystancja pomiędzy pinami A i B (RAB) wynosi 20k&!, 50k&!, lub 200k&!, a
nominalny współczynnik temperaturowy 35ppm/C. W odróżnieniu od większości cyfrowych
potencjometrów dostępnych na rynku, mogą one pracować z napięciami do 15V lub przy
napięciach ą5V, uwzględniając właściwy zapas napięć zasilających.
Rys. 5.32. Wartości rezystancji RWA i RWB w zależności od kodu sterującego
Niski poziom na linii PR powoduje wpisanie do rejestru RDAC (inaczej: VR latch) wartości
80H (128), co powoduje ustawienie suwaka na  środku potencjometru.
Mikrokontrolery i Mikrosystemy
156
Na rysunku 5.33 przedstawiono obudowę układu AD5260. Opis pinów zawarto w tabeli
5.11.
Rys. 5.33. Wyprowadzenia układu AD5260
Tabela 5.11. Opis funkcji pinów układu AD5260
Numer Symbol Opis pinu
pinu pinu
1 A Końcówka A
2W Suwak
3B Końcówka B
4 VDD Dodatni potencjał zasilania , zakres 5V lub 15V. (Suma |VDD| + |VSS|
<= 15V)
5 SHDN Aktywny stanem niskim. Rozwarcie końcówki A.
6CLK Wejście zegarowe aktywne zboczem narastającym.
7SDI Wejście szeregowe interfejsu SPI
8CS Wybór układu, aktywny stanem niskim. Kiedy stan na linii CS jest
wysoki, dane mogą być ładowane do rejestru RDAC.
9 PR Aktywny stanem niskim. Ustawia rezystor na połowę jego wartości,
poprzez wpisanie do rej. RDAC wartości 80H.
10 GND Masa
11 VSS Ujemny potencjał zasilania, zakres napięć od 0V do 5V.
12 VL Zasilanie  logiki układu.
13 NC Nie podłączone
14SDO Wyjście szeregowe typu otwarty dren, Wymaga zewnętrznego
rezystora pull-up.
Po włączeniu zasilania potencjometr przyjmuje wartość środkową, co minimalizuje
możliwość wystąpienia usterki. Wartość środkowa skali może być ustawiona w dowolnym
momencie przez podanie niskiego poziomu na linii PR. Aktywny sygnał na linii wyłączającej
SHDN powoduje, zminimalizowanie poboru mocy oraz rozwarcie końcówki A (końcówki W
i B są nadal zwarte).
Kod nastawy potencjometru jest wprowadzany poprzez interfejs SPI składający się z linii:
SDI, SDO, CS i CLK. 8-bitowe słowo ładowane jest do rejestru szeregowego od najstarszego
bitu MSB (format tego słowa pokazano w tabeli 5.12). Kiedy linia CS jest w stanie niskim,
dane pojawiające się na wejściu SDI są ładowane do rejestru szeregowego przy każdym
narastającym zboczu sygnału zegara na linii CLK. Dane z tego rejestru są przesyłane do
wewnętrznego rejestru RDAC, kiedy poziom na linii CS powraca do stanu wysokiego (rys.
Mikrokontrolery i Mikrosystemy
157
5.34). Podczas wyłączania (niski sygnał na linii SHDN) wyjście SDO jest w stanie wysokiej
impedancji.
Tabela 5.12. Format słowa sterującego dla układu AD5260
Rys.5.34. Przebiegi czasowe na interfejsie SPI dla układu AD5260
Szeregowe wyjście danych SDO jest typu otwarty dren (rys. 5.35). Wyjście to wymaga
rezystora pull-up, aby móc przesyłać daną do następnego układu (musi być podłączone do
jego wejścia SDI). Czyli służy ono do wyprowadzania danych, uprzednio wprowadzonych do
układu przez wejście SDI (z opóznieniem ośmiu impulsów zegarowych). Stąd z punktu
widzenia funkcji interfejsowych, interfejs tego układu realizuje dwie funkcje: funkcje
odbiornika (listener) i funkcje pośrednika (repeater).
Rys. 5.35. Schemat wyjścia SDO układu AD5260
Taki mechanizm pozwala na łączenie wielu potencjometrów cyfrowych w szereg, przy czym
linie CLK i CS tych układów są równolegle podłączone do mk. Napięcie, do którego
podłączony jest rezystor pull-up może być wyższe, niż napięcie zasilania układu. Wskazane
jest, aby zwiększać okres zegara, w przypadku podłączenia  łańcucha takich
potencjometrów, gdyż przesłanie danej pomiędzy kolejnymi układami wprowadza
opóznienie. Sygnał CS powinien być utrzymywany w stanie niskim do czasu, gdy do każdego
układu zostanie przesłane 8 bitów. Np. w przypadku podłączenia dwóch potencjometrów, po
16 bitach można ustawić stan wysoki na linii CS (rys. 5.36).
Mikrokontrolery i Mikrosystemy
158
Rys. 5.36. Podłączenie dwóch układów AD5260 do mk
Blok RDAC zawiera łańcuch rezystorów o tej samej wartości, odpowiednio podłączany do
zacisku W przez macierz przełączników analogowych, które zachowują się jak suwak w
tradycyjnym potencjometrze. W danej chwili, w zależności od kodu sterującego, włączony jest
tylko jeden klucz. Sterowanie kluczami jest realizowane przez rejestr RDAC i układ
dekodujący wartość cyfrową na numer klucza do włączenia. Układ AD5260 daje możliwość
ustawienia 256 poziomów wartości rezystancji, a co za tym idzie dokładność nastawienia
rezystancji wynosi 0.4%. Rys. 5.37 przedstawia równoważną strukturę połączeń pomiędzy
trzema końcówkami potencjometru. Ponieważ przełączniki analogowe nie są idealne w stanie,
gdy suwak znajduje się w skrajnych położeniach, wartość rezystancji pomiędzy suwakiem a
końcówkami wynosi minimalnie 60&!.
Rys. 5.37. Uproszczona architektura bloku RDAC
Mikrokontrolery i Mikrosystemy
159
Zakres zmian rezystancji miedzy końcówkami A i B, a suwakiem (końcówka W) opisane
są poniższymi wzorami i tabelami.
Dla końcówki B wzór na rezystancje jest następujący:
D
RWB (D) = RAB + Rw , gdzie: D  kod cyfrowy, RW  rezystancja klucza (około 60&!).
256
Na podstawie tej zależności utworzono tabelę 5.13.
Tabela 5.13. Wartości rezystancji RWB w zależności od kodu D dla RAB=20k&!
Kod Rezystancja RWB Stan wyjścia
cyfrowy D
(&!)
&!
&!
&!
256 19982 Pełna skala (RAB  1 LSB + RW)
128 10060 Środek skali
1138 1 LSB
0 60 minimum skali (rezystancja połączenia suwaka)
Natomiast dla końcówki A zależność na rezystancje przyjmuje postać:
256 - D
RWA (D) = RAB + Rw .
256
Również na podstawie tej zależności utworzono tabelę (tabela 5.14).
Tabela 5.14. Wartości rezystancji RWA w zależności od kodu D dla RAB=20k&!
Kod Rezystancja RWB Stan wyjścia
cyfrowy D
(&!)
&!
&!
&!
256 60 Pełna skala
128 10060 Środek skali
119982 1 LSB
0 20060 Minimum skali
Poniżej przedstawiono kilka przykładowych aplikacji potencjometru cyfrowego:
" Korzystając z układu AD5260 można zbudować w prosty sposób programowalny
dzielnik napięcia, przykładowo podłączając końcówkę A do +5V, a końcówkę B do 0V.
Zatem na suwaku można uzyskać napięcie w zakresie od 0V do 5V. Napięcie na
końcówce suwaka W VW(D) jest określone wzorem:
D
VW (D) = VAB + VB .
256
" Układ AD5260 można użyć do kontroli wzmocnienia wzmacniaczy, w sposób pokazany
na rys. 5.38.
Rys. 5.38. Typowy nieodwracający wzmacniacz operacyjny
Mikrokontrolery i Mikrosystemy
160
Wzmocnienie A(D) takiego układu można wyrazić zależnością:
RAB RW
D
A(D) = + .
256 R1 R1
Warto zauważyć, że w przypadku podłączenia potencjometru tak jak na rysunku 5.38
mamy do czynienia z dwiema pasożytniczymi pojemnościami. Wynikają one ze struktury
potencjometru. Powoduje to wprowadzenie bieguna, który wpływa na zmianę
charakterystyki częstotliwościowej. Wprowadza to przy pewnym zakresie częstotliwości
dodatkowe tłumienie  20dB/dek. Dodatkowo może wystąpić wygarbienie rezonansowe
charakterystyki, które w pewnym przypadku może spowodować generację drgań
periodycznych, czyli układ stanie się niestabilny z powodu braku zapasu fazy. Zatem
najlepiej by było gdyby R1*C1=R2*C2. Jest to bardzo trudne do osiągnięcia, gdyż
wartości pojemności C1 i C2 zmieniają się w funkcji zmiany rezystancji R2. W
przypadkach krytycznych, wartość pojemności C2 powinna być wyznaczana empirycznie
(zmienia się ona w zakresie od pojedynczych pF do dziesiątek pF).
" Układ programowalnego napięcia odniesienia przedstawiono na rysunku 5.39. Dzięki
zastosowaniu bufora wyjściowego możliwe jest podłączenie do niego większego
obciążenia.
Rys. 5.39. Programowalne zródło napięcia odniesienia
" Na rys. 5.40 przedstawiono przykładowy 8-bitowy bipolarny przetwornik cyfrowo-
analogowy oparty na układzie AD5260. Przetwornik ten oferuje taką sama rozdzielczość
jak 8-bitowe scalone przetworniki C/A, lecz w zakresie małych kodów nie zapewnia
należytej dokładności. Wynika to z faktu, iż dla małych wartości nastawionej rezystancji
dominującym czynnikiem staje się rezystancja suwaka nie mniejsza niż 60&!. Napięcie na
wyjściu przetwornika Vo określa się wzorem:
2D
ł
Vo = -1łVref .
ł ł
256
ł łł
Mikrokontrolery i Mikrosystemy
161
Rys. 5.40. 8-bitowy bipolarny przetwornik C/A
Mikrokontrolery i Mikrosystemy
162
6. Bibliografia
6.1. Literatura podstawowa
1. Tlaga W.:  Procesory w systemach pomiarowych , Mat. konf. Szkoła-Konferencja
Metrologia Wspomagana Komputerowo, Tom 1, Zegrze k/Warszawy, 24-28 maj 1993, s.
129-164.
2. Daca W.:  Mikrokontrolery od układów 8-bitowych do 32-bitowych , Wyd. NIKOM,
Warszawa, kwiecień 2000.
3. Pełka R.:  Mikrokontrolery, architektura, programowanie, zastosowania , Wyd. WKA,
Warszawa 1999.
4. Pasierbiński J., Zbysiński P.:  Układy programowalne w praktyce , Wyd. WKA,
Warszawa 2002.
5. Krysiak A.:  Mikrokontrolery rodziny AVR, AT 90S1200 , Wyd. Studio Wydawniczo-
Typograficzne  Typoscript , Wrocław 1999.
6. Gałka P., Gałka P.:  Podstawy programowania mikrokontrolera 8051 , Wyd. NIKOM,
Warszawa, wrzesień 1995.
7. Jabłoński T:  Mikrokontrolery PIC16F8x w praktyce , Wyd. BTC, Warszawa 2002.
8. Rydzewski A.:  Mikrokomputery jednoukładowe rodziny MCS-51 , Wyd. Naukowo-
Techniczne, Warszawa 1992.
6.2. Dokumentacja w postaci plików PDF
1. Dokumentacja mk AT90S8515 firmy Atmel (doc0841.pdf).
2. Dokumentacja rodziny 80C51 firmy Philips (89C51_89C52_89C54_89C58_10.pdf).
3. Dokumentacja mk PIC16F87X firmy Microchip (30292c.pdf).
4. Specyfikacja programowania EEPROM mk PIC16F87X firmy Microchip (39025f.pdf).
5. Dokumentacja mk ST72104G, ST72215G, ST72216G, ST72254G firmy
STMicroelectronics (6815.pdf).
6. Dokumentacja układu 74HC/HCT574 firmy Philips (74HC_HCT574_CNV_2.pdf).
7. Dokumentacja układów rodziny K6T1008C2E firmy Samsung (K6T1008C2E.PDF).
8. Dokumentacja pamięci Am29F010B firmy AMD (22336c1.pdf).
9. Dokumentacja układu GAL16V8 firmy Lattice (16V8.pdf).
10. Dokumentacja układów rodziny XC9500 firmy Xilinx (9500.pdf).
11. Dokumentacja układów 25AA080/25LC080/25C080 firmy Microchip (21230c.pdf).
12. Dokumentacja układu 93C46B firmy Microchip (21173e.pdf).
13. Dokumentacja układu AD7233 firmy Analog Devices (AD7233_b.pdf).
14. Dokumentacja układu AD7866 firmy Analog Devices (AD7866_0.pdf).
15. Dokumentacja układu DAC8043 firmy Analog Devices (dac8043.pdf).
16. Dokumentacja układu AD5260/AD5262 firmy Analog Devices (AD5260_2_0.pdf).
17. Dokumentacja układu MCP2510 firmy Microchip (21291e.pdf).


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery i Mikrosystemy cz1
Mikrokontrolery cz2
nerki cz2
Mikrokontrolery ARM cz1
Fotogrametria cz12 teledetekcja cz2
Mikrokomputer Pecel z procesorem AT90S8535 cz 3
2 Formy org prawne cz2 14
ZIP przetworstwo tsz cz2
ELEMENTY ZŁĄCZNE WEDŁUG PN DIN cz2
Mikrokontrolery ARM cz10

więcej podobnych podstron