Układy fpga w przykladach

Transkrypt

Układy fpga w przykladach
K U R S
Układy FPGA
w przykładach, część 1
Duże układy PLD tanieją
w tempie zbliżonym do
popularnych mikrokontrolerów,
co spowodowało, że układy
FPGA o dużych zasobach
logicznych nie tylko są już
tańsze od stosunkowo prostych
układów CPLD, ale stały się
dostępne dla szerokich rzesz
użytkowników. Wiedza na temat
ich możliwości i sposobów
przygotowywania projektów nie
jest jednak powszechna, czego
dowiodła sierpniowa ankieta
publikowana na naszej stronie
internetowe: ponad 95% spośród
4779 głosujących poparło pomysł
rozpoczęcia kursu projektowania
na układach FPGA na łamach
EP. Oto i on…
Wielokrotnie już na łamach EP
podejmowaliśmy próby przybliżenia Czytelnikom układów PLD. Początkowo (był to rok 1993), przede
wszystkim ze względu na łatwą dostępność, skupialiśmy się na układach niskiej skali integracji (PAL
i GAL), następnie przeszliśmy przez
układy CPLD, teraz sytuacja (przede
wszystkim rynkowa) mocno już dojrzała do zajęcia się „na poważnie”
układami FPGA.
Jak najtaniej: Spartan 3 + WebPack ISE
Projekty przedstawione w kolejnych odcinkach
kursu będą przygotowywane w taki
sposób, aby można je był (w większości
przypadków) zaimplementować na dowolną
platformę sprzętową. Niektóre projekty będą
wykorzystywały specyficzne cechy docelowych
układów, co pozwoli zilustrować ich możliwości.
Ponieważ obecnie, w sprzedaży detalicznej
w naszym kraju są dostępne wyłącznie układy
firmy Xilinx, jako platformę sprzętową wybrano
układ XC3S200 z rodziny Spartan 3.
Co, czym i jak
Przygotowany przez nas kurs jest
maksymalnie zorientowany na praktykę, co oznacza, że skupimy się przede
wszystkim na przykładowych projektach. Nie obędzie się jednak bez niezbędnego krótkiego wstępu, w którym
przedstawimy architekturę układów
Spartan 3 (które zostały wybrane jako
kursowa platforma sprzętowa), możliwości oferowane przez zasoby sprzętowe tych układów, poznamy wybrane
sposoby konfiguracji i sposoby programowania tych układów, aż – w końcu
– dojdziemy do serii przykładowych
projektów. Wszystkie projekty będą
przystosowane do łatwej implementacji w dalej opisanym zestawie PLD.
Planowane przez autorów etapy
kursu (zapraszamy Czytelników do
przekazywania sugestii!) przedstawiono na str. 90.
Kursowa platforma
sprzętowa
Biblioteki dla Protela 99SE/DXP
Producent modułów ZL10PLD udostępnił
na swojej stronie internetowej biblioteki do
edytorów PCB i SCH (w formacie Protel/Altium),
dzięki którym moduł ten można wygodnie
„wprojektowywać” we własne aplikacje.
torem taktującym, złączem JTAG oraz
przyciskiem umożliwiającym ręczne
wymuszenie rekonfiguracji układu
FPGA. Na fot. 1 pokazano wygląd
płyty bazowej ZL9PLD przygotowanej do zainstalowania modułu dipPLD
z układem XC3S200 oraz wyświetlacza LCD o organizacji 2x16 znaków.
Na fot. 2 pokazano moduł ZL10PLD
(dipPLD) z układem XC2S200 i pozostałymi peryferiami.
Schemat elektryczny płyty bazowej
pokazano na rys. 3. Standardowym
wyposażeniem płyty bazowej jest:
– gniazdo VGA (sposób sterowania
monitora umożliwia wyświetlenie
maksymalnie 8 kolorów),
– 4 przyciski do wykorzystania
w aplikacji użytkownika,
– złącze kart MMC,
– 8 diod LED,
– konwerter napięciowy interfejsu
RS232 z gniazdem DB9F,
– złącze konwertera USB<–>RS232
(np. ZL1USB, także dostępny
Ze względu na to, że zarówno wybrane przez nas układy FPGA
jak i ich konfiguratory są dostarczane
w obudowach niezbyt „sympatycznych” podczas samodzielnego montażu (jakkolwiek jest on możliwy nawet
w warunkach amatorskich), zrezygnowaliśmy z przygotowywania specjalnego zestawu uruchomieniowego.
Zamiast tego w ofercie
handlowej AVT znajdzie się uniwersalny
zestaw składający się
z płyty bazowej ZL9PLD
o sporych możliwo ściach oraz montowanego w jej gnieździe modułu dipPLD (ZL10PLD)
z zamontowanym układem XC3S200, konfiguratorem XCF01S (1 Mb
Flash), zestawem stabilizatorów LDO, genera- Fot. 1. Widok zestawu ZL9PLD
Okazja dla Czytelników EP zainteresowanych układami FPGA
Zestaw sprzętowy wykorzystywany w kursie jest do dostępny do 31.12.2006 na zasadach promocyjnych. Zakup zestawu składającego się z modułów
ZL9PLD (uniwersalna płytka bazowa) oraz ZL10PLD (modułu DIP z układem XC3S200 z rodziny Spartan 3 firmy Xilinx) jest premiowany programatorem
ZL4PRG (odpowiednik DLC III), za pomocą którego można programować i konfigurować w systemie układy CPLD i FPGA firmy Xilinx.
www.sklep.avt.pl
•
Elektronika Praktyczna 10/2006
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
89
K U R S
Fot. 2. Wygląd modułu dip PLD
z układem XC3S200
w ofercie handlowej AVT),
– głośnik piezoelektryczny,
– gniazdo USB, które służy do zasilania (alternatywnie do zewnętrznego zasilacza sieciowego),
– zasilacz stabilizowany zapewniający napięcia 5 V i 3,3 V,
– niewielkie pole uniwersalne (9x7
punktów),
– wyprowadzenia napięć zasilających
5 V i 3,3 V, dzięki którym można
zasilić zewnętrzne układy logiczne,
– złącza szpilkowe gold–pin, na które wyprowadzono linie I/O układu
FPGA zamontowanego na module
dipPLD.
Na rys. 4 znajduje się schemat
elektryczny modułu dipPLD o oznaczeniu ZL10PLD. Zastosowano w nim
układ XC3S200, którego zasoby logiczne odpowiadają ok. 200000 bramek logicznych, zwanych często przeliczeniowymi. Jak wykażą przykłady,
są to zasoby trudne do nadwyrężenia
w średniozaawansowanych projektach.
Poważniejszym ograniczeniem praktycznym jest stosunkowo niewielka liczba wyprowadzeń dostępnych
w obudowie (jest ich 100), ale da się
ono odczuć dopiero przy zaawansowanych projektach. Żeby uzmysłowić
sobie możliwości dostępne współczesnym elektronikom warto wiedzieć,
że XC3S200 jest jednym z najmniejszych układów w rodzinie Spartan 3,
a największy układ spośród obecnie
dostępnych jest odpowiednikiem 5
mln bramek przeliczeniowych!
Standardowym wyposażeniem
modułu ZL10PLD, poza układem
XC3S200, jest:
– konfigurator Flash o pojemności 1 Mb (wyspecjalizowana pa-
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie
XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
3. Projekty przykładowe
mięć firmy Xilinx o oznaczeniu
XCF01S), zapewniający automatyczną konfigurację FPGA po włączeniu zasilania lub ręcznym wymuszeniu rekonfiguracji,
– stabilizatory zapewniające prawidłowe napięcia zasilające o wartościach: 1,2, 2,5 (FPGA) i 3,3 V
(FPGA i konfigurator),
Rys. 3. Schemat elektryczny płyty bazowej (ZL9PLD)
90
Elektronika Praktyczna 10/2006
K U R S
FPGA – co trzeba o nich wiedzieć – tip #1
Pamięć konfiguracji
W większości przypadków układy FPGA są
wyposażone w pamięć konfiguracji typu
SRAM, z założenia ulotną (jej zawartość
zanika po odłączeniu zasilania). W związku
z czym, każdorazowo po włączeniu zasilania
konieczne jest skonfigurowanie układu FPGA,
co pozwoli układowi normalnie funkcjonować.
Z tego powodu elementem standardowego
systemu z FPGA jest wyspecjalizowana pamięć
Flash, w której jest przechowywana startowa
konfiguracja układu. Odtworzenie konfiguracji
układu po włączeniu zasilania może przebiegać
automatycznie i trwa od kilkunastu do kilkuset
milisekund.
nić komplet informacji Czytelnikom
zaczynającym z nami kurs.
Programowanie i konfiguracja FPGA
jest tematem z kategorii „podstawowych” dla użytkowników FPGA, bowiem bez jego zrozumienia i opanowania nie jest możliwe sprawdzenie
działania „w krzemie” nawet najlepiej
przygotowanego projektu.
Zaczniemy od rozróżnienia programowania i konfigurowania, bowiem –
wbrew popularnemu poglądowi – nie
FPGA – co trzeba o nich wiedzieć – tip #2
Napięcia na liniach I/O
Układy Spartan 3 (podobnie do większości
rozwiązań konkurencyjnych) nie są
przystosowane do współpracy z układami
cyfrowymi zasilanymi napięciem wyższym niż
3,3 V (niektóre nawet 2,5 V). Ograniczenie
to dotyczy obydwu konfiguracji linii I/O: jako
wejściowej i wyjściowej.
Użytkownicy zamierzający łączyć ze sobą
układy Spartan 3 z układami zasilanymi
napięciem 5 V powinni stosować konwertery
poziomów (choćby układy TTL z rodziny
LVC/LCX) lub (nie zawsze jest to wskazane)
rezystory włączone w szereg z linią I/O
ograniczające natężenie prądu wpływającego/
wypływającego do/z linii I/O.
Rys. 4. Schemat elektryczny modułu ZL10PLD
– podstawkę pod generator kwarcowy (standardowo 3,6864 MHz),
– diodę LED sygnalizującą poprawne
skonfigurowanie układu FPGA,
– przycisk umożliwiający wymuszenie rekonfiguracji FPGA w dowolnie wybranym przez użytkownika
momencie,
– dwa złącza szpilkowe (po 32 styki gold–pin każdy) umożliwiające
wygodne zainstalowanie modułu
w podstawce,
– zespół 5 inwerterów o charaktery-
Elektronika Praktyczna 10/2006
styce przejściowej Schmitta (z histerezą) z serii 74LVC lub 74LCX,
które spełniają rolę układów dopasowujących napięcia pomiędzy
FPGA i zewnętrznymi układami
cyfrowymi zasilanymi napięciami
o wartości większej niż 3,6 V.
Programowanie
i konfigurowanie FPGA
Część z informacji prezentowanych
w tej części artykułu publikowaliśmy
już w EP. Powtarzamy je, żeby zapew-
oznaczają tego samego. Konfigurować
można wyłącznie układ FPGA poprzez
wprowadzenie do jego pamięci konfiguracji (SRAM) odpowiednich danych,
które uzyskuje się w końcowych etapach kompilacji projektu. Wprowadzenie tych danych można (w przypadku
modułu ZL10PLD) uzyskać na jeden
z dwóch sposobów:
– za pośrednictwem interfejsu JTAG,
– za pośrednictwem wybranego interfejsu konfiguracyjnego FPGA,
z zewnętrznej pamięci nieulotnej.
Zazwyczaj, ze względu na niewielką liczbę linii I/O zaangażowanych
do konfiguracji, wykorzystywane są
wyspecjalizowane konfiguratory, jak
to pokazano na rys. 5.
Z kolei programować można pa-
91
K U R S
Rys. 5. Konfiguracja łańcucha JTAG w ZL10PLD
mięć Flash, zintegrowaną w konfiguratorze. W przypadku układu XCF01S
jest ona dostępna (co oznacza, że
można ją programować, odczytywać i kasować) za pomocą interfejsu
JTAG.
Ponieważ zarówno konfigurator
jak i FPGA zastosowane w module
ZL10PLD są wyposażone w interfejs
JTAG, układy te połączono w łańcuch JTAG, którego budowę pokazano
na rys. 5. Jako pierwszy w łańcuchu
(czyli „najbliżej” sygnału TDI programatora) ulokowano układ XC3S200,
drugim (i ostatnim w łańcuchu) układem jest XCF01S. Takie rozwiązanie,
przy jednoczesnym podłączeniu konfiguratora do interfejsu konfiguracyjnego FPGA powoduje, że użytkownik
może:
– modyfikować (w tym programować)
i odczytywać zawartość pamięci
Flash konfiguratora (via JTAG),
– konfigurować FPGA (via JTAG),
– wymusić automatyczną konfigurację FPGA po włączeniu zasilania (via interfejs konfiguracyjny
FPGA). Początek konfiguracji jest
wyznaczany przez układ monitorujący napięcie zasilania, dzięki
czemu ryzyko rozpoczęcia konfiguracji przed ustabilizowaniem się
napięcia zasilającego jest zminimalizowane.
Na schemacie z rys. 5 pogrubioną
linią zaznaczono ścieżkę przesyłania
92
Uwaga ta dotyczy także linii I/
O stosowanych podczas konfiguracji
za pomocą pamięci równoległych.
Ponieważ większość dostępnych na
rynku programatorów ISP jest przystosowana do pracy z napięciami
z zakresu 3,3….5 V, konieczne jest
zastosowanie rezystorów ograniczających prądy wejściowe w liniach
I/O zasilanych napięciem o wartości
wyższej od 2,5 V (R5, R6, R7, R8
na rys. 4). Rezygnacja z tych rezystorów może spowodować (przez
przepływ prądu o zbyt dużym natężeniu, zazwyczaj powyżej 10 mA)
uszkodzenie diod znajdujących się
w strukturze układu pomiędzy linią
I/O i linią zasilania (rys. 6), może
także spowodować uszkodzenie lub
niepoprawną pracę stabilizatora napięcia zasilającego, który – z natury
rzeczy – nie jest przystosowany do
przyjmowania prądu wpływającego
od strony wejścia. Z tego powodu,
oprócz rezystorów ograniczających
prąd wejściowy, konieczne jest zastosowanie rezystora odbierającego
prąd zwrotny (IREV na rys. 6) z linii
zasilającej VCCAUX.
Poważną (w stosunku do niektórych rozwiązań oferowanych przez
firmy konkurencyjne) zaletą układów
Spartan 3 jest możliwość dołączania
napięć zasilających w dowolnej kolejności. Można więc stosować standardowe stabilizatory pozbawione
sekwencerów zasilania – ma to poważny wpływ na ograniczenie kosztu
(i tak niełatwych do zdobycia) podzespołów zastosowanych w obwodach
zasilania.
danych w łańcuchu JTAG. Należy pamiętać, że wszystkie układy wchodzące w skład łańcucha mają równolegle
połączone (sterowane z programatora)
linie: TCK i TMS, które służą odpowiednio do: taktowania i ustalania
trybu pracy interfejsu JTAG. Przycisk
służy do ręcznego wymuszania rekonfiguracji układu FPGA – jego naciśnięcie wymusza skopiowanie zawartości
pamięci Flash do pamięci konfigurującej SRAM wbudowanej w FPGA.
Sporo kłopotów może sprawić
początkującym użytkownikom konieczność stosowania
„dziwnych” rozwiązań
w ścieżkach sygnałowych interfejsu JTAG.
Wynika to z faktu, że
napięcie o wartości
2,5 V jest traktowane
jako maksymalne dopuszczalne (zgodnie
z wymogami standardu napięciowego LVCMOS25) dla wszystkich wyspecjalizowanych linii I/O wykorzystywanych podczas
konfiguracji układu
(są to: PROG_B,
TDI, TMS, TCK,
TDO, CCLK, DONE,
M0, M1, M2 oraz Rys. 6. Konfiguracja zabezpieczeń na liniach I/O
H S W A P _ E N – FPGA może wymusić konieczność stosowania dodattab. 1).
kowych rezystorów
Elektronika Praktyczna 10/2006
K U R S
FPGA – co trzeba o nich wiedzieć – tip #3
Współcześnie produkowane, „duże” pod względem zasobów, układy FPGA są zasilane w kłopotliwy
sposób, wymagają bowiem zazwyczaj dwóch lub trzech (m.in. układy z rodziny Spartan 3) napięć
zasilających o różnych wartościach. Jedną z najpoważniejszych przyczyn takich rozwiązań są
nowoczesne technologie produkcji struktur krzemowych, wykorzystywane do produkcji układów FPGA.
Z jednej strony zapewniają one duża gęstość upakowania struktur i w związku z tym ich relatywnie
niską cenę, z drugiej występuje konieczność zasilania „rdzenia” układu napięciem o niewielkiej
wartości, a linii
I/O współpracujących
z otoczeniem, napięciem
o wartości co najmniej
3,3 V.
Tego, że zasilanie
i sposoby dołączania
elementów peryferyjnych
do układów z rodziny
Spartan 3 wywołują
wiele problemów,
dowodzi specjalna nota
aplikacyjna przygotowana
w lutym 2006 firmę
Xilinx (jej oznaczenie:
XAPP453). Polecamy
jej przestudiowanie
wszystkim Czytelnikom
zainteresowanym tymi
układami.
Możliwe sposoby konfiguracji
układów FPGA z rodziny
Spartan 3
Układy z rodziny Spartan 3 są
przystosowane do obsługi 5 sposobów konfigurowania, z których
w praktyce najczęściej korzystam
z dwóch: JTAG oraz Master Serial
(z wykorzystaniem konfiguratora).
Dość popularnym trybem konfiguracji jest także Slave Serial, w którym
konfigurowany układ FPGA jest źródłem sygnału zegarowego synchroTab. 1. Maksymalne napięcia
wejściowe wybranych linii specjalnych
oraz wielofunkcyjnych
Nazwa linii
PROG_B
HSWAP_EN
TDI
TMS
TCK
TDO
CCLK
DONE
M0…2
INIT_B
DOUT
BUSY
DIN
D0…3
D4…7
RDWR_B
CS_B
Maksymalne
napięcie
wejściowe
[V]
2,5
2,5
2,5
2,5
2,5
2,5
2,5
2,5
2,5
= VCCO_4
= VCCO_4
= VCCO_4
= VCCO_4
= VCCO_4
= VCCO_4
= VCCO_4
= VCCO_4
Odnośny
biegun
zasilania I/O
–
–
–
–
–
–
–
–
–
VCCO_4
VCCO_4
VCCO_4
VCCO_4
VCCO_4
VCCO_5
VCCO_5
VCCO_5
Elektronika Praktyczna 10/2006
nizującego transmisję danych z zewnętrznej pamięci nielotnej. Obydwa tryby Serial umożliwiają łączenie konfigurowanych układów w kaskady, dzięki czemu w niektórych
przypadkach można wykorzystać
jeden konfigurator (o odpowiednio
dużej pojemności) do współpracy
z kilkoma układami FPGA.
Wybór trybu konfiguracji odbywa się za pomocą trzech dedykowanych wejść oznaczonych M0…2,
zgodnie z opisem z tab. 2. Zmiana
trybu konfigurowania jest możliwa
poprzez zmianę stanów logicznych
na wejściach M0…2 i wymuszenie
rekonfiguracji układu (np. poprzez
wyłączenie i włączenie zasilania lub
zainicjowanie interfejsu JTAG).
Na rys. 4 pokazano przykładowy schemat elektryczny połączeń
(taki jak zastosowano w module
ZL10PLD) pomiędzy konfiguratorem XCF01S oraz układem z rodziny Spartan 3. Takie połączenie
układów umożliwia automatyczne
konfigurowanie FPGA po włączeniu
zasilania oraz (alternatywnie) konfigurowanie FPGA za pomocą pro-
FPGA – co trzeba o nich wiedzieć – tip #4
Wejścia M0…2 są przystosowane do
sterowania poziomami logicznymi zgodnymi
ze standardem LVCMOS25 co oznacza, że
maksymalna, bezpieczna wartość napięcia na
tym wejściu nie może być większa niż 2,5 V.
gramatora dołączonego do interfejsu
JTAG. Wybór aktywnego kanału komunikacyjnego jest możliwy za pomocą zworki JP2 – układ FPGA jest
konfigurowany w jednym z dwóch
trybów zaznaczonych w tab. 2 za
pomocą szarego tła: Master Serial
lub JTAG.
Linie I/O układu FPGA
podczas konfiguracji
Kolejnym zagadnieniem, wartym
do wzięcia pod uwagę w związku
z konfigurowaniem FPGA, jest zachowanie się linii I/O podczas włączania zasilania i konfigurowania
FPGA. Wbudowany w układy Spartan 3 układ POR (Power On Reset)
powoduje, że linie I/O są utrzymywane w stanie wysokiej impedancji
do chwili osiągnięcia prawidłowych
wartości przez napięcia VCCINT, VCCO_4,
V CCAUX i następnie skonfigurowania
układu. Po ustaleniu się napięć zasilających, stany linii I/O zależą od
konfiguracji układu – jeśli FPGA nie
został skonfigurowany, na liniach I/O
jest utrzymywany stan wysokiej
impedancji. Nie ma więc ryzyka,
że konfiguracja lub rekonfiguracja
układu FPGA w systemie cyfrowym,
którego praca jest inicjowana (np.
poprzez zerowanie) może zostać zaburzona przez przypadkowe sygnały
występujące na jego liniach I/O.
W przypadku takiej konieczności
jest możliwe dołączenie do linii I/O
rezystorów podciągających, które są
aktywowane podczas konfiguracji
układu. Wymaga to zwarcia wyprowadzenia HSWAP_EN do masy zasilania (domyślnie jest ono podciągnięte do plusa).
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Tab. 2. Możliwe tryby konfiguracji układów Spartan 3
Nazwa trybu
konfiguracji
M0
M1
M2
Sygnał
synchronizujący
Master Serial
Slave Serial
Master Parallel
Slave Parallel
JTAG
0
1
1
0
1
0
1
1
1
0
0
1
0
1
1
CCLK (wy)
CCLK (we)
CCLK (wy)
CCLK (we)
TCK (we)
Szerokość
magistrali
danych
1
1
8
8
1
93
K U R S
Układy FPGA
w przykładach, część 2
W drugiej części artykułu
zajmiemy się omówieniem
wyposażenia (po
„mikrokontrolerowemu”: peryferiów)
układów FPGA z rodziny Spartan
3, co ułatwi ich wykorzystywanie
w praktyce. To właśnie wewnętrzne
zespoły konfigurowalnych pamięci,
uniwersalne porty I/O, wbudowane
syntezery sygnałów zegarowych,
sprzętowe zespoły mnożące
i pozostałe – mniej spektakularne
elementy – tworzą potęgę
możliwości współczesnych FPGA.
Już najprostsze układy FPGA
z rodziny Spartan 3 oferują użytkownikom duże zasoby logiczne
i bardzo bogate wyposażenie dodatkowe, charakteryzujące się dużą
elastycznością i uniwersalnością.
Podstawowe informacje na temat
zasobów dostępnych w tych układach zebrano w tab. 3.
To właśnie dzięki bogatemu wyposażeniu wewnętrznemu układy
FPGA są coraz częściej stosowane
jako platformy System–on–a–Chip,
w których są implementowane kompletne systemy cyfrowe łącznie
z „miękkimi” rdzeniami mikroprocesorowymi. A to właśnie układy typu
SoC są przyszłością elektroniki.
Budowa układów
Spartan 3
Układy FPGA
(Field Programmable
Gate Array) to jeden
z dwóch (drugi to
układy mniejszej skali integracji – CPLD,
czyli Complex Programmable Logic
Devices), produko wanych obecnie, rodzajów układów PLD
(Programmable Logic
Devices). Układy te
charakteryzują się
r e g u l a r n ą b u d o w ą , Rys. 8. Budowa komórki logicznej CLB w układach
opartą (w przypadku Spartan 3
firmy Xilinx) na zespołach wielu
identycznych lub bardzo do siebie
podobnych bloków CLB (Configurable Logic Block). Schemat blo-
Rys. 7. Schemat blokowy ilustrujący budowę układów Spartan 3
92
FPGA – co trzeba o nich wiedzieć – tip 5
Bezpieczeństwo projektów w FPGA
Układy Spartan 3 nie są wyposażone
w zaawansowane mechanizmy ochrony
konfiguracji, co powoduje, że projekty
zagrożone przez „piratów” powinny być
implementowane na bardziej zaawansowanych
pod tym względem układach FPGA. Pamięć
konfigurująca Flash XCF01S (i inne z serii xxS)
jest zabezpieczona przed nieuprawnionym
odczytem przez JTAG, ale w żaden
sposób nie są chronione dane przesyłane
interfejsem szeregowym wykorzystywanym do
konfigurowania FPGA.
Elektronika Praktyczna 11/2006
K U R S
Plan kursu
List. 1. Opis VHDL dwuportowej pamięci 16 x N (na bazie XAPP464)
––
–– Module:
XC3S_RAM16XN_D
––
–– Description: Distributed SelectRAM example
––
Dual Port 16 x N–bit
––
Use template „RAM_16D.vhd”
––
and registered outputs (optional)
––
–– Device:
Spartan–3 Family
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
library IEEE;
use IEEE.std_logic_1164.all;
––
–– pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
–– pragma translate_on
––
entity XC3S_RAM16XN_D is
generic (
data_width : integer := 8 –– Replace by the data width
);
port (
DATA_IN
: in std_logic_vector(data_width–1 downto 0);
ADDRESS
: in std_logic_vector(3 downto 0);
ADDRESS_DP
: in std_logic_vector(3 downto 0);
WRITE_EN
: in std_logic;
CLK
: in std_logic;
O_DATA_OUT
: out std_logic_vector(data_width–1 downto 0);
O_DATA_OUT_DP : out std_logic_vector(data_width–1 downto 0)
);
end XC3S_RAM16XN_D;
––
architecture XC3S_RAM16XN_D_arch of XC3S_RAM16XN_D is
––
–– Components Declarations:
––
component RAM16X1D
–– See initialization example in the reference templates
port (
D
: in std_logic;
WE
: in std_logic;
WCLK : in std_logic;
A0
: in std_logic;
A1
: in std_logic;
A2
: in std_logic;
A3
: in std_logic;
DPRA0
: in std_logic;
DPRA1
: in std_logic;
DPRA2
: in std_logic;
DPRA3
: in std_logic;
SPO : out std_logic;
DPO : out std_logic
);
end component;
––
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
––
–– Signal Declarations:
signal DATA_OUT : std_logic_vector(data_width–1 downto 0);
signal DATA_OUT_DP : std_logic_vector(data_width–1 downto 0);
––
begin
––
–– Registered outputs / Synchronous read
REGISTERED_OUT: process (CLK)
begin
if (CLK’event and CLK = ‚1’) then
O_DATA_OUT <= DATA_OUT;
O_DATA_OUT_DP <= DATA_OUT_DP;
end if;
end process REGISTERED_OUT;
––
–– Distributed SelectRAM Instantiation
RAM16X1D_X: for i in 0 to data_width–1 generate
U_RAM16X1D: RAM16X1D
port map (
D
=> DATA_IN(i), –– insert input signal
WE
=> WRITE_EN, –– insert Write Enable signal
WCLK
=> CLK, –– insert Write Clock signal
A0
=> ADDRESS(0), –– insert Address 0 signal port SPO
A1
=> ADDRESS(1), –– insert Address 1 signal port SPO
A2
=> ADDRESS(2), –– insert Address 2 signal port SPO
A3
=> ADDRESS(3), –– insert Address 3 signal port SPO
DPRA0 => ADDRESS_DP(0), –– insert Address 0 signal port DPO
DPRA1 => ADDRESS_DP(1), –– insert Address 1 signal port DPO
DPRA2 => ADDRESS_DP(2), –– insert Address 2 signal port DPO
DPRA3 => ADDRESS_DP(3), –– insert Address 3 signal port DPO
SPO
=> DATA_OUT(i), –– insert output signal SPO
DPO
=> DATA_OUT_DP(i) –– insert output signal DPO
);
end generate;
––
end XC3S_RAM16XN_D_arch;
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Elektronika Praktyczna 11/2006
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie
XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
kowy układu z rodziny Spartan 3
pokazano na rys. 7. Na schemacie
– poza CLB – widać także pamięci
BlockRAM, sprzętowe multiplikatory, syntezery przebiegów zegarowych DCM (Digital Clock Manager)
oraz komórki I/O o nazwie IOB (Input–Output Block). Kolejno je omówimy.
CLB
Bloki CLB (w układach Spartan 3 jest ich od 1728 do 74880
sztuk) są zbudowane z 4 bloków
logicznych nazwanych przez firmę Xilinx mianem slice. Schemat
ilustrujący rozmieszczenie slice’ów
w CLB pokazano na rys. 8. Jak
widać, od jednej strony slice’y są
Rys. 9. Każde ulokowane wewnątrz
matrycy CLB może bezpośrednio
komunikować się z 8 sąsiadującymi
CLB
93
K U R S
Jak działa FPGA?
Klasycznym elementem
architektury układów
FPGA są tablice LUT, często zwane
generatorami funkcji logicznych.
Realizują one ustaloną przez
użytkownika funkcję logiczną kilku
(zazwyczaj 3...5) zmiennych. Za
konfigurację – czyli sposób działania
– LUT odpowiada pamięć konfiguracji
SRAM, której zawartość trzeba
odtwarzać po włączeniu zasilania
układu. Do tego celu niezbędna jest
zewnętrzna pamięć nielotna, często
nazywana konfiguratorem.
Rys. 10. Wymianę sygnałów w układach Spartan 3 zapewniają rozbudowane zasoby połączeniowe o różnych cechach
dołączone do magistral zapewniających komunikację w obrębie całego układu FPGA (tzw. połączenia globalne o różnym zasięgu),
od drugiej strony – do magistral
zapewniających komunikację lokalną z sąsiednimi CLB. Każdy slice
ma własny adres w obrębie CLB
(np. X1Y0), który projektant może
wykorzystać wraz z numerem CLB
FPGA – co trzeba o nich wiedzieć – tip 6
Alternatywne możliwości CLB
Bloki CLB, będące podstawowym
konfigurowalnym elementem logicznym
w układach Spartan 3, mogą spełniać także
dodatkowe funkcje: rejestrów przesuwnych
o regulowanej długości oraz pamięci ROM,
SRAM i DualPort SRAM. Pojemności tej
pamięci w układach Spartan 3 mieszczą się
w przedziale 12…520 kb.
w przypadku konieczności ręcznego
(rzadko się to obecnie zdarza) rozmieszczania bloków funkcjonalnych
w obrębie FPGA. Slice pogrupowano je po dwa (w kolumny) z wydzielonymi szybkimi łańcuchami
propagacji sygnału CARRY, dzięki
czemu możliwe są implementacje
szybko działających bloków logicznych wykorzystujących kaskadowe
przeniesienia (liczniki, arytmometry
itp.). Jak wspomniano, każdy CLB
ulokowany wewnątrz grupy ma
możliwość bezpośredniej komunikacji z sąsiadującymi CLB, jest ich
zazwyczaj 8 (rys. 9). Wymiana danych z dalej położonymi CLB odbywa się za pomocą dodatkowych
zasobów połączeniowych (rys. 10):
– linii długich (Long Lines, dołączonych do – kolejno – co
szóstego CLB), które są najszybszym traktem komunikacyjnym
wewnątrz FPGA, często wykorzystywanym zamiennie z globalnymi liniami zegarowymi,
– linii 8–krotnych (Hex Lines),
które rozprowadzają sygnały na
mniejsze odległości, oferując
większe (niż Long Lines) moż-
Tab. 3. Zestawienie najważniejszych parametrów układów z rodziny Spartan–3
Parametr
Liczba bramek
przeliczeniowych
Liczba komórek
logicznych
Sprzętowe
multiplikatory
Pojemność
pamięci Block
RAM
Pojemność
pamięci
rozproszonej
Distributed RAM
Liczba DCM
Maksymalna liczba
różnicowych linii
I/O
Maksymalna liczba
asymetrycznych
linii I/O
94
Typ układu
XC3S1000
XC3S1500
XC3S50
XC3S200
XC3S400
XC3S2000
XC3S4000
XC3S5000
50000
200000
400000
1000000
1500000
2000000
4000000
5000000
1728
4320
8064
17280
29952
46080
62208
74880
4
12
16
24
32
40
96
104
72 kb
216 kb
288 kb
432 kb
576 kb
720 kb
1728 kb
1872 kb
12 kb
30 kb
56 kb
120 kb
208 kb
320 kb
432 kb
520 kb
2
4
4
4
4
4
4
4
56
76
116
175
221
270
312
344
124
173
264
391
487
565
712
784
Elektronika Praktyczna 11/2006
K U R S
Rys. 11. Budowa slice’a
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
Okazja dla Czytelników EP zainteresowanych układami FPGA
Zestaw sprzętowy wykorzystywany w kursie jest do dostępny do 31.12.2006 na zasadach promocyjnych. Zakup zestawu składającego się z modułów ZL9PLD (uniwersalna płytka bazowa) oraz ZL10PLD
(modułu DIP z układem XC3S200 z rodziny Spartan 3 firmy Xilinx) jest premiowany programatorem
ZL4PRG (odpowiednik DLC III), za pomocą którego można programować i konfigurować w systemie
układy CPLD i FPGA firmy Xilinx.
www.sklep.avt.pl
•
Elektronika Praktyczna 11/2006
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
95
K U R S
List. 2. Opis VHDL dwuportowej pamięci 16 x N (na bazie XAPP464)
––
–– Module:
XC3S_RAM16XN_S
––
–– Description: Distributed SelectRAM example
––
Single Port 16 x N–bit
––
Use template „RAM_16S.vhd”
––
and registered outputs (optional)
––
–– Device:
Spartan–3 Family
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
library IEEE;
use IEEE.std_logic_1164.all;
––
–– pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
–– pragma translate_on
––
entity XC3S_RAM16XN_S is
generic (
data_width : integer := 8 –– Replace by the data width
);
port (
DATA_IN
: in std_logic_vector(data_width–1 downto 0);
ADDRESS
: in std_logic_vector(3 downto 0);
WRITE_EN
: in std_logic;
CLK
: in std_logic;
O_DATA_OUT
: out std_logic_vector(data_width–1 downto 0)
);
end XC3S_RAM16XN_S;
––
architecture XC3S_RAM16XN_S_arch of XC3S_RAM16XN_S is
––
–– Components Declarations:
––
component RAM16X1S
–– See initialization example in the reference templates
port (
D
: in std_logic;
WE
: in std_logic;
WCLK : in std_logic;
A0
: in std_logic;
A1
: in std_logic;
A2
: in std_logic;
A3
: in std_logic;
O
: out std_logic
);
end component;
––
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
––
–– Signal Declarations:
signal DATA_OUT : std_logic_vector(data_width–1 downto 0);
––
begin
––
–– Registered outputs / Synchronous read
REGISTERED_OUT: process (CLK)
begin
if (CLK’event and CLK = ‚1’) then
O_DATA_OUT <= DATA_OUT;
end if;
end process REGISTERED_OUT;
––
–– Distributed SelectRAM Instantiation
RAM16X1S_X: for i in 0 to data_width–1 generate
U_RAM16X1S: RAM16X1S
port map (
D
=> DATA_IN(i), –– insert input signal
WE
=> WRITE_EN, –– insert Write Enable signal
WCLK
=> CLK, –– insert Write Clock signal
A0
=> ADDRESS(0), –– insert Address 0 signal
A1
=> ADDRESS(1), –– insert Address 1 signal
A2
=> ADDRESS(2), –– insert Address 2 signal
A3
=> ADDRESS(3), –– insert Address 3 signal
O
=> DATA_OUT(i) –– insert output signal
);
end generate;
––
end XC3S_RAM16XN_S_arch;
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
liwości połączeniowe i są dołączone do co trzeciego CLB,
– linii podwójnych (Double Lines),
które zapewniają bezpośrednią
komunikację pomiędzy pozostałymi CLB.
W slice’ach tworzących CLB ulo-
96
kowano zasoby logiczne, których
nawet pobieżna analiza (choćby na
schemacie pokazanym na rys. 11)
pokazuje ogrom możliwości i elastyczność tych komórek, których
– ogólnie rzecz ujmując – budowa
jest taka sama jak w pierwszych
układach FPGA. Każdy slice wyposażono w dwie konfigurowalne
tablice LUT (F–LUT i G–LUT), na
wejścia których są podawane 4
sygnały (zmienne). Tablice te spełniają rolę konfigurowalnych, kombinacyjnych funktorów logicznych
(często są nazywane generatorami
funkcji), które umożliwiają wykonanie dowolnej funkcji logicznej
do 4 zmiennych wejściowych. Na
wyjściu LUT ulokowano przerzutnik, którego sposób działania (czyli
jego typ) można także skonfigurować. Na schemacie pokazanym na
rys. 11 zilustrowano budowę slice’y
X0Y1 i X0Y0 (rys. 8), które wyposażono w sprzętowe rozszerzenia
(zaznaczone na rys. 11 linią przerywaną) pozwalające skonfigurować
je jako rejestry przesuwne lub zespoły rozproszonej pamięci (tzw.
Distributed RAM). Slice’y X1Y0
i X1Y1 mają nieco prostszą budowę (bez fragmentów oznaczonych
liniami przerywanymi na rys. 11),
co ogranicza ich funkcjonalność do
znanej z klasycznych wersji FPGA.
O ile – w większości przypadków
– możliwość wygodnej implementacji rejestrów przesuwających nie
budzi specjalnych emocji, to możliwość uzyskania dodatkowych zasobów pamięciowych w LUT bywa
atutem nie do pogardzenia. W każdym CLB można zaimplementować pamięć ROM o pojemności do
128x1 bitów, pamięć SRAM o pojemności do 64x1 bitów (co oznacza, że możliwe są także warianty
2x32x1 lub 4x16x1) lub pamięć
DualPortRAM o pojemności 2x16x1
bit. Pamięci te – dzięki rejestrom
na wyjściach CLB – można wyposażyć w mechanizmy synchronizacji
odczytu danych.
Na list. 1 przedstawiono opis
w języku VHDL dwuportowej pamięci SRAM implementowanej
w zasobach Distributed RAM, a na
list. 2 opis pamięci jednoportowej (obydwie o organizacji 16xN,
w obydwu zastosowano synchroniczny odczyt danych). Prezentowane przykłady pochodzą z przykładów przygotowanych przez inżynierów firmy Xilinx do noty
aplikacyjnej XAPP464 (publikujemy
na CD–EP11/2006B).
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Elektronika Praktyczna 11/2006
K U R S
Układy FPGA w przykładach,
część 3
Kontynuujemy prezentację zasobów dostępnych w układach FPGA
z rodziny Spartan 3. W tej – przedostatniej „teoretycznej” – części
kursu omawiamy budowę komórek I/O oraz zasady dystrybucji
sygnałów zegarowych w układach FPGA.
Komórki wejścia wyjścia
– IOB
Budowa komórek I/O w układach
Spartan 3 jest dość skomplikowana
(rys. 12), ale możliwości oferowane
przez nie przewyższają (pod względem elastyczności i funkcjonalno-
Rys. 12. Budowa komórki IOB
100
ści) rozwiązania spotykane w mikrokontrolerach i innych układach
cyfrowych.
Zadaniem komórek IOB (Input–
–Output Block) jest zapewnienie
dwukierunkowej wymiany danych
pomiędzy komórkami CLB tworzą-
cymi strukturę logiczną zaprojektowaną przez użytkownika (patrz
EP11/2006) z otoczeniem.
Jak widać na rys. 12, komórka IOB składa się z trzech ścieżek
przepływu danych: ścieżki sterowania bufora HiZ (trójstanowego),
ścieżki wyjściowej i ścieżki wejściowej. Podstawowym zadaniem
ścieżki sterowania bufora HiZ jest
wytwarzanie sygnałów sterujących
pracą wyjściowego bufora trójstanowego, który znajduje się w ścieżce
wyjściowej. Jej zadaniem jest z kolei
formowanie sygnałów wyjściowych,
podawanych na fizyczne wyprowadzenie układu. Elementy zintegrowane w ścieżce wejściowej odpowiadają między innymi za uformowanie
sygnałów podawanych z zewnątrz
do układu FPGA. Ponieważ linie
I/O w układach z rodziny Spartan 3
są przystosowane do współpracy
z różnymi standardami napięciowymi, mogą one pracować także jako
wejścia różnicowe (symetryczne), to
w torach wejściowych zastosowano
analogowe komparatory napięcia. Jeden z nich porównuje napięcie na
linii I/O z napięciem na linii VREF
(linia wspólna dla grup I/O), drugi jest wykorzystany do
konwersji sygnału różnicowego (symetrycznego)
na asymetryczny, przy
czym trzeba pamiętać,
że w takim trybie pracy
wykorzystywane są dwie
linie I/O sąsiadujących
ze sobą komórek IOB.
Wszystkie ścieżki komórki IOB mają wbudowane po dwa konfigurowalne przerzutniki, które można wykorzystać
m.in. podczas transmisji
danych w trybie DDR
(Double Data Rate), czyli z taktowaniem obydwoma zboczami sygnału zegarowego.
Każdy blok IOB
wyposażono w rezystory podciągające pull–up i pull–
–down, które użytkownik może
indywidualnie uaktywniać i odłą-
Elektronika Praktyczna 12/2006
K U R S
Rys. 13. Konfigurację linii I/O umożliwia m.in. edytor wymuszeń XilinxPACE
czać. Ponadto, każda linia I/O
jest wyposażona w tzw. pin–keeper,
czyli przerzutnik utrzymujący na linii
ostatni wymuszony z zewnątrz stan
logiczny, dzięki któremu nie ma konieczności dołączania do zewnętrznego potencjału niewykorzystanych linii
I/O. Można go stosować wymiennie
z rezystorami pull–up i pull–down.
Sterowanie dołączaniem rezystorów
jest możliwe zarówno z poziomu opisu HDL jak i (co jest zdecydowanie
łatwiejsze do opanowania i wygodniejsze w stosowaniu) z poziomu pliku wymuszeń UCF (User Constraints
File), w którym znajdują się także
przypisania sygnałów do konkretnych
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie
XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
Elektronika Praktyczna 12/2006
wyprowadzeń układu. Poniżej pokazano jedną linię
z pliku *.ucf, która opisuje
parametry linii I/O wyprowadzającej sygnał o nazwie
na_probe. Sygnał ten jest
dołączony do wyprowadzenia numer 87, jest zgodny ze standardem napięciowym LVCMOS 3,3 V,
wydajność prądowa linii
I/O wynosi 16 mA, dołączony jest do niej pin–keeper. Dodatkowo ustalono,
że prędkość zmian sygnału
na wyjściu będzie miała
maksymalną dopuszczalną
wartość (dyrektywa SLEW=FAST):
NET „na_probe” LOC = „P87”
| IOSTANDARD = LVCMOS33 |
DRIVE = 16 | KEEPER | SLEW
= FAST;
E d y c j ę p l i ku * . u c f Rys. 14. Możliwe konfiguracje I/O z aktywnym
można wykonać za pomo- modułem DCI
cą edytora tekstowego lub
– w wielu przypadkach jest to wyzasilanymi napięciem wyższym niż
godniejsze – za pomocą edytora wy- 3,3 V powinni zastosować konwertemuszeń XilinxPACE, zintegrowanego
ry poziomów (w konwerterach jednokierunkowych układy TTL z rodziny
w pakiecie WebPack ISE (rys. 13).
Jak widać na rys. 12, każda liLVC/LCX) lub (zdecydowanie gornia I/O została zabezpieczona przed
sze rozwiązanie) rezystory włączone
uszkodzeniem ESD za pomocą diod
w szereg z linią I/O, ograniczające nawłączonych szeregowo–zaporowo. Po- tężenie prądu wpływającego/wypływawoduje to ograniczenie maksymalne- jącego do/z linii I/O.
go napięcia na wejściu do wartości
FPGA – co trzeba o nich wiedzieć – tip #7
z przedziału ok. VCCO –0,5 V…
Sygnały globalne
VCCO + 0,5 V, nie ma więc możDo dystrybucji sygnałów taktujących
liwości bezpośredniej współpracy ze
w układach FPGA jest zalecane
standardowymi układami TTL lub
wykorzystywanie globalnych linii zegarowych.
CMOS zasilanymi napięciem 5 V.
Należy do nich dołączać możliwie duże grupy
elementów taktowanych tym samym sygnałem
Użytkownicy zamierzający łączyć ze
zegarowym.
sobą układy Spartan 3 z układami
101
K U R S
(funkcje alternatywne wybranych linii
I/O). Możliwe konfiguracje bufora wyjściowego z aktywnym DCI pokazano
na rys. 14. Odpowiednia konfiguracja
DCI jest uaktywniana automatycznie
po wybraniu trybu pracy I/O, co także pokazano na rys. 14.
Globalne linie zegarowe
Rys. 15. Dystrybucja sygnałów zegarowych połączeniami segmentowanymi powoduje m.in. zmniejszenie
maksymalnej częstotliwości taktowania projektu
Interesującym wyposażeniem komórek IOB jest także blok DCI (Dynamically Controlled Impedance), którego zadaniem jest dopasowanie falowe (ma więc znaczenie dla sygnałów
o dużej częstotliwości) linii I/O do obciążenia. Impedancję wyjściową (szeregową i równoległą) linii I/O dobiera
się za pomocą zewnętrznych rezystorów (po dwa na każdy zespół DCI),
dołączonych do linii VRN i VRP
Sporo problemów sprawia początkującym użytkownikom układów PLD
zrozumienie koncepcji sygnałów globalnych, dlatego postaramy się ją tu
nieco rozjaśnić.
W typowych projektach występują trzy rodzaje sygnałów potrzebnych
jednocześnie w wielu miejscach układu FPGA (takie sygnały są nazywane
globalnymi), są to sygnały: zegarowe,
zerujący/ustawiający i sygnał zezwalający na pracę buforów trójstanowych
(szczególnie istotny w systemach opierających się na komunikacji magistralowej). Ponieważ standardowe zasoby
połączeniowe (pomiędzy CLB) w układach Spartan 3 – jak na układy
FPGA przystało – są podzielone na
krótkie segmenty, to dystrybucja nimi
sygnałów potrzebnych w wielu miejscach jednocześnie powoduje zajęcie
znacznej ich części przez niewielką
liczbę sygnałów (rys. 15). Dodatkową,
negatywną konsekwencją „segmentowych” tras przesyłania sygnałów jest
znaczne ich rozmycie w funkcji czasu: czasy przebiegu silnie zależą od
trasy, a te zależą zarówno
od sposobu opisu HDL jak
i algorytmów optymalizacyjnych syntezera logicznego.
Jakkolwiek dystrybucja sygnałów globalnych za pomocą połączeń lokalnych
jest możliwa, to nie jest
w praktyce możliwe uzyskanie stabilnej pracy tak
zaprojektowanego układu
z częstotliwościami taktowania bliskimi częstotliwości
maksymalnej, wynikającej
z parametrów czasowych
układu FPGA.
List. 3. Sposób wykorzystania
w projekcie globalnego bufora
sygnału zegarowego BUFG (predefiniowany przez producenta)
BUFG_inst : BUFG
port map (
O => moje_wyjscie,
I => moje_wejscie
);
cześnie rolę buforów separujących
źródło sygnału zegarowego od taktowanej logiki. Inne wymienione
sygnały często traktowane w PLD
jako globalne (tzn. zerujący/ustawiający i zezwalający dla buforów trójstanowych) w układach Spartan 3
nie zostały wyprowadzone na zewnątrz układów.
Wykorzystanie w projekcie globalnych linii zegarowych jest możliwe na kilka sposobów, z których
dwa są najbardziej popularne:
– przypisanie linii rozprowadzającej sygnały taktujące wewnątrz
FPGA do wyprowadzenia GCLKx
jest informacją dla syntezera, że
użytkownik chce wykorzystać
globalną linię zegarową,
– w opisie projektu (zarówno pisanego w HDL – list. 3, jak
i w postaci schematu – rys. 17)
można zastosować predefiniowany bufor BUFG.
Skuteczność obydwu przedstawionych sposobów jest taka sama.
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Generalna zasada
Rys. 16. Budowa systemu dystrybucji sygnałów
zegarowych w układach Spartan 3
102
Układy Spartan 3 wyposażono w 8 globalnych
linii służących do dystrybucji niezależnych sygnałów zegarowych (rys. 16),
które są dołączane do
linii przesyłowych za
pomocą multiplekserów
2/1 spełniających jedno-
Rys. 17. Atrybut globalności można
nadać wybranej linii sygnałowej
także w edytorze schematów
Elektronika Praktyczna 12/2006
KURS
Układy FPGA w przykładach,
część 4
Jest to ostatnia „teoretyczna” część kursu. Za miesiąc zaczynamy
prezentację przykładów aplikacji na FPGA.
W tym odcinku cyklu skupiamy się na trzech istotnych zasobach
układów Spartan 3: syntezerach DCM, sprzętowych multiplikatorach
i wbudowanej w struktury układów, konfigurowalnej pamięci SRAM.
wyprowadzenie
FPGA.
Zastosowanie w projektach bloków DCM jest
możliwe na dwa sposoby: za pomocą „dołączenia” DCM z wykorzystaniem opisu HDL (przykład
opisu w języku VHDL pokazano na
list. 4), lub – w przypadku korzystania z opisu za pomocą schematu – dzięki wykorzystaniu elementu
bibliotecznego o nazwie DCM, który znajduje się w kategorii General (rys. 21). W przypadku opisu
pokazanego na list. 4 parametryzacja (konfiguracja) DCM odbywa
się za pomocą wpisania odpowiednich wartościach, których możliwe
warianty zaznaczono pogrubioną
czcionką w komentarzach. Nieco
wygodniej przebiega konfiguracja
DCM w edytorze schematów: dwukrotne kliknięcie w symbol graficzny DCM otwiera okno edycyjne,
które pokazano na rys. 22. Za jego
pomocą można wygodnie, w „windowsowym” stylu sparametryzować
i skonfigurować DCM, bez konieczności modyfikowania opisu HDL.
DCM (ich liczba zależy zasobów logicznych
FPGA, jak to przedstawiono w tab. 3 na
str. 94 w EP11/2006).
Pozwalają one nie tylko skompensować różnice faz (wynikające
z opóźnień propagacji)
sygnałów zegarowych
w (fizycznie) różnych
miejscach układu,
można je także wykorzystać do syntezowania (w tym podziału
częstotliwości sygnału zewnętrznego) wewnętrznych sygnałów
Rys. 18. Zbocza sygnałów zegarowych występują
zegarowych.
w różnych miejscach FPGA w różnym czasie, co
Na rys. 19 pokamoże spowodować nieprawidłowe działanie układu
zano schemat blokowy DCM (Digital Clock Manager).
Generatory wewnętrznych
FPGA – co trzeba o nich wiedzieć – tip #8
Składa się on z 4 bloków: syntesygnałów zegarowych
Możliwości konfiguracji DCM są bardzo
zera częstotliwości DFS, pętli DLL,
– DCM
duże i ich dokładne opisanie wychodzi poza
programowanego przesuwnika fazy
Najpoważniejszym kłopotem dla
ramy kursu. Czytelników zainteresowanych
konstruktorów stosujących w swo(Phase Shifter) oraz zespołu logiki
poznaniem szczegółów zachęcamy do
ich projektach układy FPGA jest Status Logic.
zapoznania się z notą katalogową XAPP462
firmy Xilinx, w której DCM opisano bardzo
odpowiednie taktowanie wprojektoW aplikacjach prostszych oraz
szczegółowo.
wanych w nie obwodów. Budowa
w przypadku, gdy nie jest konieczFPGA powoduje, że elementy lo- ne „żyłowanie” pagiczne rozmieszczone na powierzchrametrów układów
ni struktury półprzewodnikowej, FPGA, korzystanie
pomimo taktowania sygnałem zegaz DCM nie jest
rowym pochodzącym z jednego źróko n i e c z n e i m o dła, nie są taktowane jednocześnie ż e s i ę w p r o w a dzić do wykorzy(rys. 18), bowiem różny jest czas
stania tego bloku
dystrybucji sygnału w zależności od
jako syntezera lub
trasy jaką pokonuje (czyli jakiego
programowalnego
rodzaju zasoby połączeniowe wykorzystano do jego transportu), od- dzielnika częstotliwości. Na rys. 20
ległości pomiędzy źródłem i celem,
a także liczby wejść taktowanych
pokazano przykłajednocześnie w danym segmencie
dowe konfiguracje
ścieżki połączeniowej.
DCM, w których
Aby zminimalizować wpływ niewykorzystano redoskonałości architektury FPGA na ferencyjny sygnał
jakość projektów, firma Xilinx wyzegarowy podawa- Rys. 19. Schemat blokowy DCM stosowanych w ukłaposażyła układy Spartan 3 w bloki
ny z zewnątrz na dach Spartan 3
Elektronika Praktyczna 1/2007
97
KURS
Sprzętowe
multiplikatory
Rys. 20. Przykładowe konfiguracje DCM z wykorzystaniem zewnętrznego sygnału
Rys. 21. Jednym ze sposobów skorzystania z możliwości DCM jest zastosowanie elementu bibliotecznego DCM znajdującego się w kategorii General
M o ż l i w o ś c i b l o kó w D C M s ą
duże, co wiąże się z dużą liczbą
dostępnych do konfigurowania opcji.
Nieco więcej miejsca poświęcimy
im w części kursu z przykładami.
Standardowym elementem architektury
układów Spartan 3 są
sprzętowe multiplikatory, pozwalające mnożyć 2 liczby 18–bitowe.
Mogą one pracować
w trybie asynchronicznym (kombinacyjnym)
lub synchronicznym,
w którym wykonywanie
obliczeń jest synchronizowane sygnałem zegarowym, a wynik odbierany z wyjść 36–bitowego rejestru (rys. 23).
Korzystanie z możliwości multiplikatorów
wygląda podobnie jak
w przypadku DCM, to
znaczy, że użytkownik
ma do dyspozycji ręcznie modyfikowalny opis
HDL (wykorzystujący
konfigurowalny prymityw MULT18X18SIO)
lub może jego opis wygenerować za pomocą
przyjaznego w obsłudze
programu Xlinx CORE
Generator (rys. 24),
który wchodzi w skład
bezpłatnego WebPacka
ISE.
Pamięć BlockRAM
Wszystkie układy z rodziny Spartan 3 wyposażono w wewnętrzną,
konfigurowalną pamięć SRAM. Liczba niezależnych bloków BlockRAM
wiążąca się z nią łączna pojemność
pamięci jest zależna od typu układu
(patrz tab. 3, str. 94 w EP11/2006).
Ponieważ wszystkie przykłady będą
FPGA – co trzeba o nich wiedzieć – tip #9
Możliwości multiplikatorów wbudowanych
w układy Spartan 3 są duże. Czytelników
zainteresowanych poznaniem szczegółów
zachęcamy do zapoznania się z notą
katalogową XAPP467 firmy Xilinx, w której
opisano je bardzo szczegółowo.
Rys. 22. Konfiguracja DCM w edytorze schematów jest łatwa dzięki
specjalnemu oknu edycyjnemu
98
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
prezentowane na zestawie ZL9PLD
(płytka bazowa) + ZL10PLD (dipPLD z układem SX3S200), do naszej
dyspozycji będzie 12 bloków konfigurowalnej pamięci o łącznej pojemności 216 kb.
Wbudowana w układy Spartan 3
pamięć SRAM jest dwuportowa, dzięki czemu użytkownik może wykonywać niezależnie operacje zapisu i odFPGA – co trzeba o nich wiedzieć – tip #10
Maksymalna częstotliwość taktowania pamięci
BlockRAM może dochodzić w układach
Spartan 3 do 200 MHz.
czytu spod/do różnych adresów, może
także transferować dane za pomocą
rejestrów składających się na komórki pamięci (rys. 25). Pojemność pojedynczego zespołu BlockRAM wynosi
16384 b (w przypadku wykorzystywania bitów parzystości – 18432 b),
przy czym użytkownik może dobierać szerokość i głębokość pamięci do
potrzeb projektu. Możliwe jest także łączenie kilku bloków BlockRAM
w zespoły pamięci o większej pojemności. Możliwe są więc następujące
Rys. 23. Możliwe konfiguracje pracy multiplikatorów
Elektronika Praktyczna 1/2007
KURS
List. 4.
natywna funkcja
LUT, tzw. DistributedRAM, nieco więcej na ten
temat pisaliśmy
w EP11/2006), każdy o pojemności
16x1 b. Można
je lokalnie łączyć
w bloki do 64 bitów, a takie zespoły można wykorzystywać do
budowy większych
zespołów pamięci
RAM/FIFO/DualPortRAM.
Korzystanie ze
wszystkich rodzajów pamięci dostępnych w układach Spartan 3
jest równie wygodne jak miało
to miejsce w przypadku DCM lub
sprzętowych multiplikatorów.
DCM_inst : DCM
generic map (
–– Czesc opisu sluzaca do skonfigurowania DCM
CLKDV_DIVIDE => 2.0,
–– Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
–– 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
CLKFX_DIVIDE => 1,
–– Can be any interger from 1 to 32
CLKFX_MULTIPLY => 4,
–– Can be any integer from 1 to 32
CLKIN_DIVIDE_BY_2 => FALSE,
–– TRUE/FALSE to enable CLKIN divide by two feature
CLKOUT_PHASE_SHIFT => "NONE",
–– Specify phase shift of NONE, FIXED or VARIABLE
CLK_FEEDBACK => "1X",
–– Specify clock feedback of NONE, 1X or 2X
DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", –– _SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
–– an integer from 0 to 15
DFS_FREQUENCY_MODE => "LOW",
–– HIGH or LOW frequency mode for frequency synthesis
DLL_FREQUENCY_MODE => "LOW",
–– HIGH or LOW frequency mode for DLL
DUTY_CYCLE_CORRECTION => TRUE,
–– Duty cycle correction, TRUE or FALSE
PHASE_SHIFT => 0,
–– Amount of fixed phase shift from –255 to 255
STARTUP_WAIT => FALSE)
–– Delay configuration DONE until DCM LOCK, TRUE/FALSE
–– Czesc opisu umozliwiajaca podlaczenie DCM do reszty projektu
port map (
CLK0 => CLK0,
–– 0 degree DCM CLK ouptput
CLK180 => CLK180,
–– 180 degree DCM CLK output
CLK270 => CLK270,
–– 270 degree DCM CLK output
CLK2X => CLK2X,
–– 2X DCM CLK output
CLK2X180 => CLK2X180,
–– 2X, 180 degree DCM CLK out
CLK90 => CLK90,
–– 90 degree DCM CLK output
CLKDV => CLKDV,
–– Divided DCM CLK out (CLKDV_DIVIDE)
CLKFX => CLKFX,
–– DCM CLK synthesis out (M/D)
CLKFX180 => CLKFX180,
–– 180 degree CLK synthesis out
LOCKED => LOCKED,
–– DCM LOCK status output
PSDONE => PSDONE,
–– Dynamic phase adjust done output
STATUS => STATUS,
–– 8–bit DCM status bits output
CLKFB => CLKFB,
–– DCM clock feedback
CLKIN => CLKIN,
–– Clock input (from IBUFG, BUFG or DCM)
PSCLK => PSCLK,
–– Dynamic phase adjust clock input
PSEN => PSEN,
–– Dynamic phase adjust enable input
PSINCDEC => PSINCDEC,
–– Dynamic phase adjust increment/decrement
RST => RST
–– DCM asynchronous reset input
);
wych” szerokości słowa
danych, pamięci oferują także możliwość Podsumowanie
przechowywania bitów
Na tym kończymy – z konieczności
parzystości (po jednym skrótowy – wstęp do „tajemniczego
n a p r z e c h o w y w a n y świata” nowoczesnych układów FPGA.
bajt), przy czym jego Za miesiąc pokażemy pierwszy przygenerację i weryfikację
kład, który – mamy nadzieję – zachęmusi zapewnić użyt- ci wszystkich onieśmielonych Czytelnikownik.
ków do podjęcia samodzielnych prób.
Bloki pamięci możJacek Majewski
na skonfigurować jako [email protected]
jedno– i dwuportowe,
Piotr Zbysiński, EP
jako FIFO, pamięci [email protected]
CAM (Content–Addressable Memory) oraz paFPGA – co trzeba o nich wiedzieć – tip #12
Większe zespoły pamięci utworzonych
mięci ROM. W każdym
na bazie rozproszonych LUT (w CLB)
przypadku użytkownik
mają gorsze parametry czasowe niż
może zdefiniować zaRys. 24. Wygodnym narzędziem, umożliwiającym
pamięci BlockRAM. Należy pamiętać o tym
wartość pamięci po
wygenerowanie opisu HDL multiplikatora odpowiaw przypadku, gdy projekt zaimplementowany
w FPGA jest taktowany sygnałem zegarowym
włączeniu zasilania, co
dającego wymaganiom projektu, jest Xlinx CORE
o częstotliwości bliskiej maksymalnej,
umożliwia następujący
Generator
dopuszczalnej dla danego układu.
zapis w języku VHDL
konfiguracje pojedynczego bloku Bloc- (dla kolejnych 16 komórek):
INIT_00 => X"1100100
kRAM: 16 k x 1, 8 k x 2, 4 k x 4,
0110000110000110111101
2 k x 8, 2 k x 9, 1 k x 16, 1 k x
18, 512 x 32, 512 x 36, 256 x 72 111"
Pamięć, której zawartość
(tylko w trybie single–port). Jak można
zauważyć, oprócz typowych, „dwójko- nie jest inicjowana przez
użytkownika, po włączeniu
FPGA – co trzeba o nich wiedzieć – tip #11
zasilania zawiera same „0”.
Możliwości konfiguracji pamięci BlockRAM
Warto pamiętać, że w ukławbudowanych w układy Spartan 3 są bardzo
dach
Spartan 3 użytkownicy
duże. Czytelników zainteresowanych poznaniem
mają do dyspozycji – poza
szczegółów zachęcamy do zapoznania się
zespołami BlockRAM – także
z notą katalogową XAPP463 firmy Xilinx,
w której opisano je wszystkie bardzo
małe zespoły pamięci rozpro- Rys. 25. Możliwe tryby pracy pamięci impleszczegółowo.
szone w blokach CLB (alter- mentowanych w BlockRAM
Elektronika Praktyczna 1/2007
99
KURS
Układy FPGA w przykładach,
część 5
Projekty przykładowe
Pierwsze cztery części kursu
dały nam elementarne
wiadomości o architekturze
układów FPGA z rodziny
Spartan 3, a teraz przechodzimy
do przykładowych projektów
przygotowanych w języku VHDL.
Pierwszy przykład wydaje się
być banalny, ale bez niego
trudno nam będzie zagłębić się
w projekty bardziej efektowne.
Zaczynamy od projektu z gatunku
podstawowych w większości typowych
projektów cyfrowych m przedstawimy
sposób wykonania debouncera, czyli
układu likwidującego drgania styków
mikroprzełączników dołączonych do
wejść układu FPGA.
Problem likwidacji drań styków
doskonale znają konstruktorzy, którzy budowali jakiekolwiek układy
reagujące na liczbę naciśnięć przycisków dołączonych do wejść mikrokontrolerów lub dowolnych innych
układów cyfrowych. Dobrym testem,
dogłębnie pokazującym problem jaki
+V
Diody LED
Licznik
CLK kontrolny
Rys. 1. Schemat blokowy układu
umożliwiającego wykrycie drgań
styków przełączników
www.sklep.avt.pl
•
Rys. 2. Skutki drgań styków przełącznika (jeden z przykładowych
wyników rejestracji)
mamy do rozwiązania, jest dołączenie do wejścia zegarowego kilkubitowego licznika styków np. typowego mikroprzełącznika (rys. 1).
Łatwo się można wtedy przekonać,
że jedno naciśnięcie przycisku powoduje zmianę stanu licznika o kilka a w skrajnych przypadkach kilkanaście stanów. Na rys. 2 i rys. 3
pokazano dwa przykładowe przebiegi napięcia na stykach mikroprzełącznika włączonego jak pokazano
na rys. 1, zdjęte za pomocą oscy-
www.sklep.avt.pl
•
www.sklep.avt.pl
•
Rys. 3. Skutki drgań styków przełącznika (inny przykładowy wynik
rejestracji napięcia na stykach
przełącznika)
loskopu cyfrowego. Liczba „przeskoczonych” przez licznik stanów
podczas zdejmowania przedstawionych przebiegów była w obydwu
przypadkach większa niż wynika
to z oscylogramów. Jest to wynik
zbyt małej rozdzielczości poziomej
oscyloskopu zastosowanego do pomiarów m znaczna część „śmieci”
wynikających z drgań styków oscyloskop po prostu zgubił. Nie zmienia to faktu, że przełączniki, także
www.sklep.avt.pl
•
www.sklep.avt.pl
Okazja dla Czytelników EP zainteresowanych układami FPGA
Zestaw sprzętowy wykorzystywany w kursie jest do dostępny do 15.03.2007 na zasadach promocyjnych. Zakup zestawu składającego się z modułów ZL9PLD (uniwersalna płytka bazowa) oraz ZL10PLD
(modułu DIP z układem XC3S200 z rodziny Spartan 3 firmy Xilinx) jest premiowany programatorem
ZL4PRG (odpowiednik DLC III), za pomocą którego można programować i konfigurować w systemie
układy CPLD i FPGA firmy Xilinx.
www.sklep.avt.pl
•
Elektronika Praktyczna 2/2007
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
•
www.sklep.avt.pl
103
KURS
Rys. 4. Symbol graficzny debouncera
pochodzące od renomowanych producentów, całkiem nieźle spełniają
rolę generatorów impulsów quasimlosowych. Bez dodatkowych zabiegów nie da się z nich korzystać do
realizacji zadań, na wynik których
chcielibyśmy mieć wpływ.
Wy b r a n y p r z e z
nas nie jest z całą pewnością najbardziej oszczędny
(jeśli chodzi o zajęte zasoby sprzętowe FPGA), ale ma
wiele praktycznych
zalet m jedną
z nich jest zachowanie czasu trwan i a z w a r c i a s t yków przycisku, co
nie jest możliwe
w wielu prostszych
rozwiązaniach.
Pr z e d s t a w i o n e
rozwiązanie jest
VHDLmową adaptacją propozycji
przedstawionej w pierwszym wydaniu książki „Fundamentals of Digital
Logic” autorstwa Stephena Browna
i Zvonko Vranesica (Kluwer 1995).
Na rys. 4 pokazano symbol graficzny debouncera, którego sposób
List. 1. Opis działania debouncera w języku VHDL
process
begin
wait until (clock_100hz’event) and (clock_100hz = ‚1’);
shift_pb(2 downto 0) <= shift_pb(3 downto 1);
shift_pb(3) <= pb;
case shift_pb is
when „0000” =>
state <= ‚0’;
when „1111” =>
state <= ‚1’;
when others =>
state <= state;
end case;
pb_debounced <= state;
end process;
end;
Realizacja
Możliwych sposobów sprzętowej
likwidacji drgań styków jest bardzo
wiele, podobnie jak ma to miejsce w rozwiązaniach programowych.
Rys. 5. Przykładowa reakcja wyjścia debouncera (przebieg dolny)
na wciśnięcie przycisku (przebieg
górny)
Kompletny projekt dla WebPacka 8.2i wraz
z plikami źródłowymi opublikujemy na
CDmEP3/2007B.
104
działania opisano w języku VHDL
(list. 1). Wejście clock_100hz służy
do podawania sygnału taktującego
o częstotliwości ok. 100 Hz. Można
ją oczywiście zmienić, dostosowując „czułość” debouncera do jakości współpracujących przełączników.
Przeprowadzone próby wykazały, że
Rys. 6. Nawet kilka krótkich impulsów na wejściu debouncera (przebieg górny) nie wywołuje zmiany
stanu na jego wyjściu (przebieg
dolny)
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
• Debouncer
• Klawiatura matrycowa
• Obsługa wyświetlacza multipleksowego LED
• Obsługa wyświetlacza LCD
• Sterownik LCD 2x16 (prosty)
• Sterownik LCD 2x16 (zaawansowany)
• Komunikacja via RS232
i USB
• Sterownik VGA
• Implementacja mikrokontrolera PicoBlaze
zakres 60…150 Hz zapewnia poprawną obsługę także bardzo tanich
(czyli niskiej jakości) mikroprzełączników.
„Odkłócanie” styków przełącznika odbywa się w 4mbitowym rejestrze przesuwającym, który co każdy takt zegara clock_100hz wsuwa
na bit MSB stan wejścia monitorującego przełącznik (pb). Zmiana
stanu na wyjściu pb_debounced,
która oznacza wciśnięcie przycisku
(niezależnie od tego, czy stanem
„po wciśnięciu” jest logiczne 0 czy
też 1), wymaga przesunięcia stanu
odpowiadającego „wciśnięciu” przez
cały rejestr (4 takty sygnału zegarowego), tak samo jak dzieje się po
puszczeniu przycisku. Sposób działania układu powoduje, że odkłócony sygnał wyjściowy jest opóźniony
względem wejściowego o czas odpowiadający 4 taktom sygnału clock_
100hz m rys. 5. W przypadku, gdy
czas impulsu wejściowego (ważne:
nieważna jest jego polaryzacja!) jest
Elektronika Praktyczna 2/2007
KURS
Opisy innych rozwiązań debouncerów
w układach PLD można znaleźć między innymi:
http://microsys6.engr.utk.edu/~hendrich/project/
discussion/inputmswitch/inputmswitchmvhdl.html
http://www.ecgf.uakron.edu/grover/web/ecs465/
labs/pushButtonCounter.pdf
http://www.codecomments.com/
archive378m2005m3m427505.html
http://www.alsemfr.com
List. 2. Opis VHDL „łączący” w całość debouncer, 8mbitowy licznik kontrolny oraz preskaler zapewniający sygnał taktujący dla debouncera
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity debouncer_top is port (
clk : in std_logic;
pbi : in std_logic;
pbo, clk100hz_o : out std_logic;
ledy : inout std_logic_vector(7 downto 0)
);
end debouncer_top;
architecture behavioral of debouncer_top is
component licznik port (
clk: in std_logic;
q: inout std_logic_vector(7 downto 0)
);
end component licznik;
component debouncer port (
clock_100hz, pb: in std_logic;
pb_debounced: inout std_logic
);
end component debouncer;
component preskaler port (
clk : in std_logic;
q : inout std_logic_vector (20 downto 0)
);
end component preskaler;
– debouncera,
– preskalera, który zapewnia właściwą częstotliwość taktowania
debouncera, która jest uzyskiwana z generatora kwarcowego
3,6864 MHz ulokowanego na
płytce ZL10PLD,
– licznika pracującego w trybie
NKB, który jest taktowany z wyjścia debouncera.
Wszystkie wymienione elementy
opisano w języku VHDL i połączono w całość w sposób pokazany na list. 2.
signal clk_int : std_logic;
signal q_presc_int : std_logic_vector(20 downto 0);
begin
cnt: licznik port map (
clk => clk_int,
q => ledy
);
kb_d: debouncer port map (
pb => pbi,
clock_100hz => q_presc_int(15), mm ok. 120 hz
pb_debounced => clk_int
);
presc: preskaler port map (
clk => clk,
q => q_presc_int
);
Podsumowanie
pbo <= clk_int;
clk100hz_o <= clk_int;
end behavioral;
Rys. 7. Debouncer nie reaguje na
naciśnięcia przycisku krótsze niż 4
takty sygnału zegarowego
krótszy niż 4 takty sygnału wejściowego, stan wyjścia pb_debounced
nie zmienia się, jak to pokazano
na rys. 6 i rys. 7.
zestawie składającym się z płytki
bazowej ZL9PLD oraz modułu dipPLD ZL10PLD z układem XC3S200
z rodziny Spartan 3. Jego zasoby są
tak duże, że pewna „rozrzutność”
projektu (uzasadniona walorami
praktycznymi!) jest praktycznie bez
znaczenia.
Żeby zweryfikować faktyczne
możliwości prezentowanego rozwiązania, przygotowano opis zestawu testowego, który składa się z
(rys. 8):
Przedstawiony projekt, jakkolwiek
niezbyt skomplikowany i z pewnością mało efektowny, zapewnia
nam komfortową obsługę klawiatury (w ZL9PLD wykonanej na mikroprzełącznikach). Dobra jakość
i stabilna praca tej części interfejsu
użytkownika pozwoli nam w niedługim czasie zilustrować obsługę jego
drugiej części: różnego rodzaju wyświetlaczy.
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Diody LED
ok. 100 Hz
3,6864 MHz
+V
CLK Preskaler
CLK
PB_DEBOUNCED
Debouncer
PB
Licznik
CLK kontrolny
Implementacja
Zgodnie z zapowiedziami z poprzednich części cyklu, rozwiązanie
prezentowane w artykule zostało zaimplementowane i przetestowane na
Elektronika Praktyczna 2/2007
Rys. 8. Schemat blokowy testera wersyfikującego poprawność działania
debouncera
105
KURS
Układy FPGA w przykładach,
część 6
Projekty przykładowe
Przedstawiamy kolejny projekt
w języku opisu sprzętu VHDL,
tym razem jest to moduł
obsługujący 16–stykową
klawiaturę matrycową
o organizacji 4 wiersze x 4
kolumny. Klawiatury tego
typu są chętnie stosowane
w systemach cyfrowych,
ze względu na możliwość
odczytania stanu 16 przycisków
za pomocą 8 linii FPGA:
czterech wejściowych i czterech
wyjściowych.
Realizacja
plementacjom programowym w mikrokontrolerach.
Układ działa następująco: 4–bitowy licznik CNT zlicza impulsy zeSposób obsługi pojedynczych
garowe podawane na wejście CLK,
przycisków w układach FPGA pokazaa jego wyjścia adresują: wyjścia 2–biliśmy miesiąc temu. W przypadku kotowego (4–wyjściowego) dekodera (na
nieczności zastosowania w prorys. 2 DEKODER, linie kb_cnt3
jektowanym systemie większej
i kb_cnt2) i 4–wejściowego mulliczby przycisków zazwyczaj
tipleksera (linie kb_cnt1 i kb_
stosuje się matrycowe łączenie
cnt0). Na wyjściach dekodera
ich styków. Dzięki temu liczba
stanem aktywnym jest „0”,
linii I/O konieczna do odczytaa wejścia multipleksera są podnia ich stanów jest mniejsza
ciągnięte do plusa zasilania za
niż niezbędna w przypadku
pomocą zewnętrznych rezydołączania pojedynczych przystorów (wewnętrzne rezystory
cisków bezpośrednio do linii
pull–up w układzie FPGA mają
I/O. W prezentowanym produżą rezystancję co powoduje,
jekcie zastosowano 16–przyciże bez zastosowania rezystoskową klawiaturę telefoniczną,
rów zewnętrznych układ jest
której schemat połączeń poka- Rys. 1. Schemat elektryczny połączeń klawiatury
podatny na zakłócenia. Logiczzano na rys. 1. Jak widać, do STD–HT44 (z oferty www.lcel.com.pl
ne „0” pojawia się kolejno na
www.lcel.com.pl) wykorzystanej
jej obsługi wystarczy 8 linii.
kolumnach col0…col3. W przyw projekcie prezentowanym w artykule
104
Schemat blokowy proponowanego rozwiązania przedstawiono na
rys. 2. Jest to rozwiązanie wręcz
podręcznikowe, odpowiadające zarówno klasycznym (dyskretnym)
rozwiązaniom sprzętowym jak i im-
Elektronika Praktyczna 3/2007
KURS
padku zwarcia styków któregoś przycisku na linii odpowiadającego mu wiersza
pojawia się „0” – rys. 3.
Podczas analizowania pracy
układu trzeba pamiętać, że
po wybraniu kolumny skanowane są wszystkie wiersze (do ich adresowania
wykorzystano dwa młodsze
bity licznika CNT). Wykrycie wciśnięcia któregoś
z klawiszy powoduje zatrzymanie licznika CNT
w stanie, w którym wykryro
wciśnięcie – czyli na jego
wyjściach znajduje się adres wciśniętego przycisku.
Sygnał zatrzymujący licznik
(INT) można wykorzystać
do zgłoszenia przerwania
informującego o konieczności obłużenia klawiatury
przez współpracujący np.
mikrokontroler, można go
także wykorzystać – jak
w prezentowanym przykładzie – do wpisania numeRys. 2. Schemat blokowy interfejsu klawiatur
ru wciśniętego klawisza do
matrycowej, który zaimplementowano w ukłarejestru latch, na wyjściach
dzie FPGA (elementy znajdujące się w FPGA
którego jest on utrzymywaznajdują się w szarym obrysie)
ny do kolejnego wciśnięcia.
Jedynym nie zawsze
potrzebnym fragmentem projektu
jest pamięć ROM (jej opis w VHDL
pokazano na list. 1), która spełnia
rolę transkodera. Można ją wykorzystać do przypisania dowolnych
(niekoniecznie 4–bitowych!) kodów
poszczególnym przyciskom klawiatury. Ponieważ w przykładowym
projekcie numerom klawiszy przypisano kody odpowiadające ich adresom, obecność tej pamięci nie
Rys. 3. Ilustracja działania dekodera
jest odczuwalna. Jej opisać można
klawiatury matrycowej przy założezmodyfikować na pzykład w sposób
niu, że wciśnięty jest przycisk o fipokazany na list. 2 co spowoduje,
zycznym adresie „1111” (dwójkowo)
że wciśnięcie przycisku o fizycznym
List. 1. Zastosowany w projekcie przykładowym opis
VHDL pamięci ROM
case kb_cnt is
when “0000”
when “0001”
when “0010”
when “0011”
when “0100”
when “0101”
when “0110”
when “0111”
when “1000”
when “1001”
when “1010”
when “1011”
when “1100”
when “1101”
when “1110”
when “1111”
when others
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
Elektronika Praktyczna 3/2007
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
“0000”;
“0001”;
“0010”;
“0011”;
“0100”;
“0101”;
“0110”;
“0111”;
“1000”;
“1001”;
“1010”;
“1011”;
“1100”;
“1101”;
“1110”;
“1111”;
“––––”;
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
• Debouncer
• Klawiatura matrycowa
• Obsługa wyświetlacza multipleksowego LED
• Obsługa wyświetlacza LCD
• Sterownik LCD 2x16 (prosty)
• Sterownik LCD 2x16 (zaawansowany)
• Komunikacja via RS232
i USB
• Sterownik VGA
• Implementacja mikrokontrolera PicoBlaze
adresie 0 (mapę adresów pokazano
na rys. 1) będzie powodowało wygenerowanie kodu 1111b itd. Na
list. 1 i list. 2 pogrubioną czcionką
zaznaczono miejsca, w których są
określane kody przypisywane poszczególnym przyciskom.
Implementacja
Prezentowany projekt, podobnie
do wszystkich pozostałych z naszego
List. 2. Zmodyfikowany opis VHDL pamięci ROM, który
można zaimplementować w projekcie
case kb_cnt is
when “0000”
when “0001”
when “0010”
when “0011”
when “0100”
when “0101”
when “0110”
when “0111”
when “1000”
when “1001”
when “1010”
when “1011”
when “1100”
when “1101”
when “1110”
when “1111”
when others
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
“1111”;
“1110”;
“1101”;
“1100”;
“1011”;
“1010”;
“1001”;
“1000”;
“0111”;
“0110”;
“0101”;
“0100”;
“0011”;
“0010”;
“0001”;
“0000”;
“––––”;
105
KURS
List. 3. Opis dekodera klawiatury matrycowej z pamięcią ROM pełniącą rolę transkodera
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity kb_mtx is
port (
clk
: in std_logic;
res
: in std_logic;
int
: inout std_logic;
row
: in std_logic_vector (3 downto 0);
col
: out std_logic_vector (3 downto 0);
code_kb_ext : out std_logic_vector (3 downto 0)
);
end kb_mtx;
architecture keys of kb_mtx is
signal kb_cnt
: std_logic_vector (3 downto 0);
signal code_kb_int : std_logic_vector (3 downto 0);
begin
process (clk, int, res)
begin
if (res = ‘0’) then kb_cnt <= «0000»;
elsif (clk’event and clk = ‘1’) then
if (int = ‘1’) then
kb_cnt <= kb_cnt + 1;
end if;
end if;
end process;
col(0)
col(1)
col(2)
col(3)
<=
<=
<=
<=
‘0’
‘0’
‘0’
‘0’
when
when
when
when
kb_cnt(3
kb_cnt(3
kb_cnt(3
kb_cnt(3
downto
downto
downto
downto
2)
2)
2)
2)
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
code_kb_int
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
process (clk, int, code_kb_int, res)
begin
if (res = ‘0’) then
code_kb_ext <= «0000»;
elsif (clk’event and clk = ‘1’ and
code_kb_ext <= code_kb_int;
end if;
end process;
end;
cyklu, uruchomiono i przetestowano na zestawie ZL9PLD i ZL10PLD.
Płytka ZL9PLD to uniwersalna baza,
natomiast ZL10PLD to moduł DIP
z układem XC3S200 z rodziny Spartan 3 firmy Xilinx (nieco więcej pisaliśmy o tych płytkach w pierwszej
części cyklu, w EP10/2006).
Sposób podłączenia klawiatury STD–HT44 do płytki bazowej
ZL9PLD pokazano na rys. 4. Sygnały col(3:0) i row(3:0) można
oczywiście dołączyć do dowolnych
innych, dostępnych wyprowadzeń
106
entity kb_top is port (
clk
: in std_logic;
res
: in std_logic;
int
: inout std_logic;
q_p
: out std_logic;
row
: in std_logic_vector (3 downto 0);
col
: out std_logic_vector (3 downto 0);
code_kb_ext
: out std_logic_vector (3 downto 0)
);
end kb_top;
architecture behavioral of kb_top is
signal q_presc : std_logic_vector (15 downto 0);
=
=
=
=
«00»
«01»
«10»
«11»
with kb_cnt(1 downto 0) select
int <= row(3) when «11»,
row(2) when «10»,
row(1) when «01»,
row(0) when others;
process (kb_cnt)
begin
case kb_cnt is
when «0000»
=>
when «0001»
=>
when «0010»
=>
when «0011»
=>
when «0100»
=>
when «0101»
=>
when «0110»
=>
when «0111»
=>
when «1000»
=>
when «1001»
=>
when «1010»
=>
when «1011»
=>
when «1100»
=>
when «1101»
=>
when «1110»
=>
when «1111»
=>
when others
=>
end case;
end process;
List. 4. Opis w języku VHDL zawierający opis połączeń
pomiędzy preskalerem i modułem obsługi klawiatury
matrycowej
«0000»;
«0001»;
«0010»;
«0011»;
«0100»;
«0101»;
«0110»;
«0111»;
«1000»;
«1001»;
«1010»;
«1011»;
«1100»;
«1101»;
«1110»;
«1111»;
«––––»;
else
else
else
else
‘1’;
‘1’;
‘1’;
‘1’;
component kb_mtx port (
clk
: in std_logic;
res
: in std_logic;
int
: out std_logic;
row
: in std_logic_vector (3 downto 0);
col
: out std_logic_vector (3 downto 0);
code_kb_ext : out std_logic_vector (3 downto 0)
);
end component kb_mtx;
component preskaler port (
clk : in std_logic;
q : inout std_logic_vector (15 downto 0)
);
end component preskaler;
begin
presc: preskaler port map (
clk => clk,
q => q_presc
);
kb_d: kb_mtx port map (
clk => q_presc(14),
res => res,
int => int,
row => row,
col => col,
code_kb_ext => code_kb_ext
);
q_p <= q_presc(14);
end behavioral;
układu FPGA, ale
w projekcie (będzie dostępny na
CD–EP4/2007B)
zastosowano takie właśnie przyint = ‘0’) then
pisania sygnałów.
Implementacja
prezentowanego projektu nie
nadwyrężyła zasobów logicznych układu XC3S200,
bowiem wraz z 15–bitowym preskalerem projekt zajął poniżej 1% dostępnych w nim zasobów. Opis w języku VHDL modułu obsługującego
klawiaturę w konfiguracji pokazanej
na rys. 2 znajduje się na list. 3.
Kompletny projekt, wykorzystany do praktycznego testowania jest
nieco bardziej skomplikowany, bowiem zawiera preskaler, który dzieli częstotliwość generatora kwarcowego 3,6864 MHz (taki jest standardowo instalowany na module
Rys. 4. Sposób dołączenia klawiatury do płytki bazowej ZL9PLD
Elektronika Praktyczna 3/2007
KURS
ZL10PLD) do wartości ok. 112 Hz
(3686400 : 215). Preskaler także opisano w VHDL, a obydwa moduły
połączono w całość za pomocą opisu pokazanego na list. 4. W celach
diagnostycznych, poza niezbędnymi
sygnałami wynikającymi ze schematu pokazanego na rys. 1, w projekcie dodano wejście asynchronicznego zerowania res oraz wyjście
sygnału zegarowego (wyjście preskalera), oznaczone jako q_p. Wyjścia
rejestru latch, w którym jest zatrzaskiwany numer (z wyjścia pamięci
ROM) wciśniętego klawisza, dołączono do diod LED (rys. 5). Diody
LED monitorują także sygnał taktujący moduł obsługi klawiatury oraz
sygnał zgłoszenia przerwania INT.
INT
Uważni Czytelnicy, zwrócą zapewne uwagę na niezbyt czytelny
– na pierwszy rzut oka – spoóśb
taktowania rejestru wyjściowego
latch. Ponieważ rejestr jest – co
jest najbardziej logiczne – taktowany sygnałem INT, najprostszym
sposobem opisania źródła sygnału
taktującego byłoby:
…elsif (clk’event and clk = ‘1’ and
int = ‘0’) then…
Zastosowano bowiem synchronizację sygnałem zegarowym clk, który zapobiega asynchronizacji sygnału
INT, wytwarzanego w układzie kombinacyjnym, co wynika z opisu:
with kb_cnt(1
int <= row(3)
row(2)
row(1)
row(0)
downto 0) select
when „11”,
when „10”,
when „01”,
when others;
Taki sposób synchronizacji ma
szczególny sens w przypadkach,
kiedy układ FPGA pracuje na skraju swoich możliwości czasowych
(czyli z całą pewnością nie w tym
projekcie). Ta drobna komplikacja
ma na celu pokazanie Czytelnikom
poprawnego stylu opisu, przy czym
obydwie przedstawione wersje będą
działały, przy tak niskiej częstotliwości taktowania, prawidłowo.
Na rys. 6 i rys. 7 pokazano
przykładowe przebiegi na wyjściach
układu FPGA po zaimplementowaniu w nim projektu.
Podsumowanie
Przedstawiony w artykule projekt
– jak większość przygotowanych
w językach HDL – jest podatny
natomiast na list. 3 widać:
na różne modyfikacje. Jak wspomniano wcześniej,
można zmodyfikować zawartość
transkodującej pamięci ROM, sposób adresowania
styków klawiatury
czy przypisanie
sygnałów do wyprowadzeń układu
FPGA, można także dodać sygnalizację akustyczną
Rys. 5. Funkcje LED na płytce ZL9PLD po zaimplewciśnięcia przycimentowaniu projektu opisanego w artykule
sku (brzęczyk pie….elsif (int’event and int = ‘0’)
then….
Rys. 6. Sygnał INT (na dole) pojawia się z opóźnieniem, zależnym
od chwili naciśnięcia przycisku (na
górze linia col3)
Rys. 7. Przykładowe zależności
czasowe pomiędzy sygnałem INT
(na górze) i odpowiedzią na wyjściu
rejestru latch
zoelektryczny znajduje się na płytce ZL9PLD).
Wszystkich Czytelników, którzy
podejmą samodzielne próby modyfikacji udostępnionego projektu lub
przygotują własne – zapraszamy
do podzielenia się z nami swoimi
opracowaniami.
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Kompletny projekt dla WebPacka 8.2i wraz
z plikami źródłowymi opublikujemy na
CD–EP4/2007B.
Serdecznie zapraszamy naszych Czytelników
do odwiedzenia naszego stoiska E6
na targach Automaticon 2007 w warszawskim
Centrum EXPO XXI znajdującym się przy
ul. Prądzyńskiego 12/ 14 (Wola, wjazd ul. Bema
od ul. Kasprzaka) w dniach 13...16 marca
w godz. 9.00 – 17.00, piatek 9.00 – 15.00.
Wstęp wolny
Elektronika Praktyczna 3/2007
107
KURS
Układy FPGA w przykładach,
część 7
Projekty przykładowe
W tym odcinku kursu pokażemy
przykładowy projekt sterownika
4–cyfrowego, 7–segmentowego
wyświetlacza LED. Jest to
kolejny typowy element systemu
cyfrowego, często wykorzystywany
w praktycznych aplikacjach,
w których często stanowi istotny
element interfejsu użytkownika.
Rys. 1. Schemat ilustrujący zasadę działania sterownika multipleksowego
Rys. 2. Schemat blokowy projektu zaimplementowanego w FPGA
Elektronika Praktyczna 4/2007
Idea multipleksowego sterowania
wyświetlaczy jest stosunkowo stara,
bowiem tego typu sposoby sterowania
stosowano już w latach ’60 ubiegłego
wieku w systemach z wyświetlaczami
Nixie. Podstawową zaletą takiego systemu sterowania wyświetlaczy jest minimalizacja liczby wyprowadzeń układu sterującego. Przykładowo, w przypadku pola 4–cyfrowego sterowanego
w sposób standardowy, konieczne jest
co najmniej 28 linii sterujących (4
cyfry x 7 segmentów). W prezentowanym przykładzie sterownika multipleksowego wystarczy 11 linii sterujących
(7 do sterowania segmentami + 4 do
sterowania elektrodami wspólnymi),
a jeszcze lepsze są osiągane przy zespołach wyświetlaczy o większej liczbie cyfr.
Ideę wyświetlania multipleksowego
zilustrowano na rys. 1 (pokazany sposób sterowania jest charakterystyczny
dla wyświetlaczy ze wspólną anodą).
Jak widać, konieczne jest zsynchronizowanie „włączania” anod z podaniem odpowiedniej dla wyświetlanego
znaku kombinacji stanów na katody diod podświetlających segmenty.
Sekwencyjne zapalanie każdej cyfry
z odpowiednio dużą częstotliwością
(w przykładzie ok. 100 Hz) wywołuje
wrażenie ciągłego świecenia wszystkich znaków.
Zapraszamy do współpracy!
Wszystkich Czytelników interesujących się
układami FPGA zachęcamy do prezentacji na
łamach EP własnych rozwiązań. Odpowiemy
także na wszelkie pytania związane z kursem,
językiem VHDL i układami FPGA.
97
KURS
Konfigurowanie FPGA i programowanie konfiguratora Flash
Przygotowywanie plików do konfiguracji
układu FPGA i programowania
konfiguratora Flash
Z listów otrzymanych od Czytelników wynika, że wielu z nich ma spore problemy z prawidłowym skonfigurowaniem układu FPGA i zaprogramowaniem pamięci Flash spełniającej
w zestawie ZL10PLD rolę konfiguratora.
Pokażemy zatem krok po kroku jak sobie
poradzić z podstawowymi problemami występującymi na tym etapie implementacji projektów,
które w większości przypadków wynikają ze
stosunkowo mało zrozumiałego (przynajmniej na
początku pracy z FPGA) rozdzielenia programowania (konfiguratora Flash) od konfigurowania
(układu FPGA).
Krótko od podstaw
Jak wspomnieliśmy w pierwszym odcinku kursu (EP10/2006), układy FPGA z rodziny
Spartan 3 mają wewnętrzną pamięć konfiguracji
typu SRAM, co wymaga każdorazowo po włączeniu zasilania układu odtworzenia jej zawartości z zewnętrznej pamięci nieulotnej (zazwyczaj,
także w przypadku kursowego zestawu ZL10PLD
– jest to pamięć Flash).
Konieczne jest więc zapewnienie możliwości:
– bezpośredniego modyfikowania zawar tości
pamięci konfiguracji FPGA (SRAM),
– programowania pamięci Flash po zainstalowaniu jej w systemie,
– skopiowania zawar tości pamięci
Flash do SRAM (pamięci konfiguracji FPGA).
Firma Xilinx w układach Spartan 3
problem rozwiązała w sposób pokazany
Automatycznie wykryta przez
program iMPACT konfiguracja
łańcucha JTAG w zestawie
ZL10PLD
Sposób połączenia układu FPGA
i konfiguratora Flash w zestawie
ZL10PLD
programator.
Pozostaje do omówienia ostatni problem:
skąd FPGA ma wiedzieć, z jakiego źródła zostaną przesłane dane konfiguracyjne? Otóż do tego
celu służą w układzie FPGA specjalne wejścia
M2…M0, które na płytce ZL10PLD połączono
w taki sposób, że za pomocą jednego jumpera
JP4 (rysunek poniżej) można wybrać jeden
z dwóch trybów pracy:
– automatycznego (po włączeniu zasilania)
kopiowania zawartości Flash do FPGA,
– oczekiwania na dane konfigurujące
z JTAG–a.
Konfigurowanie układu FPGA
Konfigurowanie układu FPGA za pomocą
interfejsu JTAG jest zalecane przede wszystkim
podczas prac projektowych, bowiem liczba
konfiguracji (czyli wpisów do pamięci konfiguracji typu SRAM) nie jest niczym ograniczona
(w przeciwieństwie do pamięci Flash, którą
można kasować i programować skończoną,
choć niemałą, liczbę razy).
Do skonfigurowania układu FPGA jest konieczny plik o rozszerzeniu *.isc, który jest generowany przez proces Generate Programming
File pakietu WebPack ISE. Ponieważ ustawienia domyślne nie powodują utworzenia takiego pliku, trzeba we właściwościach (Process
Properties>General Options) procesu Generate
Programming File uaktywnić opcję Create
IEEE1532 Configuration File (jak na rysunku
poniżej).
W zakładce General Options
okna Process Properties
(dla procesu Generate
Programming File) trzeba
uaktywnić generację pliku
*.isc, który posłuży nam do
konfigurowania FPGA
Na fragmencie schematu płytki ZL10PLD zaznaczono na szaro
dołączenie zworki JP4, która umożliwia wybranie sposobu konfiguracji
FPGA. Pokazano także sposób dołączenia konfiguratora U2 do układu
FPGA, przycisku S1 służącego do ręcznego wymuszania rekonfiguracji
oraz diody świecącej D1, która służy do sygnalizacji poprawnego
zakończenia konfiguracji FPGA
na poniższym rysunku:
Konfigurator XCF01S jest wyposażony w dwa inter fejsy umożliwiające
wymianę danych z otoczeniem:
– 5–liniowy, służący do przesyłania
przechowywanych do FPGA po włączeniu
zasilania,
– JTAG, który służy do programowania pamięci Flash za pomocą zewnętrznego programatora.
Także w układzie XC3S200 (FPGA z rodziny
Spar tan 3, zastosowany w module ZL10PLD)
występuje interfejs umożliwiający współpracę
z konfiguratorem oraz interfejs JTAG, za pomocą którego jest konfigurowana pamięć SRAM
w FPGA.
Inter fejsy JTAG obydwu układów są połączone w szereg, tworząc tzw. łańcuch JTAG.
Dzięki temu dostęp do tych układów jest możliwy za pomocą jednego programatora, dołączonego do pojedynczego złącza JTAG. Na
98
poniższym rysunku pokazano sposób połączenia
układu XC3S200 z pamięcią XCF01S, który automatycznie ustalił program iMPACT obsługujący
Żeby konfigurowany za
pomocą inter fejsu JTAG układ
FPGA poprawnie rozpoczął
swoją pracę (po zakończeniu
konfigurowania), trzeba zmienić
domyślne ustawienie w oknie
Process Properties>Startup
Options w polu FPGA Start–up
Clock (jak na rysunku poniżej) z CCLK na JTAG Clock.
Zaniechanie tej czynności przed
skompilowaniem projektu spowoduje występujące losowo
>>
„zawieszanie” się FPGA.
Na zdjęciu poniżej pokazano lokalizację
jumpera JP4 na płytce zestawu ZL10PLD wraz
z opisami pozycji, w których konfiguracja FPGA
odbywa się poprzez interfejs JTAG (JTAG) i automatycznie po włączeniu zasilania z konfiguratora (Flash).
Zworka JP4 umożliwia wybór trybu konfiguracji
FPGA (poprzez JTAG lub automatyczne
odtworzenie konfiguracji z pamięci Flash)
W przypadku konfigurowania FPGA za pomocą
interfejsu JTAG trzeba zmienić ustawienie
FPGA Start–up Lock na JTAG Clock,
w przeciwnym przypadku układ może nie
rozpocząć pracy po zakończeniu konfiguracji
Elektronika Praktyczna 4/2007
KURS
Realizacja
Programowanie konfiguratora (Flash)
Jak już wielokrotnie wspominaliśmy, konfigurator (czyli pamięć Flash z interfejsem szeregowym i – w przypadku układu XCF01S
– także JTAG) służy do przechowywania danych opisujących konfigurację FPGA. Do jego
zaprogramowania niezbędny jest plik *.mcs,
który trzeba „ręcznie” utworzyć za pomocą
programu iMPACT, wchodzącego w skład standardowej instalacji pakietu WebPack ISE. iMPACT musi być uruchomiony w trybie Prepare
a PROM File (rysunek poniżej), kolejne kroki
narzuca użytkownikowi kreator.
Utworzenie pliku *.mcs umożliwia program
iMPACT, który należy uruchomić w trybie
Prepare a PROM File
Żeby zapewnić poprawny restar t układu
FPGA po jego skonfigurowaniu z pamięci Flash,
ustawienie FPGA Start–up Lock musi być
CCLK. Jeżeli ostatnia kompilacja została przeprowadzona z innym ustawieniem, program iMPACT „zauważy” błąd użytkownika, ostrzeże go
(rysunek poniżej) i samoczynnie zmieni fragment pliku *.mcs w taki sposób, żeby układ
FPGA po skonfigurowaniu działał poprawnie.
Schemat blokowy proponowanego rozwiązania pokazano na rys. 2.
Jest to typowe rozwiązanie sterownika multipleksowego, w którym
rozdzielono (opisano w osobnych
plikach *.vhd) dekodery wyjściowe
(cyfr i segmentów) od sterownika,
w którym zintegrowano (rys. 3):
– 16–bitowy rejestr latch, który
służy do przechowywania kodów 4 liczb BCD wyświetlanych na wyświetlaczu,
– 2–bitowy licznik numeru wyświetlanej cyfry,
– multiplekser 16–>4, który podaje na zewnętrzny dekoder (sterujący segmentami wyświetlaczy) 4–bitowe słowo odpowiadające wyświetlanej pozycji.
Tak więc, budowa prezentowanego sterownika jest bardzo podobna do klasycznych realizacji,
wykonywanych na układach TTL/
CMOS. Wykorzystanie opisu HDL
zwiększa elastyczność projektu, bowiem jakiekolwiek jego modyfikacje
(zmiana polaryzacji wyświetlaczy
z WA na WK, zmiana liczby obsługiwanych wyświetlaczy, zmiana
kształtów wyświetlanych znaków
Plan kursu
1. Wprowadzenie
• Budowa zestawu uruchomieniowego
• Programowanie i konfiguracja
układu XC3S200
• Tryby konfiguracji układu
XC3S200
• Zasilanie układu XC3S200
• Linie I/O w układzie XC3S200
• JTAG jako uniwersalny
interfejs do programowania
i konfigurowania
2. Budowa, cechy funkcjonalne
i parametry układów FPGA
z rodziny Spartan 3
• CLB
• IOB
• Globalne sygnały zegarowe
• DCM
• Sprzętowe multiplikatory
• Pamięć BlockRAM
3. Projekty przykładowe
• Debouncer
• Klawiatura matrycowa
• Obsługa wyświetlacza multipleksowego LED
• Obsługa wyświetlacza LCD
• Sterownik LCD 2x16 (prosty)
• Sterownik LCD 2x16 (zaawansowany)
• Komunikacja via RS232
i USB
• Sterownik VGA
• Implementacja mikrokontrolera PicoBlaze
Ostrzeżenie o nieprawidłowo wybranym źródle
sygnału zegarowego inicjującego start FPGA
po konfiguracji
Okno programu iMPACT po wygenerowaniu
pliku *.mcs służącego do programowania
pamięci Flash konfiguratora
Rys. 3. Funkcje spełniane przez fragmenty opisu w pliku sterownik.vhd
Elektronika Praktyczna 4/2007
99
KURS
3 … 3 , 2 V, c o p r z y
zasilaniu segmentów
napięciem ok. 3,3 V
zapewnia przepływ
prądu o natężeniu
nie przekraczającym
(w egzemplarzu modelowym) 3,5 mA.
Elektrody wyświetlaczy (anody i katody) są sterowane
bezpośrednio z wyjść
FPGA (bez jakichk o l w i e k b u f o r ó w,
rys. 4), co upraszcza
budowę urządzenia
i minimalizuje liczbę
niezbędnych elementów.
Implementacja
Rys. 4. Sposób dołączenia wyświetlacza do układu FPGA
Zastosowany w projekcie wyświetlacz LED
(TOF–5462DB–B) jest przystosowany do pracy
w systemach ze sterowaniem multipleksowym,
niezbędne połączenia segmentów są wykonane
w jego wnętrzu. Na rysunku poniżej pokazano
schemat połączeń wewnętrznych.
Dodatkowe informacje: http://www.artronic.
com.pl/o_produkcie.php?id=656?, dystrybutor
oferuje wersje świecące na różne kolory.
itp.) wiąże się z wprowadzeniem
niewielkich modyfikacji w opisie
(przykład pokażemy w dalszej części artykułu). Możliwe jest także
przygotowanie uniwersalnego opisu
z parametryzacją, co – jeśli Czytelnicy wykażą zainteresowanie tematem – pokażemy w jednym z kolejnych odcinków kursu.
W przykładowym projekcie wykorzystano bardzo wygodny w praktyce wyświetlacz TOF–5462DB–B,
który jest przystosowany do sterowania multipleksowego, bowiem
segmenty poszczególnych znaków
są ze sobą wewnętrznie połączone.
Zastosowano wyświetlacz świecący
na kolor niebieski, bowiem pozwoliło to uniknąć konieczności stosowania rezystorów ograniczających
prąd segmentów. Wynika to z faktu,
że napięcie progowe struktur świecących na niebiesko wynosi ok.
100
List. 1. Modyfikacja dekodera sterującego wyświetlacz LED (ze wspólną anodą): po lewej stronie
pokazano opis dekodera znaków 0…9, po prawej
0…F
LEWA STRONA
with bcd select
––
g f e d c b
segm <= „1000000”
„1111001”
„0100100”
„0110000”
„0011001”
„0010010”
„0000010”
„1111000”
„0000000”
„0010000”
„1111111”
a
when
when
when
when
when
when
when
when
when
when
when
„0000”,
„0001”,
„0010”,
„0011”,
„0100”,
„0101”,
„0110”,
„0111”,
„1000”,
„1001”,
others;
––
––
––
––
––
––
––
––
––
––
––
0
1
2
3
4
5
6
7
8
9
wygaszenie
PRAWA STRONA
with bcd select
––
g f e d c b
segm <= „1000000”
„1111001”
„0100100”
„0110000”
„0011001”
„0010010”
„0000010”
„1111000”
„0000000”
„0010000”
„0001000”
„0000011”
„0000110”
„0100001”
„0000110”
„0001110”
„1111111”
a
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
„0000”,
„0001”,
„0010”,
„0011”,
„0100”,
„0101”,
„0110”,
„0111”,
„1000”,
„1001”,
„1001”,
„1001”,
„1001”,
„1001”,
„1001”,
„1001”,
others;
––
––
––
––
––
––
––
––
––
––
––
––
––
––
––
––
––
0
1
2
3
4
5
6
7
8
9
10 “A”
11 “B”
12 “C”
13 “D”
14 “E”
15 “F”
wygaszenie
Projekt zaimplementowany w testowym zestawie, poza
s t e r o w n i k i e m w yświetlaczy, zawiera
t a k ż e 4 – d e ka d o w y
licznik BCD (zliczający impulsy z wyjścia preskalera,
jego stany wyjściowe podglądamy
na wyświetlaczach) oraz 20–bitowy
preskaler (w projekcie wykorzystano
18 bitów), który służy do wytworzenia sygnałów zegarowych dla
zespołu liczników i sterownika wyświetlacza.
Strukturę projektu (w plikach)
pokazano na rys. 5. Widoczny na
tym rysunku plik projekt7.ucf zawiera przypisania sygnałów do fizycznych wyprowadzeń układu FPGA.
Podsumowanie
Wielokrotnie podkreślana duża
elastyczność opisów HDL dotyczy także tego projektu. Na list. 1
pokazano modyfikację dekodera
7–segmentowego, który w wersji
pokazanej po lewej stronie wyświetla znaki wyłącznie z zakresu
0…9 (dla wartości 10…15 wyświetlacz jest wygaszony), po prawej
stronie pokazano zmodyfikowana
wersję wyświetlającą także znaki
A...F (w formie możliwej na wyświetlaczu 7–segmentowym). Inną
możliwą modyfikacją jest dostosowanie sterownika do współpracy
z wyświetlaczami ze wspólną katodą, co wymaga zanegowania wyjść
dekodera znaków i segmentów, np.
(odnosi się do pliku dek_znaku.
vhd) opis:
with nr_znaku select
dig <= „0001” when „00”,
cyfra 0 (jedn.)
………………
––
można zastąpić opisem:
with nr_znaku select
dig <= „1110” when „00”,
cyfra 0 (jedn.)
………………
––
można także zanegować stany
wyjściowe za pomocą operacji not.
Podobnych modyfikacji można
wykonać wiele: jeżeli któryś z Czytelników chciałby pochwalić się
własnymi rozwiązaniami – zapraszamy!
Jacek Majewski
[email protected]
Piotr Zbysiński, EP
[email protected]
Rys. 5. Budowa prezentowanego
projektu z podziałem na pliki z opisami VHDL
Elektronika Praktyczna 4/2007

Podobne dokumenty