Układy FPGA w przykładach, część 1



Podobne dokumenty
Układy FPGA w przykładach, część 2

Układy FPGA w przykładach, część 1

ZL10PLD. Moduł dippld z układem XC3S200

ZL6PLD zestaw uruchomieniowy dla układów FPGA z rodziny Spartan 3 firmy Xilinx

LABORATORIUM TECHNIKA CYFROWA. Pamięci. Rev.1.35

Programowanie Układów Logicznych kod kursu: ETD6203 W dr inż. Daniel Kopiec. Pamięć w układach programowalnych

LABORATORIUM UKŁADÓW PROGRAMOWALNYCH

LITEcomp. Zestaw uruchomieniowy z mikrokontrolerem ST7FLITE19

ZL25ARM. Płyta bazowa dla modułów diparm z mikrokontrolerami STR912. [rdzeń ARM966E-S]

ZL8AVR. Płyta bazowa dla modułów dipavr

STM32Butterfly2. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

ZL9ARM płytka bazowa dla modułów diparm z mikrokontrolerami LPC213x/214x

Układy reprogramowalne i SoC Implementacja w układach FPGA

Układy reprogramowalne i SoC Specjalizowane moduły FPGA

ZL9AVR. Płyta bazowa dla modułów ZL7AVR (ATmega128) i ZL1ETH (RTL8019)

Technika Mikroprocesorowa

ZL4PIC. Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

mgr inż. Maciej Rudek opracował: dr inż. Daniel Kopiec

STM32 Butterfly. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

Programowalne Układy Cyfrowe Laboratorium

Opis przedmiotu zamówienia CZĘŚĆ 1

Kierunek Inżynieria Akustyczna, V rok Programowalne Układy Cyfrowe. Platforma sprzętowa. Rajda & Kasperek 2014 Katedra Elektroniki AGH 1

LITEcompLPC1114. Zestaw ewaluacyjny z mikrokontrolerem LPC1114 (Cortex-M0) Sponsorzy:

ZL4PIC. Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

Systemy Czasu Rzeczywistego FPGA

ZL11ARM. Uniwersalna płytka bazowa dla modułów diparm

Temat: Pamięci. Programowalne struktury logiczne.

Wykorzystanie standardu JTAG do programowania i debugowania układów logicznych

ZL4PIC uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC (v.1.0) Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

Systemy Czasu Rzeczywistego FPGA

Tab. 1. Zestawienie najważniejszych parametrów wybranych mikrokontrolerów z rodziny LPC2100, które można zastosować w zestawie ZL3ARM.

ZL2ARM easyarm zestaw uruchomieniowy dla mikrokontrolerów LPC2104/5/6 (rdzeń ARM7TDMI-S)

ZL29ARM. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

Zaliczenie Termin zaliczenia: Sala IE 415 Termin poprawkowy: > (informacja na stronie:

Opis przedmiotu zamówienia

2. Architektura mikrokontrolerów PIC16F8x... 13

ZL11PRG v.2. Uniwersalny programator ISP. Odpowiednik: Byte Blaster II DLC5 Programmer AT89ISP STK-200 Lattice ISP ARM Wiggler

XC4000: LUT jako ROM Układy Cyfrowe i Systemy Wbudowane 2 Układy FPGA cz. 2 ROM32X1 VHDL inference example ROM 16x2b type

ZL2ARM easyarm zestaw uruchomieniowy dla mikrokontrolerów LPC2104/5/6 (rdzeń ARM7TDMI-S)

MAXimator. Zestaw startowy z układem FPGA z rodziny MAX10 (Altera) Partnerzy technologiczni projektu:

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 8 (3h) Implementacja pamięci ROM w FPGA

Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów AVR

Wstęp Architektura... 13

SigmaDSP - zestaw uruchomieniowy dla procesora ADAU1701. SigmaDSP - zestaw uruchomieniowy dla procesora ADAU1701.

Systemy Czasu Rzeczywistego FPGA

Siła (w) pamięci on-chip Implementacje pamięci w układach Cyclone IV firmy Altera

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Zestaw uruchomieniowy z mikrokontrolerem LPC1114 i wbudowanym programatorem ISP

SML3 październik

ZL28ARM. Zestaw uruchomieniowy dla mikrokontrolerów AT91SAM7XC

Projektowanie z użyciem bloków funkcjonalnych w układach programowalnych firmy Xilinx

Projektowanie układów FPGA. Żródło*6+.

ZL1MSP430 Zestaw startowy dla mikrokontrolerów MSP430F11xx/11xxA ZL1MSP430

NXP ma nowe ARM-y. BlueStreak: co i jak

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 4 (3h) Przerzutniki, zatrzaski i rejestry w VHDL

ZL27ARM. Zestaw uruchomieniowy dla mikrokontrolerów STM32F103

mgr inż. Maciej Rudek opracował: dr inż. Daniel Kopiec

Programowanie Mikrokontrolerów

ISP ADAPTER. Instrukcja obsługi rev.1.1. Copyright 2009 SIBIT

ZL2AVR. Zestaw uruchomieniowy z mikrokontrolerem ATmega8

Programowalne układy logiczne

AVREVB1. Zestaw uruchomieniowy dla mikrokontrolerów AVR. Zestawy uruchomieniowe

dokument DOK wersja 1.0

ADuCino 360. Zestaw uruchomieniowy dla mikrokontrolerów ADuCM360/361

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja. do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1.

Aby w pełni przetestować układ o trzech wejściach IN_0, IN_1 i IN_2 chcemy wygenerować wszystkie możliwe kombinacje sygnałów wejściowych.

ZL11AVR. Zestaw uruchomieniowy z mikrokontrolerem ATtiny2313

To nie huragan, to Cyclone II!

Altera Quartus II. Opis niektórych komponentów dostarczanych razem ze środowiskiem. Opracował: mgr inż. Leszek Ciopiński

ZL6ARM Zestaw uruchomieniowy dla mikrokontrolerów LPC213x. Tab. 1. Zestawienie najważniejszych parametrów wybranych mikrokontrolerów z rodziny LPC213x

Altera MAX10: nowa generacja FPGA i jej nowe możliwości

ZL19PRG. Programator USB dla układów PLD firmy Altera

System on Chip na miarę S P R Z Ę T

Projekt prostego procesora

AVR DRAGON. INSTRUKCJA OBSŁUGI (wersja 1.0)

Podział układów cyfrowych. rkijanka

Mikrokontrolery AVR techniczne aspekty programowania

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

PROGRAMOWALNE STEROWNIKI LOGICZNE

Płytka uruchomieniowa AVR oparta o układ ATMega16/ATMega32. Instrukcja Obsługi. SKN Chip Kacper Cyrocki Page 1

Systemy uruchomieniowe

Lista zadań nr 1. Zagadnienia stosowanie sieci Petriego (ang. Petri net) jako narzędzia do modelowania algorytmów sterowania procesami

Systemy Wbudowane. Arduino - rozszerzanie. Podłączanie wyświetlacza LCD. Podłączanie wyświetlacza LCD. Podłączanie wyświetlacza LCD

Elementy cyfrowe i układy logiczne

Programowalne układy logiczne Wydziałowy Zakład Nanometrologii SEMESTR LETNI

ZL15AVR. Zestaw uruchomieniowy dla mikrokontrolerów ATmega32

Układy reprogramowalne i SoC Język VHDL (część 4)

E-TRONIX Sterownik Uniwersalny SU 1.2

Cyfrowe układy scalone

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Ćwiczenie 1 VHDL - Licznik 4-bitowy.

WOJSKOWA AKADEMIA TECHNICZNA im. Jarosława Dąbrowskiego LABORATORIUM UKŁADÓW PROGRAMOWALNYCH I SPECJALIZOWANYCH

Cyfrowe układy scalone

Uniwersalny zestaw uruchomieniowy ZL4PIC

Terminal TR01. Terminal jest przeznaczony do montażu naściennego w czystych i suchych pomieszczeniach.

LABORATORIUM UKŁADÓW PROGRAMOWALNYCH Wydziałowy Zakład Metrologii Mikro- i Nanostruktur SEMESTR LETNI 2016

PSM niebanalne Flashe

Programator ICP mikrokontrolerów rodziny ST7. Full MFPST7. Lite. Instrukcja użytkownika 03/09

ARMputer, część 1 AVT 922

KAmduino UNO. Rev Źródło:

Transkrypt:

Układy FPGA w przykładach, część 1 K U R S 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. 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. Kursowa platforma sprzętowa 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, generatorem 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 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 www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl Elektronika Praktyczna 10/2006 89

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 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 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 pamięć 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

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. Programowanie i konfigurowanie FPGA Część z informacji prezentowanych w tej części artykułu publikowaliśmy już w EP. Powtarzamy je, żeby zapewnić 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 charakterystyce 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. 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- Elektronika Praktyczna 10/2006 91

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 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 LVC- MOS25) dla wszystkich wyspecjalizowanych linii I/O wykorzystywanych podczas konfiguracji układu ( s ą t o : P R O G _ B, T D I, T M S, T C K, TDO, CCLK, DONE, M0, M1, M2 oraz H S W A P _ E N tab. 1). 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 (I REV na rys. 6) z linii zasilającej V CCAUX. 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. Rys. 6. Konfiguracja zabezpieczeń na liniach I/O FPGA może wymusić konieczność stosowania dodatkowych rezystorów 92 Elektronika Praktyczna 10/2006

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. Tab. 1. Maksymalne napięcia wejściowe wybranych linii specjalnych oraz wielofunkcyjnych Nazwa linii Maksymalne napięcie wejściowe [V] Odnośny biegun zasilania I/O PROG_B 2,5 HSWAP_EN 2,5 TDI 2,5 TMS 2,5 TCK 2,5 TDO 2,5 CCLK 2,5 DONE 2,5 M0 2 2,5 INIT_B = VCCO_4 VCCO_4 DOUT = VCCO_4 VCCO_4 BUSY = VCCO_4 VCCO_4 DIN = VCCO_4 VCCO_4 D0 3 = VCCO_4 VCCO_4 D4 7 = VCCO_4 VCCO_5 RDWR_B = VCCO_4 VCCO_5 CS_B = VCCO_4 VCCO_5 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 synchronizują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- Tab. 2. Możliwe tryby konfiguracji układów Spartan 3 Nazwa trybu konfiguracji M0 M1 M2 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 V CCINT, V CCO_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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl Sygnał synchronizujący Szerokość magistrali danych Master Serial 0 0 0 CCLK (wy) 1 Slave Serial 1 1 1 CCLK (we) 1 Master Parallel 1 1 0 CCLK (wy) 8 Slave Parallel 0 1 1 CCLK (we) 8 JTAG 1 0 1 TCK (we) 1 Elektronika Praktyczna 10/2006 93

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 U k ł a d y F P G A (Field Programmable Gate Array) to jeden z dwóch (drugi to układy mniejszej skali integracji CPLD, czyli Complex Prog r a m m a b l e L o g i c Devices), produkowanych obecnie, rodzajów układów PLD (Programmable Logic Devices). Układy te charakteryzują się regularną budową, opartą (w przypadku Rys. 8. Budowa komórki logicznej CLB w układach 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 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. 92 Elektronika Praktyczna 11/2006

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; 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 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 Elektronika Praktyczna 11/2006 93

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 Typ układu XC3S50 XC3S200 XC3S400 XC3S1000 XC3S1500 XC3S2000 XC3S4000 XC3S5000 Liczba bramek przeliczeniowych 50000 200000 400000 1000000 1500000 2000000 4000000 5000000 Liczba komórek logicznych 1728 4320 8064 17280 29952 46080 62208 74880 Sprzętowe multiplikatory 4 12 16 24 32 40 96 104 Pojemność pamięci Block 72 kb 216 kb 288 kb 432 kb 576 kb 720 kb 1728 kb 1872 kb RAM Pojemność pamięci rozproszonej 12 kb 30 kb 56 kb 120 kb 208 kb 320 kb 432 kb 520 kb Distributed RAM Liczba DCM 2 4 4 4 4 4 4 4 Maksymalna liczba różnicowych linii I/O 56 76 116 175 221 270 312 344 Maksymalna liczba asymetrycznych linii I/O 124 173 264 391 487 565 712 784 94 Elektronika Praktyczna 11/2006

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 www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl Elektronika Praktyczna 11/2006 95

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 ulokowano 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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl 96 Elektronika Praktyczna 11/2006

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. Rys. 12. Budowa komórki IOB 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ś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. K a ż d y b l o k I O B w y p o s a ż o n o w r e z y- story podciągające pull up i pull down, które użytkownik może indywidualnie uaktywniać i odłą- 100 Elektronika Praktyczna 12/2006

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 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 SLE- W=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 można wykonać za pomocą edytora tekstowego lub w wielu przypadkach jest to wygodniejsze za pomocą edytora wymuszeń XilinxPACE, zintegrowanego w pakiecie WebPack ISE (rys. 13). Jak widać na rys. 12, każda linia I/O została zabezpieczona przed uszkodzeniem ESD za pomocą diod włączonych szeregowo zaporowo. Powoduje to ograniczenie maksymalnego napięcia na wejściu do wartości z przedziału ok. VCCO 0,5 V VCCO + 0,5 V, nie ma więc możliwości bezpośredniej współpracy ze standardowymi układami TTL lub CMOS zasilanymi napięciem 5 V. Użytkownicy zamierzający łączyć ze sobą układy Spartan 3 z układami Rys. 14. Możliwe konfiguracje I/O z aktywnym modułem DCI zasilanymi napięciem wyższym niż 3,3 V powinni zastosować konwertery poziomów (w konwerterach jednokierunkowych układy TTL z rodziny LVC/LCX) lub (zdecydowanie gorsze rozwiązanie) 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. FPGA co trzeba o nich wiedzieć tip #7 Sygnały globalne Do dystrybucji sygnałów taktujących w układach FPGA jest zalecane wykorzystywanie globalnych linii zegarowych. Należy do nich dołączać możliwie duże grupy elementów taktowanych tym samym sygnałem zegarowym. Elektronika Praktyczna 12/2006 101

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 (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 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 Generalna zasada 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 jednocześ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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl Rys. 16. Budowa systemu dystrybucji sygnałów zegarowych w układach Spartan 3 Rys. 17. Atrybut globalności można nadać wybranej linii sygnałowej także w edytorze schematów 102 Elektronika Praktyczna 12/2006

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. Rys. 18. Zbocza sygnałów zegarowych występują w różnych miejscach FPGA w różnym czasie, co może spowodować nieprawidłowe działanie układu Generatory wewnętrznych sygnałów zegarowych DCM Najpoważniejszym kłopotem dla konstruktorów stosujących w swoich projektach układy FPGA jest odpowiednie taktowanie wprojektowanych w nie obwodów. Budowa FPGA powoduje, że elementy logiczne rozmieszczone na powierzchni struktury półprzewodnikowej, pomimo taktowania sygnałem zegarowym pochodzącym z jednego źródła, nie są taktowane jednocześnie (rys. 18), bowiem różny jest czas dystrybucji sygnału w zależności od trasy jaką pokonuje (czyli jakiego rodzaju zasoby połączeniowe wykorzystano do jego transportu), odległości pomiędzy źródłem i celem, a także liczby wejść taktowanych jednocześnie w danym segmencie ścieżki połączeniowej. Aby zminimalizować wpływ niedoskonałości architektury FPGA na jakość projektów, firma Xilinx wyposażyła układy Spartan 3 w bloki 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 m i e j s c a c h u k ł a d u, można je także wykorzystać do syntezowania (w tym podziału częstotliwości sygnału zewnętrznego) wewnętrznych sygnałów zegarowych. Na rys. 19 pokazano schemat blokowy DCM (Digital Clock Manager). Składa się on z 4 bloków: syntezera częstotliwości DFS, pętli DLL, programowanego przesuwnika fazy (Phase Shifter) oraz zespołu logiki Status Logic. W aplikacjach prostszych oraz w przypadku, gdy nie jest konieczne żyłowanie parametrów układów FPGA, korzystanie z D C M n i e j e s t ko n i e c z n e i m o - ż e s i ę w p r o w a - dzić do wykorzystania tego bloku jako syntezera lub programowalnego dzielnika częstotliwości. Na rys. 20 pokazano przykładowe konfiguracje DCM, w których wykorzystano referencyjny sygnał zegarowy podawany z zewnątrz na 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. FPGA co trzeba o nich wiedzieć tip #8 Możliwości konfiguracji DCM są bardzo duże i ich dokładne opisanie wychodzi poza ramy kursu. Czytelników zainteresowanych poznaniem szczegółów zachęcamy do zapoznania się z notą katalogową XAPP462 firmy Xilinx, w której DCM opisano bardzo szczegółowo. Rys. 19. Schemat blokowy DCM stosowanych w układach Spartan 3 Elektronika Praktyczna 1/2007 97

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 Możliwości bloków DCM 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. Sprzętowe multiplikatory 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. 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 (dip- PLD 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 od- FPGA 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. 22. Konfiguracja DCM w edytorze schematów jest łatwa dzięki specjalnemu oknu edycyjnemu Rys. 23. Możliwe konfiguracje pracy multiplikatorów 98 Elektronika Praktyczna 1/2007

List. 4. 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 Rys. 24. Wygodnym narzędziem, umożliwiającym wygenerowanie opisu HDL multiplikatora odpowiadającego wymaganiom projektu, jest Xlinx CORE Generator FPGA co trzeba o nich wiedzieć tip #11 Możliwości konfiguracji pamięci BlockRAM wbudowanych w układy Spartan 3 są bardzo duże. Czytelników zainteresowanych poznaniem szczegółów zachęcamy do zapoznania się z notą katalogową XAPP463 firmy Xilinx, w której opisano je wszystkie bardzo szczegółowo. konfiguracje pojedynczego bloku BlockRAM: 16 k x 1, 8 k x 2, 4 k x 4, 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 (tylko w trybie single port). Jak można zauważyć, oprócz typowych, dwójkowych szerokości słowa danych, pamięci oferują także możliwość przechowywania bitów parzystości (po jednym na przechowywany bajt), przy czym jego generację i weryfikację musi zapewnić użytkownik. Bloki pamięci można skonfigurować jako jedno i dwuportowe, jako FIFO, pamięci CAM (Content Addressable Memory) oraz pamięci ROM. W każdym przypadku użytkownik może zdefiniować zawartość pamięci po włączeniu zasilania, co umożliwia następujący zapis w języku VHDL (dla kolejnych 16 komórek): INIT_00 => X"1100100 0110000110000110111101 111" Pamięć, której zawartość nie jest inicjowana przez użytkownika, po włączeniu zasilania zawiera same 0. Warto pamiętać, że w układach Spartan 3 użytkownicy mają do dyspozycji poza zespołami BlockRAM także małe zespoły pamięci rozproszone w blokach CLB (alternatywna 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. Podsumowanie Na tym kończymy z konieczności skrótowy wstęp do tajemniczego świata nowoczesnych układów FPGA. Za miesiąc pokażemy pierwszy przykład, który mamy nadzieję zachęci wszystkich onieśmielonych Czytelników do podjęcia samodzielnych prób. Jacek Majewski jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl FPGA co trzeba o nich wiedzieć tip #12 Większe zespoły pamięci utworzonych na bazie rozproszonych LUT (w CLB) mają gorsze parametry czasowe niż pamięci BlockRAM. Należy pamiętać o tym w przypadku, gdy projekt zaimplementowany w FPGA jest taktowany sygnałem zegarowym o częstotliwości bliskiej maksymalnej, dopuszczalnej dla danego układu. Rys. 25. Możliwe tryby pracy pamięci implementowanych w BlockRAM Elektronika Praktyczna 1/2007 99

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. K U R S 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 CLK Diody LED Licznik kontrolny Rys. 1. Schemat blokowy układu umożliwiającego wykrycie drgań styków przełączników Rys. 2. Skutki drgań styków przełącznika (jeden z przykładowych wyników rejestracji) Rys. 3. Skutki drgań styków przełącznika (inny przykładowy wynik rejestracji napięcia na stykach przełącznika) 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ą oscyloskopu 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 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 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 www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl www.sklep.avt.pl Elektronika Praktyczna 2/2007 103

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. 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. 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 z a l e t m j e d n ą z nich jest zachowanie czasu trwania zwarcia styków przycisku, co nie jest możliwe w wielu prostszych rozwiązaniach. Przedstawione 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 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 104 Elektronika Praktyczna 2/2007

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; 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 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 zestawie składającym się z płytki bazowej ZL9PLD oraz modułu dip- PLD 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): 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 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. Podsumowanie 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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl 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. Implementacja Zgodnie z zapowiedziami z poprzednich części cyklu, rozwiązanie prezentowane w artykule zostało zaimplementowane i przetestowane na 3,6864 MHz +V CLK Preskaler ok. 100 Hz PB_DEBOUNCED CLK Debouncer PB CLK Diody LED Licznik kontrolny Rys. 8. Schemat blokowy testera wersyfikującego poprawność działania debouncera Elektronika Praktyczna 2/2007 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

Rys. 2. Schemat blokowy interfejsu klawiatur matrycowej, który zaimplementowano w układzie FPGA (elementy znajdujące się w FPGA znajdują się w szarym obrysie) Rys. 3. Ilustracja działania dekodera klawiatury matrycowej przy założeniu, że wciśnięty jest przycisk o fizycznym adresie 1111 (dwójkowo) 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 numeru wciśniętego klawisza do rejestru latch, na wyjściach którego jest on utrzymywany 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 jest odczuwalna. Jej opisać można zmodyfikować na pzykład w sposób pokazany na list. 2 co spowoduje, że wciśnięcie przycisku o fizycznym 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. 1. Zastosowany w projekcie przykładowym opis VHDL pamięci ROM case kb_cnt is when 0000 => code_kb_int <= 0000 ; when 0001 => code_kb_int <= 0001 ; when 0010 => code_kb_int <= 0010 ; when 0011 => code_kb_int <= 0011 ; when 0100 => code_kb_int <= 0100 ; when 0101 => code_kb_int <= 0101 ; when 0110 => code_kb_int <= 0110 ; when 0111 => code_kb_int <= 0111 ; when 1000 => code_kb_int <= 1000 ; when 1001 => code_kb_int <= 1001 ; when 1010 => code_kb_int <= 1010 ; when 1011 => code_kb_int <= 1011 ; when 1100 => code_kb_int <= 1100 ; when 1101 => code_kb_int <= 1101 ; when 1110 => code_kb_int <= 1110 ; when 1111 => code_kb_int <= 1111 ; when others => code_kb_int <= ; List. 2. Zmodyfikowany opis VHDL pamięci ROM, który można zaimplementować w projekcie case kb_cnt is when 0000 => code_kb_int <= 1111 ; when 0001 => code_kb_int <= 1110 ; when 0010 => code_kb_int <= 1101 ; when 0011 => code_kb_int <= 1100 ; when 0100 => code_kb_int <= 1011 ; when 0101 => code_kb_int <= 1010 ; when 0110 => code_kb_int <= 1001 ; when 0111 => code_kb_int <= 1000 ; when 1000 => code_kb_int <= 0111 ; when 1001 => code_kb_int <= 0110 ; when 1010 => code_kb_int <= 0101 ; when 1011 => code_kb_int <= 0100 ; when 1100 => code_kb_int <= 0011 ; when 1101 => code_kb_int <= 0010 ; when 1110 => code_kb_int <= 0001 ; when 1111 => code_kb_int <= 0000 ; when others => code_kb_int <= ; Elektronika Praktyczna 3/2007 105

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; 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) <= 0 when kb_cnt(3 downto 2) = «00» else 1 ; col(1) <= 0 when kb_cnt(3 downto 2) = «01» else 1 ; col(2) <= 0 when kb_cnt(3 downto 2) = «10» else 1 ; col(3) <= 0 when kb_cnt(3 downto 2) = «11» else 1 ; 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» => code_kb_int <= «0000»; when «0001» => code_kb_int <= «0001»; when «0010» => code_kb_int <= «0010»; when «0011» => code_kb_int <= «0011»; when «0100» => code_kb_int <= «0100»; when «0101» => code_kb_int <= «0101»; when «0110» => code_kb_int <= «0110»; when «0111» => code_kb_int <= «0111»; when «1000» => code_kb_int <= «1000»; when «1001» => code_kb_int <= «1001»; when «1010» => code_kb_int <= «1010»; when «1011» => code_kb_int <= «1011»; when «1100» => code_kb_int <= «1100»; when «1101» => code_kb_int <= «1101»; when «1110» => code_kb_int <= «1110»; when «1111» => code_kb_int <= «1111»; when others => code_kb_int <= ; end case; end process; process (clk, int, code_kb_int, res) begin if (res = 0 ) then code_kb_ext <= «0000»; elsif (clk event and clk = 1 and int = 0 ) then 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ń List. 4. Opis w języku VHDL zawierający opis połączeń pomiędzy preskalerem i modułem obsługi klawiatury matrycowej library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; 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 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 przypisania sygnałów. Implementacja p r e z e n t o w a n e - go 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 106 Elektronika Praktyczna 3/2007

ZL10PLD) do wartości ok. 112 Hz (3686400 : 2 15 ). 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. 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 (int event and int = 0 ) then. natomiast na list. 3 widać: Rys. 5. Funkcje LED na płytce ZL9PLD po zaimplementowaniu projektu opisanego w artykule Zastosowano bowiem synchroni- zację sygnałem zegarowym clk, który zapobiega asynchronizacji sygnału INT, wytwarzanego w układzie kombinacyjnym, co wynika z opisu: with kb_cnt(1 downto 0) select int <= row(3) when 11, row(2) when 10, row(1) when 01, row(0) when others; elsif (clk event and clk = 1 and int = 0 ) then 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. 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 Podsumowanie Przedstawiony w artykule projekt jak większość przygotowanych w językach HDL jest podatny na różne modyfikacje. Jak wspomniano wcześniej, m o ż n a z m o d y fi - kować 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ą wciśnięcia przycisku (brzęczyk piezoelektryczny 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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl 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

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. K U R S Rys. 1. Schemat ilustrujący zasadę działania sterownika multipleksowego 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. Rys. 2. Schemat blokowy projektu zaimplementowanego w FPGA 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. Elektronika Praktyczna 4/2007 97

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 zawartoś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 poniższym rysunku pokazano sposób połączenia układu XC3S200 z pamięcią XCF01S, który automatycznie ustalił program impact obsługujący 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 Automatycznie wykryta przez program impact konfiguracja łańcucha JTAG w zestawie ZL10PLD na poniższym rysunku: Konfigurator XCF01S jest wyposażony w dwa interfejsy 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 Spartan 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. Interfejsy 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 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 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) Żeby konfigurowany za pomocą interfejsu 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. >> 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 98 Elektronika Praktyczna 4/2007

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. im- PACT 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 restart 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 im- PACT 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. Realizacja 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

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. 3 3,2 V, co przy 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 jakichko 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 Projekt zaimplementowany w testowym zestawie, poza sterownikiem wyświetlaczy, zawiera także 4 dekadowy 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: 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 a segm <= 1000000 when 0000, 0 1111001 when 0001, 1 0100100 when 0010, 2 0110000 when 0011, 3 0011001 when 0100, 4 0010010 when 0101, 5 0000010 when 0110, 6 1111000 when 0111, 7 0000000 when 1000, 8 0010000 when 1001, 9 1111111 when others; wygaszenie PRAWA STRONA with bcd select g f e d c b a segm <= 1000000 when 0000, 0 1111001 when 0001, 1 0100100 when 0010, 2 0110000 when 0011, 3 0011001 when 0100, 4 0010010 when 0101, 5 0000010 when 0110, 6 1111000 when 0111, 7 0000000 when 1000, 8 0010000 when 1001, 9 0001000 when 1001, 10 A 0000011 when 1001, 11 B 0000110 when 1001, 12 C 0100001 when 1001, 13 D 0000110 when 1001, 14 E 0001110 when 1001, 15 F 1111111 when others; wygaszenie 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 jacek.majewski@pwr.wroc.pl Piotr Zbysiński, EP piotr.zbysinski@ep.com.pl Rys. 5. Budowa prezentowanego projektu z podziałem na pliki z opisami VHDL 100 Elektronika Praktyczna 4/2007