Návrh sekvenčních obvodů
Rozhraní typického sekvenčního obvodu
Vstupy a výstupy
Typický plně synchronní sekvenční obvod bude mít kromě datových vstupů a výstupů navíc následující vstupy a výstupy, které řídí sekvenční povahu obvodu:
CLK
- vstup hodinového signálu. Hodinové vstupy všech obvodů v jednom sekvenčním obvodu musí být vždy propojené, aby obvod představoval jedinou hodinovou doménu. V opačném případě se vystavujeme nebezpečí.START
- pokud je vstupSTART=1
, inicializuj výpočet podle aktuální hodnoty vstupů, nehledě na to, zda aktuálně nějaký výpočet probíhá. Rovněž je možné (jako optimalizace) během toho cyklu provést první operaci výpočtu, ale není to nutné. Až přiSTART=0
je možné ve výpočtu pokračovat, a časem ho dokončit.DONE
- pokud je na výstupuDONE=1
, je výpočet hotový, a výsledek na datových výstupech je validní. Jakmile tohle nastane, musí obvod držet výstupy v neměnném stavu a dále držetDONE=1
, až do příštíhoSTART=1
. V momentě, kdy se zpracujeSTART=1
, musí být na výstupuDONE=0
(obvod se inicializoval pro další výpočet => výpočet není hotový), aby mohl vnější uživatel očekávatDONE=1
. Vyjímečně, pokud je výpočet hotový hned v inicializačním cyklu (např. násobička identifikovala násobení nulou => výsledek je triviálně nula), může ihned indikovatDONE=1
.
Synchronizace s hodinovým vstupem
Synchronní obvod může být synchronizovaný buď na sestupnou nebo na náběžnou hranu hodin, nebo využívat obě hrany (tato technika se nazývá Double Data Rate, neboli DDR, což znáte z počítačových pamětí). Návrh používající DDR je vhodný pouze pro realizaci v silikonu (ASIC), nikoliv pro FPGA, kde paměťové prvky reagují buď na jeden nebo druhý typ hrany.
Sekvenční algoritmy probírané na hodinách
Všechny Logisim soubory z hodin jsou ke stažení zde.
Naivní násobení pomocí iterovaného sčítání
Princip: Pro výpočet provedeme -krát . Pokud začínalo na , tak po těchto iteracích bude .
Tento algoritmus je neskutečně neefektivní, protože počet provedených operací stoupá lineárně s hodnotou B (složitost ). Typicky se snažíme, aby počet operací byl úměrný počtu bitů B, tedy aby složitost algoritmu byla . Takovou složitost má právě metoda double-and-add popsaná dále.
Násobení pomocí metody Double-And-Add
Pro urychlení násobení lze využít tzv. Hornerovo schéma pro násobení polynomů:
Neboli začínáme s hodnotou 0 (neutrální prvek vůči sčítání), a v každém cyklu zpracujeme jeden bit hodnoty B od MSB: pokaždé hodnotu výnásobíme 2, a pak přičteme buď nebo , právě podle hodnoty bitu z . Proto se algoritmus jmenuje Double-And-Add.
Při zapojení lze provést optimalizaci, kde přeskočíme první iteraci Double-And-Add, protože její výsledek je triviální: Pokud , pak výsledek iterace je , jinak je .
Umocňování pomocí metody Square-And-Multiply
Stejný princip lze použít i pro umocňování, pouze s vyššími operátory: Začínáme s hodnotou 1 (neutrální prvek vůči násobení), a v každém cyklu umocníme na druhou, a pak podmíněně vynásobíme hodnotu podle bitu z :
Více informací o tomto algoritmu je k dispozici v KBB přednášce, kde se používá pro modulární umocňování, a taky v KBB skriptech.
Double-Dabble algoritmus
Popis algoritmu viz zadání ALU. Principem sekvenčního provedení je skutečnost, že pokud explicitně provedeme posun, provádí se jádrová operace algoritmu vždy na ty samé bity. Zároveň lze provést vždy až 4 operace paralelně, jednu na každém řádu (jednotky, desítky, etc.). Modelujeme tedy softwarovou variantu algoritmu, ale opravování číslic provádíme vždy 4-paralelně.