Programowalne układy logiczne Wstęp Szymon Acedański Marcin Peczarski Instytut Informatyki Uniwersytetu Warszawskiego 12 października 2015
Co to jest programowalny układ logiczny? PLD (ang. programmable logic device) Scalony układ cyfrowy Funkcja określana przez projektanta dopiero po wyprodukowaniu układu Programowanie sygnałami elektrycznymi
O czym będzie na tym przedmiocie? Jak działają układy cyfrowe? Jak zaprojektować własny układ cyfrowy? Jak wykonać jego symulację? Jak zaimplementować algorytm w sprzęcie? Jak zbudowany jest mikroprocesor? Jak zaprojektować własny mikroprocesor? Jak zaprogramować swój projekt w FPGA?
Gdzie nam się to może przydać? Jednoukładowy sterownik urządzenia Akcelerator instalowany w komputerze na szynie PCI Układ peryferyjny instalowany w komputerze na szynie PCI Prototyp sprawdzający koncepcję projektową
Co zrobić, gdy potrzebujemy układu cyfrowego? Znaleźć gotowy układ realizujący potrzebną nam funkcję. Dla wielu typowych zastosowań produkuje się gotowe układy scalone. A co, gdy potrzebujemy nietypowego układu? Zbudować potrzebny układ z układów scalonych małej i średniej skali integracji, np. z układów serii 74HC. Opłacalne tylko, gdy projektowany układ jest niewielki i da się złożyć z co najwyżej kliku układów scalonych. Układ składający się z kilkudziesięciu lub kilkuset układów scalonych jest za duży, za drogi w produkcji i pobiera za dużo prądu. Zbudować układ mikroprocesorowy i zaprogramować w nim potrzebną funkcjonalność. Mikrokontrolery mają wiele przydatnych peryferii. Obecnie jest to bardzo powszechna praktyka.
Co zrobić, gdy potrzebujemy układu cyfrowego? Zaprojektować własny specjalizowany (ang. full custom) układ scalony od podstaw: trzeba poznać bardzo skomplikowane reguły projektowe; proces projektowania jest długi i kosztowny; opłaca się tylko przy bardzo dużych seriach produkcyjnych. Użyć ASIC (ang. application specific integrated circuit): bramki logiczne są już wykonane w krzemie; wymaga tylko zaprojektowania połączeń między bramkami; opłaca się tylko przy dużych seriach produkcyjnych. Użyć FPGA: proces projektowania jest istotnie krótszy i tańszy niż dla układów specjalizowanych lub ASIC; opłaca się przy małych i dużych seriach produkcyjnych; można tanio i szybko skonstruować i przetestować prototyp przed podjęciem decyzji o projektowaniu specjalizowanego układu scalonego; układ wolniejszy od układu specjalizowanego.
Sposoby opisu sprzętu Schemat ideowy Topografia układu scalonego PSPICE (ang. Personal Simulation Program with Integrated Circuit Emphasis) Schemat logiczny Schemat blokowy Tablica prawdy Tablica stanów Automat stanowy HDL (ang. hardware description language) VHDL (ang. Very High Speed Integrated Circuit Hardware Description Language) Verilog
Schemat ideowy i topografia VDD A OUT B VSS Są zbyt szczegółowe i niezrozumiałe dla informatyka.
PSPICE MP1 4 1 3 3 CMOSP W=28.0U L=2.0U AS=252P AD=252P MP2 4 2 3 3 CMOSP W=28.0U L=2.0U AS=252P AD=252P MN1 4 1 5 0 CMOSN W=10.0U L=2.0U AS=90P AD=90P MN2 5 2 0 0 CMOSN W=10.0U L=2.0U AS=90P AD=90P VDD 3 0 DC 5.0.MODEL CMOSN NMOS LEVEL=2 LD=0.121440U + TOX=410E-10 NSUB=2.355991E+16 VTO=0.7 + KP=8.165352E-05 GAMMA=1.05002 PHI=0.6 + UO=969.492 UEXP=0.308914 UCRIT=40000 + DELTA=0.262772 VMAX=71977.5 XJ=0.3U + LAMBDA=3.937849E-02 NFS=1E+12 NEFF=1.001 NSS=0 + TPG=1 RSH=33.290002 CGDO=1.022762E-10 + CGSO=1.022762E-10 CGBO=5.05317E-11 CJ=1.368E-04 + MJ=0.4925 CJSW=5.222E-10 MJSW=0.2358 PB=0.49 +... Podobnie można też opisać topografię układu scalonego.
Tablica prawdy Na poprzednich dwóch slajdach widzieliśmy dwuwejściową bramkę NAND. A B Y Informatykowi wystarczy tylko poznanie jej tablicy prawdy. A B Y L L H L H H H L H H H L Zobaczmy jakiś bardziej skomplikowany przykład, składający się z 6 trzywejściowych bramek NAND.
Schemat logiczny Mimo że na architekturze komputerów omawia się bramki logiczne, niewiele osób na sali zgadnie, co robi ten układ.
Symbol logiczny D S Q R Q Wyższy poziom abstrakcji symbol układu z poprzedniego slajdu.
Tablica stanów Na poprzednich dwóch slajdach widzieliśmy przerzutnik D wyzwalany narastającym zboczem sygnału zegarowego. R S D C Q Q H L X X H L L H X X L H L L X X H H H H L L H H H H H L H H X X Q Q H H X Q Q Po wytłumaczeniu, co oznaczają poszczególne symbole, to już nawet informatyk zrozumie.
Opis w VHDL Deklaracja interfejsu jednostki projektowej entity D_flip_flop is port (C: in bit; D: in bit; R: in bit; S: in bit; Q: out bit; NQ: out bit); end entity D_flip_flop;
Implementacja jednostki projektowej architecture behavioral of D_flip_flop is begin process (C, R, S) begin if R = 0 and S = 1 then Q <= 1 ; NQ <= 0 ; elsif R = 1 and S = 0 then Q <= 0 ; NQ <= 1 ; elsif R = 0 and S = 0 then Q <= 1 ; NQ <= 1 ; elsif C event and C = 1 then Q <= D; NQ <= not D; end if; end process; end architecture behavioral; Wygląda przyjaźnie i znajomo, ale pozory mylą...
Rodzaje programowalnych układów logicznych PLA (ang. programmable logic array) dwie kaskadowo połączone programowalne matryce bramek: AND i OR iloczyn montażowy (ang. wired-and) PAL (ang. programmable array logic) programowalna matryca bramek AND i nieprogramowalne bramki OR wbudowane przerzutniki możliwość łączenia wyjść przerzutników z wejściami matrycy AND zwykle klika lub kilkanaście kompletów matryc CPLD (ang. complex programmable logic device) wiele układów PAL komunikujących się przez programowalne połączenia FPGA (ang. field programmable gate array) wiele małych bloków logicznych realizujących funkcję kombinacyjną i pamięciową specjalizowane bloki, np. RAM, układ mnożący bloki łączone za pomocą programowalnych połączeń
PLA matryce bramek x 2 x 1 x 0 } {{ } matryca AND } {{ } matryca OR z 1 z 0 0
PLA realizacja bramki NOR y 0 x 1 x 2 V DD y 0 V SS x 1 x 2
PAL pojedyncza komórka z przerzutnikiem
PAL macierz bramek AND i bramki OR x 2 x 1 x 0 } {{ } matryca AND z 1 z 0
FPGA pojedyncza komórka
FPGA połączenia
FPGA pamięć konfiguracji SRAM programowanie w systemie potrzebna zewnętrzna pamięć nieulotna (ang. boot device) Pamięć stała, jednokrotnie programowalna antybezpieczniki bezpieczniki PROM Pamięć stała, wielokrotnie reprogramowalna EPROM EEPROM Flash
FPGA dodatkowe bloki Generator wewnętrznych sygnałów zegarowych Układ mnożący Dwuportowa pamięć RAM JTAG
BASYS 2
BASYS 2 100K Xilinx Spartan3E-100 CP132 Zegar 25, 50 lub 100 MHz Gniazdo na dodatkowy oscylator 8 przełączników bistabilnych 4 przyciski monostabilne 8 diod świecących 4-cyfrowy multipleksowany wyświetlacz 7-segmentowy 4 złącza 6-stykowe do podłączania układów peryferyjnych VGA PS/2 Progamowanie i zasilanie przez USB Zewnętrzna pamięć programu Flash
Najmniejszy z rodziny Spartan3E XC3S100E 2160 komórek logicznych Równoważnik 100000 bramek logicznych 15 Kib rozproszonej RAM 72 Kib dwuportowej RAM 4 układy mnożące 18-bitowe 2 generatory wewnętrznych synałów zegarowych 108 wejść-wyjść
Największy z rodziny Spartan3E XC3S1600E 33192 komórek logicznych Równoważnik 1600000 bramek logicznych 231 Kib rozproszonej RAM 648 Kib dwuportowej RAM 36 układów mnożących 18-bitowych 8 generatory wewnętrznych synałów zegarowych 376 wejść-wyjść Spartan3E to rodzina tanich FPGA z niższej półki
DE2
DE2 Altera Cyclone II EP2C35 Zegar 27 lub 50 MHz Programowanie przez USB Zewnętrzny zasilacz 9 V 18 przełączników bistabilnych, 4 przyciski monostabilne 27 diod świecących, 8-cyfrowy wyświetlacz 7-segmentowy Alfanumeryczny LCD 16 2 Wejścia i wyjście analogowe (przetwornik 24-bitowy A/D) Wyjście wideo (VGA, 10-bitowy przetwornik D/A) Wejście wideo (NTSC/PAL/Multi-format) RS232, USB 2.0 A i B Odbiornik i nadajnik na podczerwień PS/2 do podłączenia myszy lub klawiatury Ethernet 10/100 Mbit/s 2 złącza 40-pinowe do podłączania układów peryferyjnych 8 MiB SDRAM, 512 KiB SRAM, 4 MiB Flash Gniazdo pamięci SD
Cyclone II EP2C5 4608 komórek logicznych 119808 b RAM 33 układów mnożących 18-bitowych 2 PLL 158 wejść-wyjść binarnych EP2C35 33216 komórek logicznych 483840 b RAM 35 układów mnożących 18-bitowych 4 PLL 475 wejść-wyjść binarnych EP2C70 68416 komórek logicznych 1152000 b RAM 150 układów mnożących 18-bitowych 4 PLL 622 wejść-wyjść binarnych Cyclone II to rodzina tanich FPGA z niższej półki
Inne FPGA Xilinx Virtex-6, Spartan-6, EasyPath-6 Altera Stratix V, Aria V, HardCopy V, MAX V Actel Aeroflex Atmel Lattice Semiconductor...
Literatura Józef Kalisz i in.: Język VHDL w praktyce. WKŁ, Warszawa 2002. Marcin Nowakowski: PicoBlaze. Mikroprocesor w FPGA. Wydawnictwo BTC, Legionowo 2009. Jacek Majewski, Piotr Zbysiński: Układy FPGA w przykładach. Wydawnictwo BTC, Warszawa 2007. Kevin Skahill: Język VHDL. Projektowanie programowalnych układów logicznych. WNT, Warszawa 2001, 2004. Mark Zwoliński: Projektowanie układów cyfrowych z wykorzystaniem języka VHDL. WKŁ, Warszawa 2002, 2007.
Środowisko pracy Xilinx ISE Design Suite kompatybilne z układami Xilinxa każdy producent ma swoje środowisko, ale wszystkie wyglądają prawie identycznie korzystamy z darmowej wersji Xilinx ISE WebPack Digilent Adept narzędzie pomocnicze dla płytki BASYS 2 umożliwia wgrywanie programów wyprodukowanych przez ISE oraz komunikację z odpowiednio zaprogramowanym układem
Instalacja Wymagania: dużo RAM-u, co najmniej 1 GiB dużo dysku, ok. 10 GiB Skąd ściągnąć? http://www.xilinx.com/support/download/index.htm (wymaga rejestracji) http://www.digilentinc.com/products/detail.cfm? Prod=ADEPT Uruchomienie: Start Wszystkie programy Xilinx ISE Design Suite ISE Design Tools 64-bit Project Navigator Jeśli trzeba uaktualnić licencję: w labach: Help Manage License... Copy License... C:\...\Xilinx-webpack.lic w domu: Help Obtain a License Key... Get Free ISE WebPack License Poszczególne licencje różnią się rozmiarem obsługiwanych układów. Licencje potrzebne są także, aby używać gotowych komponentów.
Nowy projekt File New Project... Parametry: Family: Spartan 3E Device: XC3S100E Package: CP132 Speed: -5 Synthesis tool: XST Simulator: ISim Preferred language: VHDL
Nowy projekt
Nowy projekt Potrzebujemy stworzyć: wysokopoziomowy opis układu, który chcemy zaprogramować w języku VHDL; opis jego konfiguracji wewnątrz FPGA, w szczególności: podłączenia sygnałów do nóżek układu, wymaganych ograniczeń np. co do opóźnień sygnałów (to będzie w pliku.ucf User Constraints File).
Nowy projekt Project New Source... VHDL Module main library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity main is port ( btn : in std_logic_vector (3 downto 0); sw : in std_logic_vector (7 downto 0); led : out std_logic_vector (7 downto 0) ); end main; architecture behavioral of main is begin led <= sw; end behavioral;
Nowy projekt Project New Source... Implementation Constraints File basys2config NET "led<0>" LOC = "M5"; NET "led<1>" LOC = "M11"; NET "led<2>" LOC = "P7"; NET "led<4>" LOC = "N5"; NET "led<5>" LOC = "N4"; NET "led<3>" LOC = "P6"; NET "led<6>" LOC = "P4"; NET "led<7>" LOC = "G1"; NET "sw<0>" LOC = "P11"; NET "sw<1>" LOC = "L3"; NET "sw<2>" LOC = "K3"; NET "sw<3>" LOC = "B4"; NET "sw<4>" LOC = "G3"; NET "sw<5>" LOC = "F3"; NET "sw<6>" LOC = "E2"; NET "sw<7>" LOC = "N3"; NET "btn<0>" LOC = "G12"; NET "btn<1>" LOC = "C11"; NET "btn<2>" LOC = "M4"; NET "btn<3>" LOC = "A7";
Zegar konfiguracyjny FPGA rozpoczyna pracę (np. włączenia zasilania) od wczytania konfiguracji zaprogramowanego obwodu. Na płytce BASYS 2 mamy do wyboru dwa źródła, wybierane zworką MODE w prawym górnym rogu, z których ona może pochodzić: z pamięci nieulotnej (PROM) na płytce, z podłączonego komputera, przy użyciu interfejsu JTAG. Na zajęciach, o ile nie będzie zaznaczone inaczej, zawsze uruchamiamy układ przez interfejs JTAG. W ten sposób w pamięci nieulotnej będzie zawsze konfiguracja testowa, dzięki której można sprawdzić sprawność płytki.
Zegar konfiguracyjny Po zaprogramowaniu układ wykonuje sekwencję startową, do której potrzebuje aktywnego zegara. Informacja o tym, z której nóżki powinien pochodzić, musi być zapisana w pliku programu. Domyślnie jest tam ustawiony zegar pamięci nieulotnej, co należy zmienić: w oknie hierarchii należy wybrać moduł main, w oknie akcji (poniżej) rozwinąć Implement Design, klinąć prawym na Generate Programming File i wybrać Process Properties..., w części Startup Options wybrać JTAG Clock jako FPGA Start-Up Clock.
Kompilacja Process Implement Top Level Module Kroki kompilacji: synteza (Synthesis) zamiana kodu wysokopoziomowego na opis sprzętowy ( bramki i druty ) translacja (Translation) dołączenie informacji konfiguracyjnych do opisu sprzętowego odwzorowanie (Map) wyrażenie opisanego sprzętu w postaci elementów dostępnych na FPGA rozmieszczenie (Place and Route) przypisanie elementów w konkretne miejsca dostępne na FPGA wygenerowanie pliku do zaprogramowania (Generate Programming File) plik wynikowy ma rozszerzenie.bit. Obejrzeć raporty, schematy i takie tam bajery.
Symulacja Project New Source... VHDL Test Bench maintest Usuń kod odpowiadający za generowanie zegara, którego nie ma, a proces stim proc zaimplementuj np. tak: stim_proc: process begin wait for 1us; btn(0) <= 1 ; sw <= "01010101"; assert led = "01010101"; wait for 1us; btn(1) <= 1 ; sw <= "11010101"; assert led = "11010101"; wait for 1us; btn(2) <= 1 ; sw(7) <= not sw(7); wait; end process;
Symulacja Nie zapomnij zapisać pliku. Ponad panelem hierarchii wybierz Simulation i Behavioral. Zaznacz moduł maintest (a nie main!). W oknie procesów uruchom Behavioral Check Syntax (to ważne!). W oknie procesów uruchom Simulate Behavioral Model. Pobaw się okienkiem, które się pojawiło. Spróbuj wykonać to samo dla symulacji z uwzględnieniem efektów faktycznego rozmieszczenia elemenów w FPGA (Post-Route). Co się zmieniło?
Symulacja
Uruchomienie Podłącz płytkę do komputera. Ustaw zworkę MODE w pozycji PC, a POWER na ON. Uruchom program Adept. Zaprogramuj wygenerowany plik main.bit na FPGA.
Cyknij fotę na twarzoksiąg
Nudzi Ci się? Sprawdź, czy działa przerzutnik D? Kod w VHDL-u jest na wcześniejszym slajdzie. Jaka jest jego maksymalna rozsądna szybkość taktowania zegara?