Šustovo skriptaVHDL I.VHDL II.Šustovo stránky předmětu APOLOS (Šustovo skripta simplified verze)
Většina logických hradel dnes používá CMOS (Complementary Metal–Oxide–Semiconductor) transistory.
Karnaughovy mapy jsou metoda pro minimalizaci logických funkcí. Slouží ke zjednodušení a zpřehlednění zápisu v porovnání s pravdivostní tabulkou. Karnaughova mapa pro $n$ proměnných vždy obsahuje $ 2^n$ polí, kde každé pole reprezentuje kombinaci právě vstupních hodnot.
Karnaughovu mapu lze chápat jako rozvinutí n-rozměrné hyperkrychle, kde každý vrchol představuje právě jednu kombinaci vstupů a každá hrana změnu jednoho bitu. Pokrytí rohů, hran i vnitřních bloků v mapě odpovídá hledání souvislých oblastí (=krychlí) v n-dimenzionálním hyper-krychli. Příklady vizualizace:
Popisuje řazení Karnaughovy mapy tak, aby se při jednom horizontálním nebo vertikálním pohybu v mapě měnila pouze jedna logická hodnota najednou - usnadňuje tak čtení. Mapy nejsou řazeny klasicky binárně $\{(00), (01), (10), (11) \} $ ale jako $\{(00), (01), (11), (10) \} $
Hazardy (přechodové děje) v logických obvodech jsou způsobeny zpožděním logických hradel (propagation time delay). Vznikají při existenci více cest uvnitř logického obvodu (tj. tehdy, když existují cesty, které mají různé propagační zpoždění). Projevují se jako krátké glitch pulsy, buď statické (krátké invertování aktuálního ustáleného stavu - z 0 do 1 nebo z 1 do 0), nebo dynamické (série přechodových pulsů).
Při návrhu je potřeba s hazardy vždy počítat, protože jednotlivá zpoždění se mění například s teplotou zařízení a na běžných FPGA je tak nelze zcela odstranit změnou booleovského zápisu (nástroje je však mohou do určité míry potlačit).
Statické hazardy lze v synchronních obvodech potlačit tak, že se výstup vzorkuje až po ustálení logiky (po uplynutí worst-case propagation delay), zatímco v asynchronních obvodech mohou způsobit chybu logiky. Obecně se dají potlačit přidáním redundantních členů do logické funkce. Zároveň platí, že dynamické hazardy lze potlačit potlačením statických hazardů a zjednodušením logické struktury.
BDD (Binary Decision Diagrams) jsou datové struktury používané pro reprezentaci a manipulaci s booleovskými funkcemi, například při verifikaci hardwaru či model checkingu - obecně míst, kde se opakovaně vyčísluje mnoho logických výrazů. vycházejí ze Shannonovy expanze booleovské funkce. Jsou reprezentovány jako orientované acyklické grafy (DAG), kde každý vnitřní uzel odpovídá testu jedné proměnné a má dvě hrany: větev pro $x_i = 0$ a větev pro $x_i = 1$
Ve většině praktických aplikací se nepoužívají obecné BDD, ale hlavně OBDD (ordered BDD) a ROBDD (reduced ordered BDD).
Mají $M$ vstupů a $N$ výstupů ($N = 2^M$), převádí binární kód na aktivaci právě jednoho z N výstupů. Používají se v konečných automatech na očíslování stavů.
2 typy:
Stejné jako dekodér 1 z N, navíc přidává data na logický výstup (při $x_1$ a $x_0$ určujících výstup ještě záleží zda Datový bit je 1 nebo 0).
Multiplexor je opak Demultiplexoru, který lze chápat jako přepínač typu $N:1$. Převádí $N$ datových vstupů na 1 výstup pomocí M adresních bitů $x_0,\dots, x_{m-1}$ . Adresní bity tak určují, který vstup bude přiveden na výstup - $N:1$.
Úplná sčítačka je složená ze dvou Half Adderů (HA, HB), má 3 vstupy ($\mathbf{x, y, C_{in}}$(Carry)).
Postup výpočtu:
Přičítá +1 do n-bitového čísla. Používá kaskádu full adderů, kam postupně přetéká carry z předchozího kroku (počáteční stav je full adder s $x=x_0$, $y=1$, $C_{in}=0$). Na nejnižším bitu $x_0$ se provede operace $x_0 + 1$.
Pokud Carry proteče celou kaskádou přes nejvyšší bit, přeteče celé n-binární číslo (overflow) - z 1111 se stane 0000.
Odečítá −1 od n-bitového čísla. Funguje pomocí kaskády full adderů, kde se místo carry používá borrow (výpůjčka), která se šíří od nejnižšího bitu směrem nahoru. Na nejnižším bitu $x_0$ se provede operace $x_0 - 1$.
Na každý vyšší bit $x_i (i \ge 1)$ se aplikuje případný borrow z předchozího kroku.Borrow se tedy šíří přes všechny nejnižší nuly, dokud nenarazí na první jedničku. Pokud borrow proteče až za nejvyšší bit, nastává podtečení (underflow) - z 0000 se stane 1111.
Reset-Set (RS) latch (úrovňový klopný obvod RS) je nejjednodušší paměťový prvek. Umí uchovat 1 bit informace pomocí zpětné vazby dvou hradel. Existují dvě základní varianty - z NAND a NOR hradel.
Latch má dvě zpětně propojená hradla, na základě uloženého stavu se při nenulovém vstupu určuje stav následující.
Zakázaným stavem je $Q=NQ$, protože po určitou dobu vzniká metastabilita (obvod není stabilní ani v 1 ani v 0) - po uvolnění vstupů závisí výsledek na jejich zpoždění.
Data Flip-Flop (DFF) je základní synchronní paměťový obvod, který je tvořený dvěma D-latch (RS-latch s enable signálem) obvody za sebou. Má vstup (D), výstup (Q) a hodiny (CLK - řídí enable vstup D-latchů). Na každé aktivní hraně hodin (rising/falling edge) uloží hodnotu D do Q.
Dva D-latche, které tvoří DFF se nazývají Primary a Replica, jejich enable vstupy jsou řízeny signálem CLK, respektive jeho invertovanou verzí:
Díky propojení právě těchto dvou latchů (Primary + Replica) výsledek Q reaguje pouze na konkrétní hranu (například vzestupnou). Během fáze mezi dvěma po sobě jdoucími hranami se Q nemění, i kdyby D dramaticky kolísalo. Proto se říká, že DFF je edge‐triggered.
Aby Primary D‐latch „správně“ zachytil vstup D bez rizika metastability, musí být D ustálené po dostatečnou dobu před náběžnou hranou CLK (tzv. setup time) a nesmí se měnit hned po hraně (tzv. hold time).
Pokud tyto časy nejsou dodrženy, nastane u Primary D‐latch (s určitým pravděpodobnostním rizikem) metastabilita. Pokles CLK (sestupná hrana) naopak nevyžaduje žádné striktní setup/hold pro Replica.
Stav, kdy se vnitřní invertory se nedokážou jednoznačně rozhodnout na „0“ nebo „1“ a mohou se někdy dlouho chaoticky „kmitat“, než se ustálí. Vzniká, pokud D mění hodnotu příliš blízko aktivní hrany CLK (nedodržení setup/hold). Projevuje se jako nestabilní, váhavý stav vnitřních invertorů Primary D‐latch, který se může rozkládat na čisté 0/1 s nedefinovaným zpožděním.
Je možné ji zmírnit:
Nelze ji naprosto vyloučit, jen zredukovat pravděpodobnost na zanedbatelné minimum.
Zapojení několika stejných digitálních bloků za sebou tak, že výstup jednoho je vstupem dalšího a změna se šíří postupně („vlní se“) od prvního stupně dál. Když je ripple kaskáda se synchronním přenosem, znamená to, že jednotlivé stupně jsou řízené společným clockem (synchronně), ale přenos (carry/borrow) mezi nimi se šíří postupně jako v ripple struktuře.
Paralelní sada D‐flip‐flopů (DFF), která na náběžnou hranu CLK „uzamkne“ všechny bity současně. Může mít volitelné synchronní „nulování“ (RESET nebo SCLR), případně asynchronní CLEAR „na všech DFF“.
Vezmeme n‐bitový registr (kde n je počet DFF), na jeho paralelní výstup $Q$ připojíme kaskádově jednobitovou sčítačku +1 (Full Adder chain).
Tím vzniká n‐bitový čítač, který se „odráždí“ v posloupnosti 0,1,2,3,… modulo $2^n$.
Čítače se skládají z řetězu jedno‐bitových adderů + DFF. Výhodné pro malé n, mají jednoduchou konstrukci, ale frekvence omezuje délka řetězce.
Synchronní čítače (paralelní sčítačka + mux) dovedou dosáhnout vyšší frekvence u větších n, ale vyžadují větší plošnou logiku (adder, komparátor, mux).
Syntéze je proces, kdy se abstraktní popis chování obvodu (RTL kód) převede na konkrétní hardwarovou strukturu tvořenou logickými hradly, registry a propojkami.
Process je základní konstrukce VHDL, která popisuje sekvenční chování obvodu. Uvnitř procesu se příkazy vykonávají sekvenčně v rámci jednoho běhu simulace. Proces může popisovat:
Přesná syntaxe příkazu vypadá takto (části v [ ] lze vynechat):
[optional_label:] process [(optional sensitivity list)] [is] [sequential_declarations] begin sequential statements end process [optional_label];
Proces se v syntéze mapuje na kombinační nebo sekvenční (registrovou) logiku podle jeho struktury:
Přiřazení proměnné (sekvenční přiřazení). Pouze uvnitř procesů, procedur nebo funkcí (sequential statements).
Přiřazení var := expr; okamžitě změní hodnotu proměnné v v té samé „iteraci“ procesu, následující řádek kódu už čte tuto novou hodnotu v (tj. v se chová jako běžná proměnná v imperativním jazyce).
Přiřazení signálu (sig ⇐ expr). Není provedeno okamžitě, ale jejím výsledkem je vložení „nové hodnoty” do fronty aktualizací (delta‐cykly).
– Importujeme standardní IEEE knihovny pro práci se signály std_logic library ieee; use ieee.std_logic_1164.all;– Deklarace entity, tedy rozhraní D‐flip‐flopu entity DataFlipFlop is port ( Data : in std_logic; – Vstup D: data, která chceme ovzorkovat CLOCK : in std_logic; – Hodinový signál (CLK), na jehož hranu reagujeme ENABLE : in std_logic; – Povolení zápisu: když ENABLE='1', povolíme přepsat Q ACLRN : in std_logic; – Asynchronní clear (active‐low): když ACLRN='0', Q se ihned vynuluje SCLEAR : in std_logic; – Synchronní clear (active‐high): po náběžné hraně CLK, pokud SCLEAR='1', Q se vynuluje Q : out std_logic – Výstup Q: zde se objeví poslední uložená hodnota D ); end entity DataFlipFlop;– Architekturální popis: popisujeme vnitřní chování entity architecture rtl_final of DataFlipFlop is begin – Proces, který definuje chování DFF – Sensitivity list: proces “vidí” změny signálů CLOCK i ACLRN process (CLOCK, ACLRN) begin – 1) Ošetření asynchronního clear (ACLRN = '0' → okamžitě nastav Q na '0') if ACLRN = '0' then Q ⇐ '0'; – Jakmile ACLRN přejde na '0', obvod se okamžitě vynuluje, nezávisle na stavu hodiny – 2) Pokud není aktivní asynchronní clear, čekáme na náběžnou hranu CLOCK elsif rising_edge(CLOCK) then – 2a) Synchronní clear (pokud SCLEAR = '1' na hranu CLK, pak Q ≤ '0') if SCLEAR = '1' then Q ⇐ '0'; – Priorita synchronního clear má přednost před povolením ENABLE a před čtením Data – 2b) Pokud žádný clear není aktivní, řešíme ENABLE elsif ENABLE = '1' then Q ⇐ Data; – Jestliže ENABLE = '1', na hranu CLK se do Q zapíše aktuální hodnota na vstupu Data – 2c) Když ani synchronní clear, ani ENABLE není aktivní, zachovává se předešlá hodnota Q – (nepíšeme žádné další přiřazení; Q zůstane takové, jaké bylo) end if; – 3) Konec detekce hrany: v jiných případech (kdy ACLRN='1' a žádná hrana CLK) se nic neděje end if; end process; end architecture rtl_final;
Funkce („function“) vrací jednu hodnotu na základě vstupních parametrů. Do obvodu se „rozbalí“ (in‐line) do kombinatorní sítě či logiky, pokud je syntetizovatelná. Funkce nesmí mít výstupní parametry a návratová hodnota je jediný způsob komunikace. Typy funkce:
[pure | impure ] function function_name (parameter_list) return type_name is [sequential_declarations] begin sequential statements end [function] [function_name]
Procedury („procedure“) slouží pro popis podřízených bloků logiky, které mohou současně ovlivnit několik signálů nebo proměnných. Mohou „vracet“ více hodnot (pomocí out/inout parametrů) - např. signal Y : out …, variable W : out …
Volají se pouze uvnitř sequential domény (procesy, jiné procedury, funkce) - variable přiřazení (':=') vyžaduje sekvenční context.
procedure identifier [ (formal_parameter_list) ] is [sequential_declarations] begin sequential statement(s) end [procedure] [identifier]
Zde příklad pro vyhodnocení logického stavu hradla “2-and-or”:
entity and_or is port( a : in std_logic; b : in std_logic; d : in std_logic; e : in std_logic; g : out std_logic); end and_or; architecture and_or_a of and_or is– declarative part: empty begin process_and_or : process(a,b,d,e)– declarative part: empty begin g ⇐ (a and b) or (d and e); end process process_and_or; end and_or_a;
Používají se všude, kde systém závisí na sekvenci událostí v čase, ne jen na aktuálním vstupu.
Výstupy se generují ze stavu, v němž se právě nachází automat. Výstup se změní, pokud se změní stav. Má více stavů a stabilní výstup, je pomalejší.
Výstupy se generují ze současného stavu a okamžitého vstupu, tj. výstupy se tvoří v době přípravy automatu na přechod z jednoho stavu do druhého (výstup reaguje na změnu vstupu okamžitě). Má méně stavů, je rychlejší, ale je citlivější.
Má formát čtvercové matice sousednosti (eng. adjacency matrix) používané k popisu grafů. Zůstává přehledná i při značném počtu stavů. Je-li p počet všech stavů, pak má rozměr $p\times p$
Průsečík - podmínky $x$ přechodu ze stavu $s_k$ do $s_j$
V řádcích všechny možné vnitřní stavy ($s_i$), ve sloupcích jsou všechny možné vstupy ($x_i$).
Má dvě části:
Průsečík - následný stav $s_k$
K jakémukoli Mooreovu automatu existuje ekvivalentní Mealyho automat se stejným nebo menším počtem stavů.
Ke každému Mealyho automatu, který má $\mathbf{N}$ stavů a rozpoznává $\mathbf{X}$ možných kombinací vstupů, existuje ekvivalentní Mooreův automat mající $\mathbf{N\cdot X}$ stavů.
Převody se provádí pomocí analýzy tabulky přechodů.
Výstup se přesune ze stavů na přechody, každý přechod dostane výstup cílového Moore stavu. Počet stavů se obvykle nemění. Výstup reaguje rychleji (už během přechodu).
Výstupy se přesunou z přechodů do stavů, ty se obvykle rozdělí podle různých výstupů. Počet stavů často naroste. Výstupy jsou stabilnější.
|
| Převod Mealy → Moore (kvalita obrázku je šajs, originál tady) |
|---|
architecture rtlFSM of StartStopFSM is begin ifsm: process(CLK) type state_t is (ROFF, RON); – enumerated types are reserved only for FSMs variable state: state_t:=ROFF; begin iRedge : if rising_edge(CLK) then iClrn: if CLRN='0' then state:=ROFF; – always clear else case state is when ROFF ⇒ if START='1' and STOP='0' then state:=RON; end if; when RON ⇒ if STOP='1' then state:=ROFF; end if; end case; end if iClrn; end if iRedge; if state=RON then RUN⇐'1'; else RUN⇐'0'; end if; end process; end architecture;
Řadiče (control unit) jsou část číslicového systému nebo procesoru, která řídí vykonávání operací v datapathu. Jejich nejpravděpodobnější akcí je přejití do následujícího stavu po splnění dané podmínky. Generují řídicí signály pro registry, ALU, paměti, sběrnice a další části obvodu.
Jedná v podstatě o složitější čítač s tím rozdílem, že pro přechod do dalšího stavu (i.e. přičtení čísla), musí být splněna nějaká podmínka.
Máme předem určenou posloupnost stavů, do kterých se po splnění podmínky posouváme:
Posuvný registr je série zřetězených D‐flip‐flopů (DFF). Výstup jednoho DFF → vstup následujícího. Posun hodnoty v řetězci nastává při každém taktu hodin (první DFF čte data na vstupu (SI) a posílá dál svoje data do kaskády). Výstup posledního DFF řetězce je SO (Serial Out - výstup registru).
LFSR (Linear Feedback Shift Register) je posuvný registr se zpětnou vazbou, kde se nový vstupní bit generuje jako XOR vybraných bitů registru (tzv. tap positions).
Phase-Locked Loop (PLL) je uzavřená regulační smyčka, která synchronizuje fázi a frekvenci lokálního oscilátoru s referenčním signálem. PLL porovnává referenční frekvenci a zpětnovazební signál odvozený z výstupu VCO a průběžně upravuje oscilátor tak, aby byla minimalizována fázová chyba.
Analogie - převody na kole (Fischer GOAT).
Uzavřená regulační smyčka, která „zamkne“ fázový posun výstupního oscilátoru (VCO) za fází referenčního signálu. Upravuje frekvenci VCO tak, aby platilo $\frac{f_{VCO}}{M} = \frac{f_{REF}}{N} $.
Všechny vstupy FPGA musí mít definovanou logickou úroveň (pull-up/pull-down).
Plovoucí vstup (floating input) vede k náhodnému rušení a vyššímu odběru proudu → nepoužívané vstupy se nesmí nechávat nezapojené.
Pomalé změny signálu mohou způsobit opakované překročení logického prahu, vznik metastability, nebo zvýšený proud ve vstupních tranzistorech.
Filtrujeme je buď Schmittovými vstupy či bufferujeme, synchronizujeme do hodin pomocí flip-flopů, aby se vyhnuli metastabilitě.
Schmittův vstup - vstup s hysterezí - má dva napěťové prahy, mezi nimi “šedá zóna”, kde nedochází ke změně logické hodnoty (tj. $V_{in} < V_{th-} \implies 0, V_{in} > V_{th+} \implies 1$).
Odskoky tlačítek (zákmity, bouncing) jsou způsobeny mechanickým odrážením kovových kontaktů při sepnutí nebo rozepnutí tlačítka. Čím je tlačítko opotřebenější, dochází k odskokům častěji.
Dají se ošetřit dvěma způsoby:
FPGA výstupy nejsou určeny pro přímé řízení výkonových nebo indukčních zátěží.
Při vypnutí vzniká vysoké indukované napětí, to může poškodit tranzistory nebo FPGA IO.
Řešení: Flyback dioda pro DC cívky; RC snubber nebo TVS dioda pro AC/rychlé spínání.
Oddělit výstup FPGA dedikovaným driverem (MOSFET, buffer) s ochranným RC, řídit dI/dt (slew-rate), přidat teplotní/přetížení ochrany.
Při vyšších rychlostech se vodič chová jako přenosová linka.
| Výhody | Nevýhody |
|---|---|
| Rychlá a neomezeně opakovatelná rekonfigurace. | Citlivost na radiaci (ztráta konfigurace) → pro kosmické aplikace se vyrábějí verze “radiation-hardened” (umožňují vzdálené dožití softwaru). |
| Velké množství LUT/CLB a embedovaných SRAM bloků (např. Cyclone IV: 3981312 bitů ve 432 blocích M9K, vs. Cyclone II: 483840 bitů ve 105 blocích M4K) | Po ztrátě napájení je nutná opětovná konfigurace (boot time). |
| Digitální PLL pro násobení frekvencí, DSP bloky, rychlé carry-chainy aj. | |
| Relativně nízká cena (např. Cyclone II od ~$20, Cyclone IV od ~$65, rok 2022) |
Princip: Konfigurační buňky jsou vnitřní Flash buňky (NAND nebo NOR). Obsah si pamatují i po vypnutí napájení (nevolatilní).
| Výhody | Nevýhody |
|---|---|
| Konfigurace je zachována i po vypnutí napájení (nevolatile). | Pomalejší rekonfigurace než SRAM FPGA. |
| Rychlý start – FPGA je po zapnutí okamžitě funkční. | Obvykle vyšší cena než čisté SRAM varianty. |
| Nižší klidová spotřeba (není nutná externí konfigurační paměť). | Menší flexibilita při častém přepisu konfigurace. |
| Vyšší odolnost proti částečné radiaci než SRAM FPGA. | Omezený počet přepisovacích cyklů Flash buněk. |
Princip: Konfigurační prvek je antifuse prvek (připomíná pojistku, ve výchozím stavu otevřený, programovacím pulzem se neprůstřelně „přepálí” a vytvoří pevný vodivý spoj)
| Výhody | Nevýhody |
|---|---|
| Velmi vysoká odolnost proti radiaci (vhodné pro kosmické aplikace). | Jednorázové naprogramování – nelze přepsat. |
| Velmi stabilní a spolehlivé propojení (fyzický vodivý spoj). | Velmi dlouhá a neflexibilní konfigurace (jednorázový proces). |
| Žádná potřeba konfigurační paměti po zapnutí. | Vyšší riziko chyb při návrhu – nelze opravit po výrobě/programování. |
| Nízká citlivost na SEU (single event upset). | Nevhodné pro vývoj a prototypování. |
Má jednu adresní sběrnici, jedno data‐in a jedno data‐out, a jeden řídicí vstup např. „Write Enable (WE)“ + hodinový vstup.
Operace:
| Výhody | Nevýhody |
|---|---|
| Jednoduchá architektura paměťového bloku. | Nelze současně číst a zapisovat. |
| Menší plocha a nižší spotřeba. | Konflikt mezi čtením a zápisem (pipeline hazard). |
| Snadná implementace v FPGA (LUT/RAM bloky). | Omezená propustnost paměti. |
Obsahuje dvě nezávislé adresní sběrnice (adresy A, B), každou se samostatným datovým vstupem, výstupem a hodinou.
Operace:
| Výhody | Nevýhody |
|---|---|
| Možnost současného čtení a zápisu. | Vyšší spotřeba a větší plocha. |
| Paralelní přístup ze dvou nezávislých zdrojů. | Složitější řídicí logika. |
| Vhodná pro FIFO a sdílené buffery mezi doménami. | Riziko konfliktů při přístupu ke stejné adrese. |
Některé FPGA umožňují 4portové či 8portové bloky (především uvnitř vestavěných procesorů). Každý port samostatně může číst či zapisovat. Softwarově se konfiguruje, zda bude port jako čtecí či zapisovací.
| Výhody | Nevýhody |
|---|---|
| Velmi vysoká paralelní propustnost paměti. | Výrazně vyšší hardwarová složitost. |
| Možnost více nezávislých čtení/zápisů současně. | Vysoká spotřeba a plocha. |
| Vhodné pro specializované výpočetní jednotky. | Komplexní arbitráž přístupu mezi porty. |