====== Logické systémy a procesory ======
==== Realizace operací s daty pomocí kombinačních a sekvenčních logických obvodů s vyloučením hazardů a metastability. Obvodová struktura konečných automatů a řadičů procesorů. Popisy obvodů pomocí HDL jazyků a funkční testování obvodů. ====
[[https://dcenet.fel.cvut.cz/edu/fpga/doc/LogickeObvodyNaFPGA.pdf|Šustovo skripta]][[https://dcenet.fel.cvut.cz/edu/fpga/doc/UvodDoVHDL1_concurrent_V20.pdf|VHDL I.]][[https://dcenet.fel.cvut.cz/edu/fpga/doc/UvodDoVHDL2_sequential_Vbeta0.51.pdf|VHDL II.]][[https://dcenet.fel.cvut.cz/edu/fpga/navody.aspx|Šustovo stránky předmětu]]
* Logická CMOS hradla a jejich vlastnosti. Typy AND, NAND, OR, NOR a XOR.
* Minimalizace log. funkcí v Karnaughových mapách, teoretické zázemí, logická krychle, grayovy kódy, skupinová minimalizace. Hazardy v kombinačních obvodech.
* Uplatnění De Morganova teorému. Užití Shannonovy expanze a její aplikace ke konstrukci BDD (Binary Decision Diagram), výhody, omezení
* Základní logické obvody: dekodér 1 z N, demultiplexer, multiplexory a jejich kaskády, sčitačka +1 a -1 a úplná sčítačka. Převodníky mezi binárním a zrcadlový grayovým kódem.
* Úrovňové klopné obvody RS (RS-Latch) z hradel NAND a NOR, jejich chování a za jakých podmínek u nich mluvíme o zakázaných stavech.
* Synchronní klopné obvody DFF (Data Flip-Flop) architektury Primary-Replica (zastarale Master-Slave). Jejich vlastnosti a podmínky činnosti. Metastabilita DFF. Vysvětlení příčin, jak a kdy lze odstranit.
* Čítače a typy jejich spojování do ripple-kaskád a se synchronními přenosy.
* Příkaz process ve VHDL, rozdíl mezi chování blocking := a non-blocking příkazů <=. Popis obvodů DFF ve VHDL procesu. VHDL funkce a procedury.
* Konečné automaty typu Moore a Mealy. Jejich definice, popisy pomocí grafu přechodů, tabulky přechodů a stavové tabulky přechodů (jiný název matice přechodů). Minimalizace automatu Moore na Moore a Moore na Mealy. Kdy lze? Návrh automatu a jeho popis ve VHDL.
* Řadiče a mikroprogrové řadiče. Vlastnosti a architektura.
* Posuvné registry a posuvné registry s lineární zpětnou vazbou (LFSR), pouze hlavní principy jejich teoretického zázemí a vlastnosti.
* Násobení frekvencí fázovými závěsy (Phase-Locked Loop)
* Správné ošetření vstupů, plovoucí vstupy, pomalé náběžné hrany, odstranění zákmitů tlačítek (debouncing). Chránění výstupů s indukčních zátěží a výkonovou zátěží. Chování logického signálu na vodiči.
* Používané FPGA technologie a jejich vlastnosti. Struktura SRAM paměti, paměti s jednoportovou a dvou portovou výběrovou logikou.
======Logická CMOS hradla a jejich vlastnosti. Typy AND, NAND, OR, NOR a XOR.======
{{ :statnice:bakalar:cmos-05-30_20-07-17.png?400 |Struktura NMOS PMOS}}
Většina logických hradel dnes používá CMOS (Complementary Metal–Oxide–Semiconductor) transistory.
* CMOS kombinuje NMOS (N-kanálové) a PMOS (P-kanálové) tranzistory, což zajišťuje nízkou statickou spotřebu.
* Alternativně se používají i TTL (bipolární tranzistory), ale v integrovaných obvodech převládají CMOS.
* Polovodič typu N (Si dopovaný pětivalentní příměsí) – nosiči jsou volné elektrony.
* Polovodič typu P (Si dopovaný třívalenční příměsí) – nosiči jsou díry.
* NMOS (substrát P-typu): při kladném napětí na gate > Vth>Vth vzniká kanál z minoritních nosičů (elektronů) ⇒ tranzistor vodí.
* PMOS (substrát N-typu): při záporném napětí na gate < −Vth<−Vth vzniká kanál z děr ⇒ vodivost; kladné napětí „1“ na gate tranzistor uzavírá.
* Elektrody: Source (zdroj nosičů), Drain (sběrač), Gate (řídicí elektroda), Body (substrát, u IC je vnitřně spojen s S).
=== CMOS Invertor ===
{{:statnice:bakalar:screenshot-2023-04-14-at-2.27.30-pm-768x869.png?600|}}
=== CMOS NAND ===
* PMOS paralelne nahore
* NMOS serie dole
{{:statnice:bakalar:screenshot-2023-04-14-at-4.02.16-pm-768x471.png?600|}}
=== CMOS NOR ===
* PMOS seriove nahore
* NMOS pralelne dole
{{:statnice:bakalar:screenshot-2023-04-14-at-4.25.13-pm-768x494.png?600|}}
=== CMOS AND ===
{{:statnice:bakalar:screenshot-2023-04-14-at-6.53.45-pm-768x593.png?600|}}
=== CMOS OR ===
{{:statnice:bakalar:screenshot-2023-04-14-at-6.44.01-pm-768x567.png?600|}}
=== CMOS XOR ===
{{:statnice:bakalar:screenshot-2023-04-14-at-7.09.58-pm-927x1024.png?600|}}
====== Minimalizace log. funkcí v Karnaughových mapách, teoretické zázemí, logická krychle, grayovy kódy, skupinová minimalizace. Hazardy v kombinačních obvodech. ======
=== Minimalizace logických funkcí v Karnaughových mapách ===
*
* SoP (Sum-of-Products): hledáme AND-implikanty („krychle“) pokrývající co nejvíc „1“. Každý implikant odpovídá skupině 2ᵏ sousedních polí (k=0…n) a vyjádří se jako součin proměnných bez změny hodnoty v těchto polích. Primární implikanty (nelze rozšířit) se ORují do výsledku. Priklad (A and B) or (C and D)
* PoS (Product-of-Sums): analogicky pokrýváme „0“ OR-implikanty a spojujeme je AND, dodefinujeme don't-care na 0. Priklad (A or B) and (C or D)
* Don't-care (X): v mapě u výstupů značí nezáleží-na; lze je zahrnout do implikantů (pro SoP jako „1“, pro PoS jako „0“) a dodatečně je přiřadit ke zvýhodnění pokrytí
==== Logická krychle ====
* K³ při n=3 proměnných, n⁴ při n=4 – každý vrchol krychle ↔ kombinace vstupů. KM pro n=4 je rozvinutá krychle 4×4
* 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.
==== Gray Code ====
* Binary-reflected Gray Code: standardní pořadí os čtyř proměnných v KM: {00,01,11,10}
* Vždy tak, aby se měnila pouze jedna hodnota
==== Hazardy ====
//GPT podle skript//
* Hazardy vznikají kvůli rozdílným zpožděním v různých cestách kombinační logiky a projevují se jako krátké glitch pulsy (static-0, static-1, dynamické).
* V běžných FPGA nelze hazardy zcela odstranit pouze změnou booleovského zápisu – nástroje je sice mohou potlačit, ale kvůli teplotním či výrobním variacím, různým délkám cest a LUT implementaci je riziko vždy přítomné.
* Pro plně spolehlivou synchronní logiku je klíčové: vzorkovat výstup kombinační s dostatečným časovým posunem (t_wp), minimalizovat rozdíly v zpoždění (fan-out, buffery), a používat pouze edge-triggered D-FF (nikoli latch).
====== Uplatnění De Morganova teorému. Užití Shannonovy expanze a její aplikace ke konstrukci BDD (Binary Decision Diagram), výhody, omezení ======
{{:statnice:bakalar:demorgan-05-30_20-50-11.png?400|}}
==== Shannon ====
* při více než 4 proměnných - jednu zvolíme za 0 a uděláme KM, tu samou pak zvolíme za 1 a uděláme KM, výsledek pak dáme dohromady
* Příklad: f(a,b,c,d,e) - 5 vstupů, velká mapa,
* Rozdělíme Shannonem tak, že e prohlásíme 0 = f1(a,b,c,d,0) a vyčíslíme mapu.
* druhá část e = 1 - f2(a,b,c,d,1) a vyčíslíme KM
* Výsledek dohromady dáme (not E and f1) or (E and F2)
{{:statnice:bakalar:shannon-05-30_21-09-13.png?400|}}
* Citlivost na výběr proměnné – záleží, podle které proměnné se rozkládáme; nevhodně zvolená proměnná může vést ke složitějším kofaktorům a žádnému zjednodušení, někdy dokonce k růstu komplexity
* Heuristiky nejsou zaručené – i když se snažíme volit proměnnou tak, aby redukovala co nejvíce členů, nemusíme dosáhnout zmenšení výsledné funkce ani u jednoduchých aritmetických bloků (např. násobičky, sčítačky)
* Exponenciální růst pro některé funkce – bez vhodného uspořádání proměnných může velikost BDD i složitost rozkladu exponenciálně stoupat, což omezuje použití u velkých kombinací.
==== BDD?? ====
* to jsem v životě neslyšel v LSP
* ani to nemá popsané ve svých skriptech
* __GPT__ po schroustání skript:
* Z Shannonovy expanze se konstruují BDD (Binary Decision Diagrams), struktury ve tvaru acyklického grafu, kde každý uzel testuje jednu proměnnou a větví na podgrafy odpovídající kofaktorům xi=0xi=0 a xi=1xi=1
* Výhody BDD:
* Kanonická reprezentace (pro dané uspořádání proměnných je BDD jednoznačné)
* Efektivní operace jako sjednocení, průnik nebo negace funkcí přímo na grafech
* Umožňují rychlou verifikaci a manipulaci s velkými logickými výrazy
* Omezení BDD:
* Citlivost na pořadí proměnných: nevhodné uspořádání může způsobit exponenciální růst velikosti grafu
* Některé funkce (např. multiplikátory, sčítačky) nemají kompaktní BDD bez speciálních heuristik
====== Základní logické obvody: dekodér 1 z N, demultiplexer, multiplexory a jejich kaskády, sčitačka +1 a -1 a úplná sčítačka. Převodníky mezi binárním a zrcadlový grayovým kódem ======
==== Dekodér 1 z N ====
* M vstupů, N výstupů
* N = 2^M
* One Hot - log 1 pouze pro jedinou hodnotu vstupů, jinak 0
* One Cold - lon 0 pouze pro jedinou hodnotu vstupů, jinak 1
* převání unsigned číslo na kódování 1 z N
* využití v konečných automatech k očíslování stavů
{{:statnice:bakalar:1z4-05-31_10-36-04.png?400|Pravdivostní tabulka 1 z 4}}
{{:statnice:bakalar:znackz-05-31_10-37-00.png?400|KM a schema}}
==== Demultiplexor ====
* Stejné jako dekodér 1 z N + Data
* Při x1 a x0 určujících výstup ještě záleží zda Datový bit je 1 nebo 0.
* Hodnota Data se propíše na určený výstup
{{:statnice:bakalar:demux-05-31_10-47-20.png?400|Schema demultiplexoru}}
==== Multiplexor ====
* opak Demultiplexoru
* má 2^M datových vstupů - M je počet bitů vstupní adresy
* lze chápat jako přepínač N:1
* adresní bity x0, x1 zvolí jednu ze 4 poloh "přepínače" a přivede na výstup uřitý vstup - 4:1
{{:statnice:bakalar:41-05-31_11-02-37.png?400|Multiplexor 4:1}}
{{:statnice:bakalar:kaskada-05-31_11-03-29.png?400|Kaskáda 5x Mux 4:1 = 16:1}}
==== Úplná sčítačka ====
{{:statnice:bakalar:screenshot_from_2025-05-31_11-45-47.png?600|Úplná sčítačka}}
* je ze dvou Half Adderů
* má 3 vstupy
* x, y a Cin (Carry)
* HA spočte x+y
* HB sečte výsledek HA + Cin
* první poloviční spočte část součtu bez přenosu, druhá k tomu přičte vstupní přenos
==== Sčítačka +1 ====
* do n-bitového čísla přičítáme +1
* první bit x0 sčítáme +1 (full adder s y0 =1 a Cin =0)
* ostatní bity xi (i<0) se sčítají s yi =0 a Cin předchozího řádu
* pokud nejnižší bit x0 byl 0, přičte se 1 a není carry, přenos se zastaví na první pozici
* pokud x0 = 1, pak +1 způsobí přetečení a carry se posouvá do vyšších bitů
* pokud xi = 0, tak se tam utopí to Carry a přenos skončí, další přetečení není
* pokud xi = 1, při +1 dojde k přetečení a Carry pokračuje na x(i+1) bit
* pokud dojdeme až na nejvyšší bit a přeteče to i tam, přeteklo nám celé n-binární číslo
==== Sčítačka -1 ====
* Do n-bitového čísla odčítáme 1
* Na nejnižší bit x0 aplikujeme „odečti 1“ (borrow bit)
* Je-li x0=1, výsledkem S0=0 a borrow = 0 → odečítání končí hned.
* Je-li x0=0, výsledkem S0=1 a borrow = 1 → další bit – odečítáme dál.
* Na každý vyšší bit xi (pro i≥1) se díváme, zda k němu přišel borrow z nižšího
* Pokud žádný borrow (borrow i−1=0), pak Si=xi a borrow dál = 0.
* Pokud borrow (borrow i−1=1) → odečteme od xi:
* Když xi=1: Si=0, borrow další = 0 (odečítání se zastaví).
* Když xi=0: Si=1, borrow další = 1 (odečítání pokračuje).
* Pokud i na nejvyšším bitu vyjde borrow=1, nastalo „podtečení“
* To znamená, že původní číslo bylo 0, a výsledek 0−1 v n-bitech je 2^n−1.
====== Úrovňové klopné obvody RS (RS-Latch) z hradel NAND a NOR, jejich chování a za jakých podmínek u nich mluvíme o zakázaných stavech. ======
=== Klopné obvody RS ===
{{:statnice:bakalar:screenshot_from_2025-05-31_13-16-32.png?400|Klopení RS}}
* Hradla nemají zakázané stavy
* Díky nim se obvody můžou klopit
* Zakázaný stav je pouze Q=NQ, ale to je jen dokud se obvod nepřeklopí za čas 2*Tpřeklopení
{{:statnice:bakalar:screenshot_from_2025-05-31_13-19-43.png?400|Pravdivostní tabulka RS}}
====== Synchronní klopné obvody DFF (Data Flip-Flop) architektury Primary-Replica (zastarale Master-Slave). Jejich vlastnosti a podmínky činnosti. Metastabilita DFF. Vysvětlení příčin, jak a kdy lze odstranit ======
{{:statnice:bakalar:screenshot_from_2025-05-31_15-00-08.png?400|Ukázka DFF a D-Latch}}
* DFF může měnit stav jen při Rising edge, D-latch při enable vždy přepisuje stav ze vstupu na výstup
* DFF jsou dva D-latch za sebou
{{:statnice:bakalar:screenshot_from_2025-05-31_15-03-53.png?400|Princip DFF}}
=== Princip DFF ===
* DFF ovzorkuje vstup D právě na hraně hodinového signálu CLK (např. na náběžné hráně 0→1)
* Interně se klasický DFF skládá ze dvou D‐latchů (Primary a Replica), jejichž enable vstupy jsou řízeny signálem CLK a jeho invertovanou verzí:
* **Primary** D‐latch („Master“) má ENA = ¬CLK (invertované hodiny).
* Dokud je CLK = 1, ENA_Primary = 0 ⇒ Primary je v paměťovém režimu a drží si poslední uložené D.
* Když CLK = 0, ENA_Primary = 1 ⇒ Primary je transparentní a přebírá na svůj vstup hodnotu D (ale zatím nic nepropustí ven).
* **Replica** D‐latch („Slave“) má ENA = CLK.
* Dokud je CLK = 1, ENA_Replica = 1 ⇒ Replica je transparentní a na výstup Q pouští signál z Primary (přes jediný inverter, aby se vyrovnala polarita).
* Když CLK = 0, ENA_Replica = 0 ⇒ Replica se „uzavře“ do paměti, a Q drží tu hodnotu, kterou obdržela v okamžiku, kdy CLK právě překročil hranici 1→0.
* 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.
=== Podmínky činnosti ===
* 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, Primary D‐latch přejde (s určitým pravděpodobnostním rizikem) do metastabilního stavu – tj. vnitřní invertory se nedokážou jednoznačně rozhodnout na „0“ nebo „1“ a mohou se někdy dlouho chaoticky „kmitat“, než se rozhodnou.
* Pokles CLK (sestupná hrana) naopak nevyžaduje žádné striktní setup/hold pro Replica
=== Metastabilita ===
* 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‐latchu, který se může rozkládat na čisté 0/1 s nedefinovaným zpožděním.
* Je třeba ji zmírnit:
* Dodržet setup/hold: zajistit, že D je stabilní před a po hraně.
* Synchronizační řetězce: zvláště při přenosech signálů mezi různými hodinovými doménami dát signál nejdřív do prvního DFF, pak až do druhého – aby se případná metastabilita rozpadla.
* Nelze ji naprosto vyloučit, jen zredukovat pravděpodobnost na zanedbatelné minimum.
====== Čítače a typy jejich spojování do ripple-kaskád a se synchronními přenosy ======
=== Registr ===
* 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“.
{{:statnice:bakalar:screenshot_from_2025-05-31_15-33-13.png?400|4bit registr}}
=== Čítač ===
* Vezmeme n‐bitový registr (s n DFF).
* Na jeho paralelní výstup Q připojíme kaskádově jednobitovou sčítačku +1 (Full Adder chain), která spočte „Q + 1“.
* Výsledek (n bitů) vedeme zpět na vstupy registru D.
* Při každé náběžné hraně CLK se registr „přepíše“ hodnotou (Q_old + 1). Tím vzniká n‐bitový čítač, který se „odráždí“ v posloupnosti 0,1,2,3,… modulo 2^n.
{{:statnice:bakalar:screenshot_from_2025-05-31_15-36-23.png?400|Dekadický čítač od 0 do 9}}
* 4bit čítač, mohl by čítat od 0 do 15, ale komparátorem je nastaveno Reset při čítání do 9, pči aktivaci Reset nebo <9 se přepne multiplexor a do obvodu se nahraje 0 - čítáme znovu od 0
== Spojování do ripple kaskád? ==
* 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.
== Spojování se synchonními přenosy ==
* 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).
* Třeba příklad s počítáním do 9 a automatický reset na 0 (počítání je ripple carry a nulování je synchronní podle GPT)
====== Příkaz process ve VHDL, rozdíl mezi chování blocking := a non-blocking příkazů ⇐. Popis obvodů DFF ve VHDL procesu. VHDL funkce a procedury ======
=== Příkaz process ve VHDL ===
* Process je základní sekvenční blok VHDL, v němž popisujete chování „po jednotlivých cyklech“ nebo „po změnách vstupů“.¨
* Proměnné je nutné resetovat uvnitř procesu každým průchodem, jinak vznikne smyčka/hazard.
* Přesná syntaxe příkazu vypadá takto, kde části v [ ] lze vynechat:
[optional_label:] process [(optional sensitivity list)] [is]
[sequential_declarations]
begin
sequential statements
end process [optional_label];
* Sensitivity list (nebo wait on) určuje, kdy se tělo procesu provede znovu.
* Deklarace uvnitř (proměnné, funkce, procedury) slouží pro lokální výpočty; nelze tam dát signal ani component.
* Proces se syntetizuje na kombinatorní nebo sekvenční obvody podle přítomnosti či absence detekce hrany (if rising_edge(CLK) apod.) a podle sensitivity listu.
=== Rozdíl mezi := (blocking) a <= (non-blocking) ===
== := (blocking) ==
* sekvenční přiřazení
* Pouze uvnitř procesů, procedur nebo funkcí (sequential statements).
* Přiřazení v := 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).
== <= (non-blocking) ==
* Přiřazení sig <= expr; není provedeno okamžitě, ale jejím výsledkem je vložení „nové hodnoty” do fronty aktualizací (delta‐cykly).
* V průběhu jednoho simulovaného času se nejprve vyhodnotí všechny výrazy napravo od <=, potom se současně (ve stejném čase) přiřadí výsledné hodnoty na výstupy signálů.
* Když uvnitř procesu (sensitivity list) přiřadíte sig <= expr;, stávající hodnota sig zůstává na výstupu až do skončení procesu, pak teprve (v nadcházejícím delta‐kroku) se přepne.
* Ve skutečném hardware by to znamenalo, že signál se změní „po krátké, ale nenulové” době – odpovídá to latenci hradla či registru.
=== Popis obvodů DFF ve VHDL procesu ===
-- 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;
=== VHDL funkce a procedury ===
== Funkce ==
* Funkce („function“) – vytvářejí jednu hodnotu na základě vstupních parametrů; v obvodu se vždy „rozbalí“ (in‐line) na kombinatorní síť.
*
[pure | impure ] function function_name (parameter_list) return type_name is
[sequential_declarations]
begin
sequential statements
end [function] [function_name]
* pure (výchozí)
* Funkce nemá žádné vedlejší efekty a pro stejné vstupy vždy vrátí stejnou návratovou hodnotu.
* Simulátor ani syntetizér ji může „vyhodnocovat“ kdykoli, protože nezávisí na žádném vnějším stavu.
* Funkce (function) od GPT
* Musí mít pouze parametry módu in.
* Vrací jednu hodnotu přes return.
* Lze zvolit volatile (impure) nebo pure (čehož se držíme, pokud funkce nemá vedlejší efekty).
* Volá se jak v concurrent, tak v sequential doméně.
* Kód se „rozbalí inline“ při syntéze do kombinatorní sítě (kaskády bran) či logiky.
== Procedura ==
* Procedury („procedure“) – mohou „vracet“ více hodnot (pomocí out/inout parametrů) a slouží pro popis podřízených bloků logiky, které mohou současně ovlivnit několik signálů nebo proměnných.
*
procedure identifier [ (formal_parameter_list) ] is
[sequential_declarations]
begin
sequential statement(s)
end [procedure] [identifier]
* Procedura (procedure) od GPT
* Formální parametry mohou být módu in, out, inout.
* Nemá návratovou hodnotu return (nebo jen return; bez hodnoty pro ukončení).
* Může „vrátit“ více výsledků (např. signal Y : out ..., variable W : out ...).
* Volá se pouze uvnitř sequential domény (procesů, jiných procedur, funkcí), protože variable přiřazení := vyžaduje sekvenční context.
* Inline rozbalení do vnitřku procesu vytváří blok kódu, který může zároveň aktualizovat několik výstupních signálů či proměnných.
====== Konečné automaty typu Moore a Mealy. Jejich definice, popisy pomocí grafu přechodů, tabulky přechodů a stavové tabulky přechodů (jiný název matice přechodů). Minimalizace automatu Moore na Moore a Moore na Mealy. Kdy lze? Návrh automatu a jeho popis ve VHDL ======
==== Definice FSM ====
{{:statnice:bakalar:screenshot_from_2025-05-31_19-08-57.png?400|Definice FSM}}
{{:statnice:bakalar:screenshot_from_2025-05-31_19-28-26.png?400|Mealy a Moore ilustrace}}
==== Popis FSM (graf, tabulka přechodů, stavová tabulka přechodů - matice přechodů) ====
* Moore - Výstupy nezávisí na vstupech, tj. výstupy se efektivně generují ze stavu, v němž se právě nachází automat.
* Mealy - 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.
* Používá se častěji v programech – ty berou vstupy z hodnot v proměnných, které jsou bez hazardů.
* K jakémukoli Mooreovu automatu existuje ekvivalentní Mealyho automat se stejným nebo menším počtem stavů.
* Naopak ke každému Mealyho automatu, který má N stavů a rozpoznává X možných kombinací vstupů, existuje ekvivalentní Mooreův automat mající N*X stavů.
* Matice přechodů:
* 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 x p
* řádky - výchozí stav s1 až sp
* sloupce - příští stav s1 až sp
* průsečík - podmínky x přechodu ze stavu sk do sj
{{:statnice:bakalar:screenshot_from_2025-05-31_19-26-15.png?400|Matice přechodů}}
* Tabulka přechodů:
* 2 části - příští stav ( d ) + výstupy ( w )
* sloupce - všechny možné vstupy xi
* řádky - všechny možné vnitřní stavy sj + výstup zm
* průsečík řádku a sloupce - následný stav sk
* tabulka výstupů – výstup generovaný ve stavu
{{:statnice:bakalar:screenshot_from_2025-05-31_19-27-31.png?400|Tabulka přechodů}}
{{:statnice:bakalar:screenshot_from_2025-05-31_19-45-11.png?400|Graf přechodů Start-Stop}}
==== Minimalizace Moore na Moore a Moore na Mealy ====
* NIKDE NENí, nenašel jsem
==== FSM ve VHDL ====
* Úloha Start-Stop
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 a mikroprogrové řadiče. Vlastnosti a architektura ======
* Vůbec nechápu z přednášek
* Pravděpodobně:
* Máme předem určenou posloupnost stavů, do kterých se po splnění podmínky posouváme
* when S0 => if start then state := S1; end if;
* when S1 => if full then state := S2; end if;
* when S2 => if boiling then state := S3; end if;
* when S3 => if Chef then state := S0; end if;
{{:statnice:bakalar:screenshot_from_2025-05-31_19-57-14.png?400|Grafické zobrazení Řadiče kotle}}
====== Posuvné registry a posuvné registry s lineární zpětnou vazbou (LFSR), pouze hlavní principy jejich teoretického zázemí a vlastnosti ======
=== Posuvné registry ===
{{:statnice:bakalar:screenshot_from_2025-06-01_09-56-06.png?400|SISO}}
* Série D‐flip‐flopů (DFF) propojených do řetězce: výstup jednoho DFF → vstup následujícího.
* Na každý takt hodin (třeba při náběžné hraně CLK) se vloží nový bit na vstup SI („serial-in“) a zároveň se na výstup SO („serial-out“) vyhodí nejstarší bit.
*SISO (Serial-In Serial-Out)
*V každém taktu vstupní bit posune všechny bity o jednu pozici doprava; poslední bit „vypadne“.
*Lze použít jako jednoduchou zpožďovací linku (delay line): hodnota na SI se objeví na SO až po N taktech, kde N = počet DFF.
*PISO (Parallel-In Serial-Out)
*Má řídicí vstup Load.
*Pokud Load = ’1’, do všech DFF simultánně (paralelně) načte N-bitové slovo.
*Pokud Load = ’0’, pak z toho „načteného” slova posouvá bity sériově ven přes SO.
*SIPO (Serial-In Parallel-Out)
*Nahrazuje SO N současnými výstupy Q(N–1 downto 0).
*V každém taktu se do nejnižšího bita vloží SI, starší bity se posunou; všechny N bitů lze číst naráz (paralelně).
*PIPO (Parallel-In Parallel-Out)
*Pouze „datový registr” (není čistý posuvník), vstupy i výstupy vždy řídí společný Load/CLK.
{{:statnice:bakalar:screenshot_from_2025-06-01_09-57-41.png?400|PISO a SIPO}}
=== Posuvné registry s lineární zpětnou vazbou LFSR ===
* Základní princip LFSR
* Posuvný registr (SISO) se na vstup SI (nejnižší bit) místo libovolného konstantního 0/1 napojuje XOR kombinace výstupních (!!) bitů z několika pozic v registru (tzv. „tap positions”).
* Každý takt:
* SI ≤ XOR( vybrané bitové „tap“ pozice ze stavu QN–1, QN–2, … )
* Všechny bity se posunou doprava (nebo doleva) o jednu pozici.
* Nejvyšší bit se vymění za předchozí nejnižší výstup SO (nebo jedná zerezní zpětnovazební brána).
* Použití LFSR
* Generování pseudonáhodných čísel pro testování a skrabbling dat.
* Rozptyl (scrambling) a descrambling v komunikacích (zajišťuje rovnoměrné rozprostření spektra bitů).
* CRC (Cyclic Redundancy Check): zkrácená varianta LFSR bez anamnézy stavu (uložen je pouze registr, výstupem jsou paritní bity).
* Dežifrátory (čítače) pro test operačních frekvencí („BIST” – Built-In Self-Test) v hardwaru.
* Fázové generátory a děliče frekvence s vysokou kvalitou (rozložení spektra).
====== Násobení frekvencí fázovými závěsy (Phase-Locked Loop) ======
{{:statnice:bakalar:screenshot_from_2025-06-01_10-05-11.png?400|Blokové PLL schéma}}
* PLL je uzavřená smyčka, jejímž úkolem je zachytit a udržet konstantní fázový a frekvenční vztah mezi referencí (fR/N) a odvozeným signálem (fL/M).
* Hlavní bloky:
* Phase/Frequency Detector (PFD) – porovnává fázi/frekvenci.
* Charge Pump (CP) – generuje řídicí proudové impulsy.
* Loop Filter (LPF) – integruje proudy → hladké napětí „V_tune“.
* VCO – oscilátor řízený „V_tune“ (digitální kapacitní pole v FPGA).
* Dividers N (u reference) a M (ve zpětné vazbě).
* 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.
* Umožňuje:
* Vytvářet stabilní vysokofrekvenční hodiny (z nižší frekvence krystalu).
* Dělit nebo násobit hodinovou frekvenci přesně zlomkem.
* Recover hodinový signál z přenášených dat (clock recovery).
* Demodulovat frekvenční modulace (FM) v analogové oblasti.
====== Správné ošetření vstupů, plovoucí vstupy, pomalé náběžné hrany, odstranění zákmitů tlačítek (debouncing). Chránění výstupů s indukčních zátěží a výkonovou zátěží. Chování logického signálu na vodiči. ======
* Všechny vstupy FPGA musí mít definovanou logickou úroveň (pull-up/pull-down), jinak plovoucí vstup vede k náhodnému rušení a vyššímu odběru
* Pomalé hrany filtreujeme Schmittovými vstupy či buffrujeme, synchronizujeme do hodiny, aby se vyhnuli metastabilitě
* Debouncing mechanických tlačítek:
* Hardwarový: RC článek + Schmitt/invertor (τ ≈ 1 ms) potlačí zákmitové pulsy
* Softwarový: ve FPGA čítačový filtr nebo FSM se vzorkováním po definované době.
* Indukční zátěže (cívky, motory, relé):
* Flyback dioda pro DC cívky; RC snubber nebo TVS dioda pro AC/rychlé spínání.
* Výkonové zátěže (LED pásky, velké proudy):
* 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.
* Fyzické (analogové) chování logického signálu na vodiči:
* Inertial delay: potlačení krátkých impulsů,
* Transport delay: čisté zpoždění na ideálním vodiči,
* Odrazy/jitter: nutnost impedance‐match a krátké trasy.
* Řídit fan-out buffery a minimalizovat kapacitní zatížení kvůli zpoždění
* Do hodinových cest nevkládat další hradla, aby se vyhnuli clock skew
====== Používané FPGA technologie a jejich vlastnosti. Struktura SRAM paměti, paměti s jednoportovou a dvou portovou výběrovou logikou. ======
//Celé GPT//
=== FPGA Technologie ===
* SRAM-based FPGA
* Princip: Konfigurační buňky tvoří klasické CMOS SRAM buňky (8–12 tranzistorů na buňku). Po programování (napájecím pulzu) drží hodnotu, dokud je FPGA zapnuté, ale po vypnutí se vymažou. Řešení: externí Flash–EEPROM čip, který po zapnutí automaticky nahraje bitstream do SRAM buněk
* Výhody:
* Rychlá a neomezeně opakovatelná rekonfigurace.
* 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) .
* 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)
* Nevýhody:
* Citlivost na radiaci (ztráta konfigurace) → pro kosmické aplikace se vyrábějí verze “radiation-hardened” (umožňují vzdálené dožití softwaru).
* Po ztrátě napájení je nutná opětovná konfigurace (boot time).
* Flash-based FPGA
* Princip: Konfigurační buňky jsou vnitřní Flash buňky (nesmí se zaměnit s typy pro SSD). Obsah si pamatují i po vypnutí napájení.
* Výhody:
* Po zapnutí ihned naloží konfiguraci (bez externí Flash GOP).
* Nízká klidová spotřeba (Flash je nevolatilní).
* Méně citlivé na radiaci než čistě SRAM FPGA.
* Nevýhody:
* Pomalejší rekonfigurace než SRAM, ale rychlejší než antifuse.
* O něco vyšší náklady než čisté SRAM verze.
* Antifuse-based FPGA
* 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:
* Velmi odolné vůči radiaci (vhodné pro satelity, kosmické sondy).
* Jednou naprogramované, již nelze změnit (vyšší stabilita).
* Nevýhody:
* Nepřekonatelně pomalá a navždy jednosměrná konfigurace – desítky minut pro programování.
* Nelze rekonfigurovat v cílovém systému (vyžaduje speciální napěťové pulzy, nutné předem otestovat).
== Struktura SRAM pamětí v FPGA ==
* Paměťové bloky (M4K / M9K)
* Každý blok je krokovatelný na různé šířky a hloubky:
* Cyclone II: M4K bloky (4 kbit + 512 paritních) → lze použít například jako 4 kb × 1, 2 kb × 2, 512 B × 8, apod. .
* Cyclone IV: M9K bloky (8 kbit + 1024 paritních) → větší kapacita a širší vnitřní sběrnice.
* Uvnitř: statická CMOS SRAM matice, každý bit uložen v buketě CMOS tranzistorů; při změně adresy se data objeví na výstupu s typickým zpožděním ~1–2 cyklů T CLK, proto se doporučuje přidat i výstupní registr (pipeline) pro zajištění správného časování čtení .
* Jednoportová (Single-Port) SRAM
* Má jednu adresní sběrnici, jedno data‐in a jedno data‐out, a jeden řídicí vstup např. „Write Enable (WE)“ + hodinový vstup.
* Operace:
* Čtení: Adresa se na chvíli drží konstantní (v registru), po ~1–2 CLK se na datovou sběrnici objeví obsah.
* Zápis: Při aktivním WE se během jednoho cyklu do vybrané buňky zapíše data.
* Výhoda: Jednoduše se postaví, má nižší spotřebu a menší plochu.
* Nevýhoda: Nelze současně číst a zapisovat; pokud se během jednoho taktu provádí zápis, čtení je buď blokováno, nebo vrací předchozí data.
* Dvouportová (Dual-Port) SRAM
* Obsahuje dvě nezávislé adresní sběrnice (adresy A, B), každou se samostatným datovým vstupem, výstupem a hodinou.
* Operace:
* Obě strany (porty) mohou libovolně číst či psát současně.
* Pokud se snaží oba porty přistoupit k téže buňce zároveň, je definováno, který port má prioritu (typicky „write first“ nebo „read first“).
* Výhoda: Velká flexibilita – může sloužit pro dvoukanálové (FIFO) bufferování mezi dvěma hodinovými doménami.
* Nevýhoda: Dvojnásobná logika k řízení přístupu, větší spotřeba a plocha.
* Víceportové (Multi-Port) SRAM
* 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í.