.. _w01-intro: =========================================== WykĹad 1: Wprowadzenie do ukĹadĂłw cyfrowych =========================================== Data: 20.10.2020 .. toctree:: .. contents:: UkĹady cyfrowe ============== W uproszczeniu, ukĹad cyfrowy to zbiĂłr poĹÄ czonych elementĂłw elektronicznych, w ktĂłrym informacje reprezentowane sÄ binarnie. Z punktu widzenia funkcjonalnoĹci ukĹadu interesuje nas tylko, czy w danym miejscu jest stan niski (potencjaĹ wzglÄdem masy bliski 0V, oznaczany ``0`` bÄ dĹş ``L``) czy stan wysoki (potencjaĹ wzglÄdem masy bliski napiÄciu zasilania, oznaczany ``1`` bÄ dĹş ``H``). PrzeciwieĹstwem ukĹadu cyfrowego jest ukĹad analogowy, w ktĂłrym wykorzystywany jest szeroki zakres potencjaĹĂłw. Bramki logiczne --------------- Bramki logiczne sÄ podstawowymi elementami, z ktĂłrych zbudowane sÄ ukĹady cyfrowe -- wykonujÄ one proste operacje logiczne na wejĹciach. NajwaĹźniejsze typy bramek logicznych to: - NOT (jedno wejĹcie): daje 1, gdy na wejĹciu jest 0. .. image:: gate-not.svg - AND (dwa lub wiÄcej wejĹÄ): daje 1, gdy na wszystkich wejĹciach jest 1. .. image:: gate-and.svg - OR (dwa lub wiÄcej wejĹÄ): daje 1, gdy na ktĂłrymĹ wejĹciu jest 1. .. image:: gate-or.svg - NAND (dwa lub wiÄcej wejĹÄ): daje 0, gdy na wszystkich wejĹciach jest 1. .. image:: gate-nand.svg - NOR (dwa lub wiÄcej wejĹÄ): daje 0, gdy na ktĂłrymĹ wejĹciu jest 1. .. image:: gate-nor.svg - XOR (dwa wejĹcia): daje 1, gdy na dokĹadnie jednym wejĹciu jest 1. .. image:: gate-xor.svg Bramki NAND oraz NOR sÄ bramkami podstawowymi -- jeĹli umiemy zrobiÄ bramkÄ NAND (lub bramkÄ NOR), moĹźemy z odpowiedniej liczby takich bramek poskĹadaÄ dowolny ukĹad logiczny. Co wiÄcej, wspĂłĹczesne technologie pozwalajÄ tylko na bezpoĹredniÄ konstrukcjÄ bramek NOT/NAND/NOR -- np. bramka AND jest tak naprawdÄ realizowana jako bramka NAND poĹÄ czona z bramkÄ NOT. Bramki logiczne sÄ najwaĹźniejszym elementem skĹadowym ukĹadĂłw cyfrowych, ale nie jedynym -- innymi czÄsto spotykanymi elementami sÄ np. pamiÄÄ RAM, bufory trĂłjstanowe, bufory róşnicowe, itp. Multipleksery ------------- Bardzo czÄsto spotykanymi blokami w konstrukcji ukĹadĂłw logicznych sÄ multipleksery (zwane w skrĂłcie MUXami). Multiplekser to blok, ktĂłry ma dwa rodzaje wejĹÄ (INPUT i SELECT) oraz jedno wyjĹcie. WejĹcia SELECT wybierajÄ jedno z wejĹÄ INPUT, ktĂłrego stan bÄdzie skopiowany na wyjĹcie. Najprostszy multiplekser to multiplekser 2:1, ktĂłry ma nastÄpujÄ ce piny: - A: pierwsze wejĹcie - B: drugie wejĹcie - S0: wejĹcie wybierajÄ ce - Z: wyjĹcie. JeĹli S0 = 0, rĂłwne wejĹciu A. JeĹli S0 = 1, rĂłwne wejĹciu B. .. figure:: mux.svg MUX 2:1 Przerzutniki, ukĹady synchroniczne ---------------------------------- PowyĹźsze bloki sÄ blokami kombinacyjnymi â liczÄ stan wyjĹÄ tylko ze stanu wejĹÄ i nie majÄ Ĺźadnego stanu wewnÄtrznego. Do trzymania stanu wewnÄtrznego sĹuĹźÄ bloki sekwencyjne: przerzutniki i zatrzaski. We wspĂłĹczesnych ukĹadach praktycznie jedynym typem uĹźywanych blokĂłw sekwencyjnych sÄ przerzutniki typu D: .. figure:: dff.png Przerzutnik typu D Taki przerzutnik jest 1-bitowÄ pamiÄciÄ : - wyjĹcie Q pokazuje obecny stan przerzutnika - na wejĹciu D podajemy nastÄpny stan przerzutnika - na wejĹciu CLK podajemy sygnaĹ zegarowy (zmieniajÄ cy siÄ regularnie miÄdzy 0 a 1) - na kaĹźdym rosnÄ cym zboczu zegara (w momencie, gdy CLK zmienia siÄ z 0 na 1), przerzutnik zmienia swĂłj stan na obecnÄ wartoĹÄ wejĹcia D UkĹad synchroniczny to ukĹad skĹadajÄ cy siÄ z przerzutnikĂłw i blokĂłw kombinacyjnych â przerzutniki stanowiÄ stan ukĹadu, a bloki kombinacyjne opisujÄ jak obliczyÄ nastÄpny stan ukĹadu z obecnego. W momencie wystÄ pienia zbocza zegarowego, wszystkie przerzutniki jednoczeĹnie (atomowo) zmieniajÄ swĂłj stan na nowy. Realizacja ukĹadĂłw cyfrowych ============================ Od póŠwieku, ukĹady cyfrowe realizuje siÄ w formie ukĹadĂłw scalonych -- pojedynczych kawaĹkĂłw krzemu, na ktĂłre naniesione zostaĹo wiele tranzystorĂłw. NajwiÄksze ukĹady scalone majÄ obecnie rozmiar kilkunastu miliardĂłw tranzystorĂłw. RealizujÄ c wĹasny ukĹad cyfrowy, mamy do wyboru nastÄpujÄ ce moĹźliwoĹci: 1. PoskĹadaÄ ukĹad cyfrowy z gotowych ukĹadĂłw scalonych o niskiej skali integracji -- seria ukĹadĂłw 7400 bÄ dĹş 4000. Jest to praktyczne tylko przy bardzo maĹych ukĹadach cyfrowych. 2. ZaprojektowaÄ i wyprodukowaÄ swĂłj wĹasny ukĹad scalony (full custom ASIC -- application specific integrated circuit). Jest to praktyczne tylko przy bardzo duĹźej skali produkcji -- choÄ ukĹady scalone sÄ bardzo tanie, maski fotolitograficzne uĹźywane do produkcji sÄ bardzo drogie (rzÄdu milionĂłw dolarĂłw). Co wiÄcej, najmniejsza pomyĹka moĹźe powodowaÄ koniecznoĹÄ wyrzucenia caĹej serii produkcyjnej (i ponownego poniesienia kosztĂłw produkcji mask). Proces projektowania jest rĂłwnieĹź bardzo skomplikowany. 3. UĹźyÄ programowalnego ukĹadu logicznego. Programowalne ukĹady logiczne ----------------------------- Programowalny ukĹad logiczny skĹada siÄ z gotowej tablicy elementĂłw cyfrowych, ktĂłrych dziaĹanie oraz wzajemne poĹÄ czenia mogÄ byÄ zdefiniowane przez uĹźytkownika po opuszczeniu fabryki. WspĂłĹczeĹnie istniejÄ dwa rodzaje programowalnych ukĹadĂłw logicznych: 1. CPLD (complex programmable logic device): - maĹe (do ok. tysiÄ ca bramek logicznych) - przeznaczone do prostej logiki ĹÄ czÄ cej bardziej skomplikowane ukĹady - zbudowane z tzw. makrokomĂłrek, realizujÄ cych duĹźe sumy iloczynĂłw (OR duĹźej liczby bramek AND, ktĂłre teĹź majÄ duĹźÄ liczbÄ wejĹÄ, z opcjonalnymi bramkami NOT) - zawierajÄ wbudowanÄ pamiÄÄ nieulotnÄ flash - raz zaprogramowane, sÄ (prawie) natychmiast gotowe do pracy po wĹÄ czeniu zasilania 2. FPGA (field programmable gate array): - duĹźe (do milionĂłw bramek logicznych) - przeznaczone do realizowania gĹĂłwnej logiki aplikacji - zbudowane z tzw. LUTĂłw (lookup table), czyli 4-wejĹciowych bÄ dĹş 6-wejĹciowych dowolnie programowalnych tabelek prawdy - oprĂłcz LUTĂłw zawierajÄ rĂłwnieĹź wiele gotowych komponentĂłw przydatnych przy skomplikowanych ukĹadach, np.: - RAM - generatory zegarĂłw - ukĹady mnoĹźÄ ce - gotowy rdzeĹ procesora ARM - ukĹad obsĹugujÄ cy szynÄ PCI-Express - przechowujÄ swojÄ konfiguracjÄ w pamiÄci ulotnej (SRAM) -- choÄ sÄ wyjÄ tki - muszÄ byÄ zaprogramowane kaĹźdorazowo po wĹÄ czeniu zasilania -- jeĹli majÄ byÄ uĹźyte samodzielnie, wymagajÄ osobnej koĹci pamiÄci flash na konfiguracjÄ - uruchomienie moĹźe trwaÄ zauwaĹźalnie dĹugo (rzÄdu sekundy) W porĂłwnaniu z ASICami, zalety programowalnych ukĹadĂłw logicznych to: - brak kosztĂłw produkcji mask (bardzo niskie koszty jednorazowe) -- opĹacalne przy znacznie mniejszej skali - praktycznie natychmiastowy cykl projektowy (nie trzeba czekaÄ kilku miesiÄcy, aĹź ukĹady zostanÄ wyprodukowane przez fabrykÄ i przypĹynÄ z Tajwanu) - moĹźliwoĹÄ aktualizacji projektu po dystrybucji (jak aktualizacja firmware'u) Wady programowalnych ukĹadĂłw logicznych: - narzut na rozmiar ukĹadu (realizacja ukĹadu na FPGA zajmuje ok. 30Ă wiÄcej tranzystorĂłw niĹź ASIC) - narzut na szybkoĹÄ dziaĹania ukĹadu (FPGA sÄ ok. 4Ă wolniejsze niĹź ASIC) - bardziej skomplikowana pĹytka drukowana i proces produkcyjny (CPLD trzeba zaprogramowaÄ przed dystrybucjÄ , FPGA potrzebujÄ osobnego ukĹadu programujÄ cego na pĹytce) Na tym przedmiocie bÄdziemy siÄ zajmowaÄ wyĹÄ cznie ukĹadami FPGA (choÄ wiÄkszoĹÄ informacji bÄdzie rĂłwnieĹź przydatna przy programowaniu ukĹadĂłw CPLD i projektowaniu ASICĂłw). UkĹady FPGA dostÄpne na rynku ----------------------------- WspomnÄ tutaj o nastÄpujÄ cych ukĹadach FPGA: 1. UkĹady marki Xilinx (ok. 50% rynku) - Spartan: tanie, maĹe, bez wodotryskĂłw. NajnowszÄ seriÄ jest Spartan 7. - Artix: trochÄ mniej tanie. - Kintex: powaĹźne, duĹźe ukĹady. - Virtex: bardzo powaĹźne, bardzo duĹźe, bardzo drogie ukĹady. - Zynq: wĹaĹciwie jest to procesor ARM z kawaĹkiem ukĹadu FPGA "na doczepkÄ". Tego ukĹadu bÄdziemy uĹźywaÄ na późniejszych zajÄciach. 2. UkĹady marki Intel (dawniej Altera) (ok. 30% rynku) - Cyclone: tanie, maĹe. - Arria: Ĺredniej wielkoĹci. - Stratix: drogie, duĹźe. 3. UkĹady marki Lattice (dawniej SiliconBlue) (mniej niĹź 10% rynku) - iCE40: bardzo tanie i maĹe. Razem z ECP5, jedyne ukĹady FPGA sensownie wspierane przez otwarte narzÄdzia (projekty IceStorm i Trellis, yosys + nextpnr). - ECP5: nieco wiÄksze. Struktura ukĹadu FPGA --------------------- UkĹad FPGA jest dwuwymiarowÄ tablicÄ kafli (tile) róşnego rodzaju. WiÄkszoĹÄ kafli stanowi programowalna logika -- w ukĹadach Xilinxa takie kafle nazywajÄ siÄ CLB (configurable logic block). DokĹadna konstrukcja takich kafli jest mocno zaleĹźna od konkretnego ukĹadu, ale praktycznie zawsze moĹźemy spotkaÄ trzy gĹĂłwne elementy: 1. ProgramowalnÄ tabelÄ prawdy -- LUT4 (4-wejĹciowa) bÄ dĹş LUT6 (6-wejĹciowa). MoĹźe realizowaÄ dowolnÄ 4- lub 6-wejĹciowÄ formuĹÄ logicznÄ . 2. ĹaĹcuch przeniesienia (carry chain) -- dedykowane, nieprogramowalne poĹÄ czenia miÄdzy blokami logicznymi sĹuĹźÄ ce efektywnej realizacji dodawania/odejmowania. 3. Przerzutnik D (czasem programowalny tak, by staĹ siÄ zatrzaskiem D) -- zapamiÄtuje wynik z LUT. W wielu ukĹadach, element LUT moĹźe byÄ opcjonalnie zapisywalny w trakcie dziaĹania ukĹadu, zmieniajÄ c go efektywnie w 16- bÄ dĹş 64-bitowÄ pamiÄÄ RAM. OprĂłcz programowalnej logiki, w wiÄkszoĹci ukĹadĂłw FPGA spotkamy rĂłwnieĹź nastÄpujÄ ce rodzaje kafli: 1. I/O block -- obsĹuguje komunikacjÄ ze Ĺwiatem zewnÄtrznym, kontroluje jednÄ nóşkÄ ukĹadu scalonego. MoĹźna w nim ustawiÄ najróşniejsze parametry elektryczne danej nóşki, kierunek przepĹywu danych, itp. 2. Block RAM -- maĹy blok pamiÄci RAM (18 lub 36 kilobitĂłw na jeden blok w przypadku Zynq). MoĹźe sĹuĹźyÄ jako RAM, ROM, tabela przejĹÄ w automacie stanowym, kolejka FIFO, itp. 3. UkĹad mnoĹźÄ cy (multiplier, DSP block, itp) -- dedykowany blok wykonujÄ cy operacjÄ mnoĹźenia (mnoĹźenie zrealizowane za pomocÄ zwykĹej programowalnej logiki nie jest zbyt efektywne). 4. UkĹady przetwarzania sygnaĹĂłw zegarowych (nazywane PLL, DCM, CCM, MMCM, ...) -- przesuwajÄ fazÄ sygnaĹĂłw zegarowych, dzielÄ bÄ dĹş mnoĹźÄ czÄstotliwoĹÄ, itp. Kafle FPGA sÄ poĹÄ czone ze sobÄ programowalnymi poĹÄ czeniami -- istnieje wiele linii ĹÄ czÄ cych kafle ze sobÄ , a w kaĹźdym kaflu jest duĹźo programowalnych punktĂłw poĹÄ czeĹ (pip -- programmable interconnection point), ktĂłre aktywujÄ poĹÄ czenia miÄdzy liniami i wejĹciami/wyjĹciami kafli. UkĹady FPGA majÄ rĂłwnieĹź dedykowanÄ sieÄ poĹÄ czeĹ sĹuĹźÄ cÄ do dystrybucji sygnaĹĂłw zegarowych tak, aby zbocza zegara przychodziĹy do wszystkich elementĂłw w miarÄ synchronicznie. Po wiÄcej szczegĂłĹĂłw odsyĹam do dokumentacji konkretnego rodzaju FPGA. W przypadku Zynq sÄ to miÄdzy innymi: - https://www.xilinx.com/support/documentation/user_guides/ug474_7Series_CLB.pdf - https://www.xilinx.com/support/documentation/user_guides/ug473_7Series_Memory_Resources.pdf - https://www.xilinx.com/support/documentation/user_guides/ug479_7Series_DSP48E1.pdf - https://www.xilinx.com/support/documentation/user_guides/ug472_7Series_Clocking.pdf - https://www.xilinx.com/support/documentation/user_guides/ug471_7Series_SelectIO.pdf Proces projektowania ukĹadu cyfrowego ===================================== Projektowanie ukĹadĂłw cyfrowych jest w wysokim stopniu zautomatyzowane. Proces ten skĹada siÄ z nastÄpujÄ cych krokĂłw: 1. Piszemy opis funkcjonalny ukĹadu w jÄzyku opisu sprzÄtu, bÄ dĹş skĹadamy nasz ukĹad z gotowych blokĂłw. IstniejÄ trzy jÄzyki opisu sprzÄtu (HDL -- hardware description language) akceptowane przez narzÄdzia wiÄkszoĹci producentĂłw: - Verilog (najprostszy) - SystemVerilog (mocno rozszerzona wersja Veriloga, niestety maĹo narzÄdzi go wspiera) - VHDL (skĹadniowo mocno przypomina jÄzyk Ada, doĹÄ skomplikowany) JÄzyki te sÄ doĹÄ stare i nieco nieporÄczne. Obecnie czÄsto uĹźywa siÄ nowszych jÄzykĂłw, ktĂłre sÄ tĹumaczone do jednego z powyĹźszych (zazwyczaj Veriloga). Z waĹźniejszych moĹźna wymieniÄ: - Chisel (na bazie Scali) - SpinalHDL (rĂłwnieĹź Scala) - Clash (na bazie Haskella) - migen i nMigen (na bazie Pythona) Na zajÄciach domyĹlnie bÄdziemy uĹźywaÄ jÄzyka nMigen. 2. Piszemy testy do naszego ukĹadu (w tym samym jÄzyku, co sam ukĹad, bÄ dĹş w innym), opis do weryfikacji formalnej, itp. 3. Uruchamiamy nasze testy w symulatorze, uruchamiamy weryfikator. 4. UĹźywamy automatycznych narzÄdzi producenta do przeksztaĹcenia naszego opisu w binarny plik konfiguracyjny (tzw. bitstream) gotowy do zaĹadowania na ukĹad FPGA: 1. Synteza: tĹumaczenie (przez program, podobny ideowo do kompilatora) jÄzyka opisu sprzÄtu na tzw. netlistÄ, czyli listÄ instancji prymitywĂłw obecnych w danym typie FPGA (LUTĂłw, przerzutnikĂłw, itp) i poĹÄ czeĹ miÄdzy nimi. 2. Place and route: rozmieszczamy zmapowane prymitywy (kaĹźdemu znajdujemy fizyczne miejsce na wybranym ukĹadzie FPGA) oraz rozplanowujemy sieÄ poĹÄ czeĹ miÄdzy nimi (wykorzystujÄ c zasoby danego FPGA). MoĹźe siÄ nie udaÄ -- w tym wypadku musimy zaczÄ Ä optymalizowaÄ nasz projekt, bÄ dĹş kupiÄ wiÄkszy ukĹad FPGA. 3. Generowanie bitstreamu: generujemy ostateczny plik konfiguracyjny dla danego ukĹadu. 5. Wykonujemy analizÄ czasowÄ -- dowiadujemy siÄ, jakie opóźnienia mamy w finalnym ukĹadzie (po place and route) i z jakÄ maksymalnÄ czÄstotliwoĹciÄ moĹźe dziaĹaÄ. JeĹli nie jesteĹmy zadowoleni z wyniku, wracamy do punktu 1. 6. Uruchamiamy nasze testy w symulatorze jeszcze raz, tym razem na finalnym ukĹadzie (z symulowanymi opóźnieniami). 7. WysyĹamy bitstream na ukĹad FPGA i cieszymy siÄ naszym ukĹadem. 8. Wrzucamy zdjÄcie na twittera. TrudnoĹci w projektowaniu ukĹadĂłw cyfrowych ------------------------------------------- W fizycznym Ĺwiecie istniejÄ tylko ukĹady analogowe. Zadaniem projektanta sprzÄtu jest uĹźyÄ ich tak, Ĺźeby zachowywaĹy siÄ jak ukĹady cyfrowe. Jest wiele puĹapek, czÄsto w nieoczywistych miejscach. W prawdziwym Ĺwiecie, sygnaĹy elektryczne nie rozchodzÄ siÄ natychmiastowo i nie zmieniajÄ siÄ natychmiast z 0 na 1 -- istniejÄ stany poĹrednie. Przerzutniki tak naprawdÄ nie ĹapiÄ stanu wejĹcia z momentu wystÄ penia zbocza, tylko z pewnej dĹuĹźszej chwili -- jeĹli wejĹcie siÄ w tym czasie zmieni, moĹźemy bardzo boleĹnie przekonaÄ siÄ, Ĺźe Ĺwiat nie jest zero-jedynkowy. PrzesyĹanie danych z niskimi czÄstotliwoĹciami (50MHz) jest proste -- ustawiamy stan na nóşkach jednego ukĹadu, ĹÄ czymy je z nóşkami innego ukĹadu, odczytujemy tam stan. Jednak w miarÄ zwiÄkszania czÄstotliwoĹci coraz boleĹniej przypominamy sobie o istnieniu praw fizyki: - róşne linie na pĹytce drukowanej bÄdÄ miaĹy róşnÄ dĹugoĹÄ i przez to róşne opóźnienia - opóźnienia sÄ zaleĹźne od temperatury - od pewnej czÄstotliwoĹci, nasza ĹcieĹźka na pĹytce staje siÄ antenÄ i zaczyna wymagaÄ terminatorĂłw na koĹcach - sÄ siednie ĹcieĹźki na pĹytce wpĹywajÄ na siebie przez siĹÄ elektromagnetycznÄ Nawet ze skĹadaniem prostych funkcji logicznych bywajÄ problemy. Czy ten ukĹad jest poprawnÄ implementacjÄ MUX 2:1? .. image:: hazard.svg .. - latch, ff .. - zastosowania