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