Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a

Transkript

Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ
Úvod do problematiky obvodů FPGA
pro integrovanou výuku VUT a VŠB-TUO
Garant předmětu:
Ing. Michal Kubíček, Ph.D.
Autoři textu:
Ing. Michal Kubíček, Ph.D.
BRNO * 2014
Vznik těchto skript byl podpořen projektem č. CZ.1.07/2.2.00/28.0062
Evropského sociálního fondu a státním rozpočtem České republiky.
FEKT Vysokého učení technického v Brně
2
Autor
Ing. Michal Kubíček, Ph.D.
Název
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a
VŠB-TUO
Vydavatel
Vysoké učení technické v Brně
Fakulta elektrotechniky a komunikačních technologií
Ústav telekomunikací
Technická 12, 612 00 Brno
Vydání
první
Rok vydání
2014
Náklad
elektronicky
ISBN
978-80-214-5069-1
Tato publikace neprošla redakční ani jazykovou úpravou.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
3
Obsah
1
ÚVOD ................................................................................................................................. 4
2
STRUČNÝ ÚVOD DO JAZYKA VHDL ........................................................................ 5
2.1
2.2
2.3
2.4
2.5
2.6
3
ARCHITEKTURA OBVODŮ FPGA ........................................................................... 21
3.1
3.2
3.3
3.4
3.5
3.6
4
KOMBINAČNÍ LOGICKÉ OBVODY .................................................................................... 53
KLOPNÉ OBVODY ........................................................................................................... 54
BINÁRNÍ ČÍTAČE ............................................................................................................ 57
DALŠÍ TYPY ČÍTAČŮ ....................................................................................................... 63
STAVOVÉ AUTOMATY .................................................................................................... 70
PRAKTICKÝ NÁVRH MEALYHO A MOOROVA AUTOMATU VE VHDL.............................. 78
PAMĚŤOVĚ REALIZOVANÉ STAVOVÉ AUTOMATY ........................................................... 91
HODINOVÉ A GLOBÁLNÍ SIGNÁLY V FPGA ....................................................... 94
5.1
5.2
5.3
5.4
5.5
6
VÝVOJ A VÝROBA INTEGROVANÝCH OBVODŮ................................................................ 21
LOGICKÉ BUŇKY OBVODŮ FPGA A JEJICH VYUŽITÍ ....................................................... 31
VLASTNOSTI VSTUPNĚ/VÝSTUPNÍCH BUNĚK .................................................................. 35
KONFIGURACE OBVODŮ FPGA ...................................................................................... 38
VÝROBNÍ TECHNOLOGIE OBVODŮ FPGA ....................................................................... 44
POUZDRA OBVODŮ FPGA.............................................................................................. 49
ZÁKLADY LOGICKÝCH OBVODŮ .......................................................................... 53
4.1
4.2
4.3
4.4
4.5
4.6
4.7
5
KNIHOVNY A SLOHY ........................................................................................................ 7
ENTITA, ARCHITEKTURA .................................................................................................. 9
DATOVÉ TYPY ................................................................................................................ 11
VÝRAZY A OPERÁTORY .................................................................................................. 13
OBJEKTY JAZYKA VHDL ............................................................................................... 15
PŘÍKAZY A PROCESY ...................................................................................................... 16
DISTRIBUCE HODINOVÉHO SIGNÁLU .............................................................................. 94
PRÁCE S HODINOVÝMI SIGNÁLY V FPGA ...................................................................... 97
NULOVÁNÍ A NASTAVENÍ (RESET A SET) ........................................................................ 99
PŘEVOD SIGNÁLŮ MEZI HODINOVÝMI DOMÉNAMI ........................................................ 102
ZVYŠOVÁNÍ PRACOVNÍ FREKVENCE ............................................................................. 106
HARD IP MAKRA V OBVODECH FPGA................................................................ 110
6.1 BLOKOVÉ PAMĚTI RAM .............................................................................................. 111
6.2 BLOKY PRO PODPORU DSP OPERACÍ ............................................................................ 114
6.3 VYSOKORYCHLOSTNÍ TRANSCEIVERY .......................................................................... 116
4
FEKT Vysokého učení technického v Brně
1 Úvod
Obvody FPGA (Field Programmable Gate Array) v současné době prodělávají velmi
dynamický vývoj. Ve srovnání s jinými typy digitálních obvodů (zákaznické integrované
obvody, procesory) nabízejí zajímavý kompromis mezi poskytnutým výpočetním výkonem,
cenou, spotřebou, flexibilitou a dobou potřebnou pro vývoj aplikace, což vede k jejich
rostoucí popularitě a použití ve stále větším množství aplikací. Jejich rozšíření zpětně
ovlivňuje nabídku výrobců obvodů FPGA. Ti nabízí stále širší portfolio různých typů obvodů,
které se navzájem liší výkonem, cenou i architekturou a jsou tak vhodné pro další nové
aplikace.
Vzhledem k takto dynamickému vývoji je obtížné vytvořit univerzální výukový text,
který by postihl všechny praktické aspekty návrhu systémů s FPGA a zároveň by byl aktuální
po relativně dlouhou dobu. Proto v textu záměrně nejsou uvedeny konkrétní údajům a
názvům, které rychle zastarávají a za několik let mohou působit až úsměvně. Na druhou
stranu jsem přesvědčen, že pro rychlé pochopení problematiky hradlových polí jsou některé
konkrétní údaje nezbytné, aby čtenář neznalý problematiky získal představu o parametrech
obvodů. Proto si kladu za cíl kompenzovat zastarávání konkrétních údajů průběžnou
aktualizací obsahu elektronické verze těchto skript do té míry, dokud bude základní struktura
textu vyhovující a platná pro moderní postup návrhu systémů s FPGA.
FPGA jsou dnes natolik složité, že kompletní dokumentace k jedné řadě obvodů čítá i
několik tisíc stran textu (katalogové listy, uživatelské manuály, aplikační poznámky). Pokud
chce čtenář proniknout hlouběji do některé části problematiky hradlových polí, sáhne jistě po
jedné z doporučených knih, ve kterých je dané oblast popsána detailně.
Tyto knihy, stejně jako dokumentace samotných obvodů, jsou momentálně dostupné
téměř výhradně v angličtině. Pro snazší orientaci v anglicky psané literatuře jsou proto v textu
těchto skript uvedeny nejen české výrazy týkající se problematiky FPGA, ale kurzívou i jejich
anglické ekvivalenty (např. syntéza a synthesis). Druhým důvodem pro uvádění anglických
výrazů je fakt, že mnohé termíny spojené s problematikou FPGA nemají vhodný český
ekvivalent, nebo se český ekvivalent v běžné inženýrské praxi nepoužívá.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
5
2 Stručný úvod do jazyka VHDL
Jazyk VHDL vznikal v 80. letech minulého století původně jako nástroj pro
dokumentaci a později také pro ověřování (verifikaci) funkčnosti číslicových systémů
navržených jinými metodami (typicky schéma nebo nižší programovací jazyky). Později se
zrodila myšlenka využít tento jazyk nejen pro verifikaci, ale i pro syntézu číslicových
obvodů. Jde o otevřený standard IEEE číslo 1076 [1], jehož první revize byla zveřejněna
v roce 1987 a běžně se označuje jako VHDL-87. Tato první revize měla řadu nedostatků,
z nichž ty nejpodstatnější vyřešila revize jazyka označovaná jako VHDL-93, která je dnes
nejpoužívanější variantou tohoto jazyka. Od té doby vznikly i další revize (2000, 2002, 2006,
2008), někdy souhrnně označované jako VHDL-200X, které přidávají řadu užitečných funkcí
a vlastností. Jejich použití je ale zatím omezené, neboť dosud nejsou plně podporovány
běžnými návrhovými systémy.
Jak bylo uvedeno, jazyk VHDL lze použít jak pro verifikaci, tak pro syntézu číslicových
obvodů. Syntézou elektronických obvodů se obecně rozumí vytvoření schématu zapojení
elementárních buněk na základě abstraktního popisu, dnes prakticky výhradně s využitím
počítače. Jedny z prvních obvodů, které bylo možné automaticky syntetizovat, byly analogové
filtry. Abstraktním popisem, který slouží jako vstup syntézy, jsou parametry filtru: typ (dolní
propust, horní propust…), toleranční schéma (mezní frekvence, útlumy), použitá aproximace,
atd. Výstupem syntézy je obvodové zapojení filtru složené ze základních (ideálních)
součástek, jako jsou například rezistory, kapacitory, induktory a operační zesilovače.
V případě digitálních obvodů jsou těmito elementárními buňkami v nejjednodušším
případě logická hradla (AND, OR, XOR, NOT) a klopné obvody, ze kterých jsou složeny
všechny moderní číslicové obvody. Nástroje provádějící syntézu se v tomto případě nazývají
syntetizéry (Synthesis Tool; prosím nezaměňovat se syntezátory).
V případě analogových filtrů je vstup i výstup procesu syntézy relativně jednoduchý a
jednoznačný. I poměrně složité filtry jsou složeny nanejvýš z několika desítek elementárních
komponent. Naproti tomu číslicové systémy jsou podstatně složitější, často se skládají ze
stovek tisíc elementárních buněk, což klade na syntetizéry značné nároky. Ideální syntetizér
by měl být schopen vytvořit příslušný obvod pouze na základě popisu chování systému
z vnějšího pohledu (jak je tomu např. u analogových filtrů), tedy na základě co
nejabstraktnějšího pohledu. Vzhledem ke složitosti číslicových systémů a stavu nástrojů pro
jejich vývoj (EDA tools; Electronic Design Automation) je tento úkol v současné době
nerealizovatelný. Proto je nutné syntetizéru jako vstup předložit více či méně detailní popis
jeho struktury, včetně popisu algoritmů, které mají požadovanou funkci realizovat. To je
úloha designerů, tedy návrhářů číslicových systémů (Digital Design Engineer), a to jak
v případě obvodů FPGA, tak obvodů ASIC (Application Specific Integrated Circuit).
S vývojem syntetizérů pochopitelně roste jejich schopnost syntetizovat abstraktní popis
a vývojář tak může systémy popisovat na stále vyšší (abstraktnější) úrovni. Nicméně stále
existují a patrně budou existovat obtížně syntetizovatelné systémy, které jsou natolik
specifické, že je bude muset návrhář popsat na nízké úrovni abstrakce, aby dosáhl potřebného
výpočetního výkonu, propustnosti dat či nízké latence. Jde o stejný typ problému, který bylo
možné před lety pozorovat v oblasti mikroprocesorů s příchodem jazyka C a opuštěním
jazyka symbolických instrukcí.
V současné době se pro návrh číslicových obvodů používá několik programovacích
jazyků, které umožňují provádět návrh na různých úrovních abstrakce. Dnes nejčastěji
FEKT Vysokého učení technického v Brně
6
používanými jazyky jsou VHDL, Verilog, SystemVerilog, SystemC a jazyky C/C++. Na Obr.
1 je výsledek studie, kde je patrný rozdíl v použití jednotlivých jazyků pro návrh číslicových
systémů v obvodech FPGA a v ostatních obvodech (ASIC, ASSP; Application Specific
Standard Part). Fakt, že součet jednotlivých kategorií přesahuje 100% je důsledkem toho, že
některé systémy se navrhují více jazyky, respektive řada návrhářů aktivně využívá více
jazyků.
80
Procento využití
70
60
50
40
30
FPGA
20
non-FPGA
10
0
Obr. 1
Využití jazyků pro návrh číslicových systémů (výsledek studie Willson Research
Group and Mentor Graphics 2010 Functional Verification Study).
Na Obr. 2 je orientační porovnání možností úrovně abstrakce popisu číslicových
systémů jednotlivými programovacími jazyky. Pro potřeby návrhu obvodů ASIC je často
nutné pracovat na nejnižší úrovni abstrakce, tedy na úrovni hradel (gate-level design). Jazyk
Verilog umožňuje provádět popis na nižší úrovni, než jazyk VHDL, což se v analýze na Obr.
1 projevilo právě tím, že je používanější v oblasti návrhu obvodů ASIC (kategorie nonFPGA). Jazyk VHDL naopak umožňuje použít některé prvky vyšších programovacích jazyků,
které usnadňují návrh složitých systémů, respektive integraci dílčích bloků do systému.
Advanced
verification
System
Algorithm
RTL
Logic
Gate
Obr. 2
Přibližná úroveň abstrakce návrhu dosažitelná s využitím jednotlivých
programovacích jazyků vhodných pro popis číslicových systémů.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
7
Se zvyšující se složitostí systémů se také zvyšuje potřeba jejich abstraktního popisu, aby
bylo možné vytvořit odpovídající popis dostatečně rychle a s přiměřeným úsilím. Díky tomu
jsou vyšší programovací jazyky, jako System C a C/C++ stále více používány, často jako
doplněk „nízkoúrovňových“ jazyků VHDL a Verilog. Naproti tomu jazyk SystemVerilog
představuje unifikovaný nástroj, který má jak prostředky pro popis systémů na nejnižší úrovni
(jako Verilog), tak na úrovni nejvyšší (C/C++). Z hlediska použití v budoucnu se tak jeví jako
nejperspektivnější. Většina návrhových systémů, které jsou v současné době dostupné (rok
2014), jej ale ještě nepodporuje. Proto má stále smysl zabývat se jazyky VHDL a Verilog,
které dnes v oblasti EDA dominují.
Na tomto místě považuji za důležité zmínit jeden fakt: i s pokročilými programovacími
jazyky je nezbytné psát zdrojový kód s ohledem na cílovou platformu, tedy použitý
číslicový obvod. Kód v jazyce C, který je vhodný ke spuštění na moderních vícejádrových
výpočetních systémech, se většinou diametrálně odlišuje od kódu, který je vhodný pro popis
systému, který má tutéž funkci vykonávat v obvodu FPGA nebo ASIC. Kód určený pro
procesor má algoritmický charakter. Naproti tomu popis číslicových systémů lze spíše
přirovnat k popisu propojení bloků (netlist), přičemž jeho základní komponenty mohou být
popsány algoritmicky, pokud to použitý programovací jazyk a syntetizér umožní. Pro návrh
číslicových systémů s FPGA (případně ASIC) je klíčové pochopit a ovládnout princip
programování, který lze poté uplatnit s využitím kteréhokoliv z uvedených programovacích
jazyků. Rozdíl mezi jazyky je pak z tohoto pohledu pouze v odlišné syntaxi a nabízených
prostředcích pro popis systému na různých úrovních abstrakce.
Na počátku 90. let se začal projevovat fakt, že návrháři jsou sice schopni poměrně
rychle a efektivně navrhnout složitý číslicový systém, ale již neexistují vhodné nástroje pro
jeho efektivní a dostatečně rychlou verifikaci. Tento jev, který se dnes označuje design
verification gap, je jednou z hlavních příčin toho, že se vyšší programovací jazyky začaly již
v té době používat pro verifikaci číslicových systémů (podstatně dříve, než pro jejich
syntézu). Do jisté míry lze tedy chápat tuto potřebu rychlejší verifikace a následné použití
vyšších programovacích jazyků jako podnět k jejich použití i pro syntézu.
Následující úvod si neklade za cíl naučit čtenáře VHDL, ale upozornit na podstatné
aspekty tohoto jazyka a některá známá i méně známá úskalí, se kterými se při jeho použití
můžeme setkat. Pro podrobné seznámení mohu doporučit literaturu [5], [6], [7] nebo [8]
(existuje mnoho dalších kvalitních publikací, především pak zahraničních).
2.1 Knihovny a slohy
Knihovna je dle definice jazyka VHDL prostor, do kterého jsou kompilátorem ukládány
informace o projektu a souborech, které k němu náleží. Obsahuje a umožňuje přístup k již
zkompilovaným entitám, architekturám a slohám. Použití knihovny samo o sobě ale
nedovoluje přístup k definicím objektů, které mohou být součástí sloh v knihovně. Samotný
standard VHDL nespecifikuje způsob jejich implementace, proto se u různých návrhových
systémů můžeme setkat s různou realizací knihoven. Typicky jde o složku, případně o soubor
odpovídajícího jména v adresáři projektu.
Slohy jsou speciální zdrojové kódy VHDL obsahující deklarace a definice objektů
(datové typy, konstanty, funkce...), které pak mohou být použity ve zdrojovém kódu. Slohy
jsou vždy součástí knihoven a existuje několik standardních sloh, které se používají při
návrhu číslicových systémů pro FPGA/ASIC. Stručný výčet těchto sloh je uvede níže.
8
FEKT Vysokého učení technického v Brně
Samotný jazyk VHDL obsahuje dvě knihovny: STD a WORK. Knihovna STD obsahuje
slohy STANDARD a TEXTIO. Sloha STANDARD obsahuje deklarace základních datových
typů (viz níže) a operací s nimi. Sloha TEXTIO pak umožňuje práci se soubory a textem.
Knihovna WORK je pracovní knihovna daného projektu a obsahuje například deklarace entit a
architektur zkompilovaných zdrojových kódů. Zároveň se do ní kompilují případné slohy,
které jsou součástí projektu. Knihovny STD i WORK jsou implicitně součástí každého
zdrojového kódu VHDL, aniž by bylo třeba jejich použití deklarovat. Stejně tak je
automatické použití slohy STANDARD, nikoliv však slohy TEXTIO!
Další používanou knihovnou je knihovna IEEE [3], která obsahuje deklarace datových
typů a funkcí potřebných pro popis reálných číslicových systémů. Její použití je třeba
v každém zdrojovém kódu explicitně deklarovat. Součástí knihovny je několik sloh, které lze
rozdělit do dvojice skupin: standardní (standardizované) a tzv. průmyslově zavedené
(nestandardizované, byť jsou v knihovně IEEE!!!). V současné době je již význam
nestandardizovaných sloh nízký a prakticky se nepoužívají. Stále však existuje velké
množství zdrojových kódů, které tyto knihovny používají. Navíc i mnohé aktuální vzorové
zdrojové kódy dostupné přímo od výrobců obvodů FPGA (Xilinx) využívají tyto slohy, byť je
jejich použití již dlouho dobu potlačováno. Z tohoto důvodu je nutné znát obsah a důvody
použití alespoň těch nejčastěji používaných.
Základní standardní slohou knihovny IEEE, která se používá ve všech zdrojových
kódech pro popis a verifikaci číslicových systémů, je sloha STD_LOGIC_1164 a je pokryta
samostatným standardem IEEE [2]. Tato sloha obsahuje především deklaraci klíčových
datových typů STD_LOGIC a STD_LOGIC_VECTOR, které se používají pro popis vodičů
(signálů) v reálném číslicovém obvodu (viz kapitola 2.3). Sloha dále obsahuje funkce, které
umožňují provádět s těmito datovými typy základní logické operace (AND, OR, XOR,
NAND...) a konverzní funkce pro vzájemný převod operandů typu STD_LOGIC,
STD_ULOGIC a BIT, včetně jejich vektorových variant.
Druhou důležitou slohou z hlediska syntézy číslicových systémů je sloha
NUMERIC_STD. Ta obsahuje definici nových datových typů SIGNED a UNSIGNED, které
slouží pro popis aritmetických operací. Tyto datové typy jsou definované stejně, jako datový
typ STD_LOGIC_VECTOR tedy jako jednorozměrné pole prvků typu STD_LOGIC. Kromě
definice nových typů obsahuje sloha také funkce pro objekty těchto typů. Jde především
o základní aritmetické operace (+, -, *, /, REM, MOD), relační operátory, operace rotace a
posuvů a logické operátory. Kromě toho obsahuje i konverzní funkce pro vzájemný převod
datových typů INTEGER, SIGNED a UNSIGNED.
Kromě uvedených sloh jsou v knihovně IEEE další standardní slohy, které se používají
v menší míře. Jde o slohy numeric_bit, math_complex a math_real.
Mimo standardní slohy obsahuje knihovna IEEE také slohy nestandardní, tzv.
průmyslově zavedené. Tyto slohy vznikly krátce po vydání první revize jazyka VHDL jako
reakce na potřeby reálného návrhu číslicových obvodů. V době, kdy ještě nebyla dostupná
sloha NUMERIC_STD, neexistovaly vhodné vektorové datové typy, které by bylo možné
využít pro implementaci aritmetických operací - typy SIGNED a UNSIGNED. Proto přední
firmy z oblasti nástrojů EDA vytvořili vlastní (nestandardizované) knihovny, které tento
nedostatek kompenzovaly. Dodnes se lze v mnoha zdrojových kódech setkat s knihovnami
STD_LOGIC_ARITH, STD_LOGIC_UNSIGNED případně STD_LOGIC_SIGNED, přestože
se je jejich použití nedoporučuje již od roku 1997, kdy byla standardizována sloha
NUMERIC_STD [3]. Hlavní problém nestandardních sloh tkví v tom, že každý z výrobců
EDA (Cadence, Synopsis, Mentor Graphics) si vytvořil svoji verzi těchto sloh. Výsledek
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
9
syntézy/simulace zdrojového kódu využívajícího tyto slohy tak mohl být funkčně odlišný
podle verze nástroje, který byl použit pro syntézu/simulaci.
Knihovna STD_LOGIC_ARITH je velmi podobná sloze NUMERIC_STD. Definuje
datové typy SIGNED a UNSIGNED, aritmetické a logické operace s nimi a řadu potřebných
konverzních funkcí. Knihovny STD_LOGIC_UNSIGNED a STD_LOGIC_SIGNED definují
aritmetické operace pro operandy typu STD_LOGIC_VECTOR, který je podle použité slohy
interpretován jako celé číslo bez znaménka (UNSIGNED) nebo celé číslo se znaménkem ve
dvojkovém doplňku (SIGNED). Především se slohou STD_LOGIC_UNSIGNED se dodnes
můžeme velmi často setkat ve zdrojových kódech, neboť výrazně zjednodušuje popis
binárních čítačů a dalších bloků, které realizují základní aritmetické operace
s neznaménkovými čísly.
2.2 Entita, architektura
Zdrojový kód VHDL se skládá typicky ze tří částí:
 deklarace použitých knihoven a sloh
 deklarace entity (entity declaration)
 popis (tělo) architektury (architecture body)
Níže je uvedený jednoduchý příklad typického zdrojového kódu VHDL popisující
binární sčítačku.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
----------------------------------------------ENTITY ALU IS
PORT (A,B: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
SUM: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ALU;
----------------------------------------------ARCHITECTURE Behavioral OF ALU IS
BEGIN
SUM <= STD_LOGIC_VECTOR(UNSIGNED(A) + UNSIGNED(B));
END Behavioral;
ALU
A
SUM
B
ALU
A
+
SUM
B
První část kódu zpřístupní pro další použití datové typy, funkce a již zkompilované
bloky, které jsou součástí příslušných knihoven a sloh. Deklarace platí pouze pro aktuální
zdrojový kód, neplatí pro hierarchicky nadřazené ani podřazené soubory. Na rozdíl od
některých jiných programovacích jazyků použití knihoven a sloh ve VHDL neznamená
zvýšení nároků na výslednou implementaci, pouze zpřístupňuje funkce a objekty, které
umožňují psát samotný zdrojový kód efektivněji.
Druhou částí kódu je popis entity. Obecně se předpokládá, že každý zdrojový kód
VHDL popisuje určitou část číslicového obvodu (entitu), u které lze jednoznačně definovat
vstupy a výstupy. Z vnějšího pohledu lze takový blok považovat za jakousi součástku.
Deklarace entity popisuje tuto součástku z vnějšího pohledu, tedy pouze z hlediska jejích
vstupů a výstupů. Základem deklarace entity je seznam portů (bran), které jsou vstupy a
výstupy popisovaného bloku (entity). Jde o signály, které jsou dostupné mimo popisovanou
FEKT Vysokého učení technického v Brně
10
entitu. Ve fyzické realizaci jsou porty reprezentovány vodiči propojujícími jednotlivé
hierarchické bloky. Porty mohou být několika typů:
 IN – vstupní brána
 OUT – výstupní brána
 INOUT – brána, která může být jak vstupní, tak výstupní. Doporučuje se používat
pouze na nejvyšší hierarchické úrovni ve spojení s třístavovým výstupem
(tri-state buffer)
 BUFFER – výstupní brána, která zpřístupňuje příslušný signál i uvnitř
popisované entity (signál pak lze použít jako argument podmíněných příkazů a
na pravé straně přiřazovacích příkazů). Důrazně se nedoporučuje tento typ
používat.
Třetí část kódu obsahuje samotný popis funkce bloku, který se nazývá tělo architektury.
Popis může být proveden některým ze základních stylů nebo jejich kombinací:
 Strukturální popis je založen na technice propojení již existujících komponent
(entit), které mohou být popsány některým z uvedených způsobů, nebo jsou
elementárními bloky cílového obvodu. Jde o textový popis schematického
propojení komponent, tedy netlist. Tento typ popisu se používá při
hierarchickém návrhu systémů jako náhrada grafického schématu. Oproti
grafické podobě sice bývá méně přehledný, ale je zcela nezávislý na návrhovém
systému. Tato nezávislost je klíčová, neboť neexistuje standard pro formát
schematických dokumentů a ty jsou tak vždy vázány na konkrétní návrhový
systém.
 RTL popis je styl, který popisuje logické obvody mezi registry, samotné registry
a vazbu všech těchto obvodů na vstupy a výstupy (RTL = Register Transfer
Logic). Popis bere v úvahu fakt, že cílový obvod bude fyzicky implementován
(ASIC, FPGA). Obecně se tento popis chápe tak, že je vždy syntetizovatelný a
pro implementaci preferovaný.
 Behaviorální popis umožňuje použít vyšší funkce programovacích jazyků a tak
zjednodušit a zpřehlednit popis systému. Původně byl behaviorální popis určen
pro verifikaci (simulaci), při níž je podstatné, aby byl kód jasný a přehledný,
přičemž syntetizovatelnost není podmínkou. S rostoucími schopnostmi
syntetizérů je ale stále více funkcí dříve vyhrazených behaviorálnímu popisu
podporováno i pro implementaci. Typicky behaviorální prvky (např. cykly) tak
dnes můžeme najít i v RTL popisu. Výsledek syntézy takového kódu již ale na
první pohled nebývá zřejmý a při nesprávném použití některých funkcí a příkazů
může být velmi neefektivní.
Často dochází k mísení jednotlivých typů popisů v jednom zdrojovém kódu s cílem
učinit popis co nejefektivnější z hlediska zápisu. Strukturální popis by ale takto měl být použit
pouze v omezené míře, někdy dokonce bývá jeho použití ve spojení s ostatními styly
zakázáno interními firemními předpisy.
V praxi se doporučuje vždy v rámci jediného zdrojového souboru vytvořit jak popis
entity, tak popis odpovídající architektury, byť to samotný jazyk VHDL ani návrhové systémy
nevyžadují. Doporučení vychází ze zkušeností mnoha firem s návrhem číslicových systémů
pomocí jazyka VHDL a opět bývá často předepsáno vnitřní normou.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
11
2.3 Datové typy
Základní definice jazyka VHDL obsahuje standardní datové typy, které jsou běžné ve
většině současných programovacích jazyků. Jejich stručný seznam je zde:
BOOLEAN
INTEGER
NATURAL
POSITIVE
REAL
BIT
BIT_VECTOR
CHARACTER
STRING
TIME
-----------
True / False
32 or 64 bit
Integer >= 0
Integer > 0
Floating-point
'0','1'
Pole prvku typu bit
7-bit ASCII
Pole prvku typu CHARACTER
hr, min, sec, ms, us, ns, ps, fs
Popis číslicových systémů se provádí na úrovni signálů, které jsou v hardwarové
realizaci reprezentovány vodiči. Vodiče propojují vstupy a výstupy bloků, ze kterých je
systém složen. Jelikož dnešní systémy pracují výhradně jako binární, mohou výstupy a vstupy
číslicových obvodů nabývat pouze dvojice definovaných stavů – logické 0 nebo 1. Rozlišení
stavů je provedeno na fyzické úrovni většinou jinou napěťovou úrovní (např. log. 0 odpovídá
úroveň 0 V a log. 1 odpovídá úroveň 3,3 V), která je sice specifická pro cílovou technologii,
ale z hlediska popisu funkce systému nemá význam. Pro popis signálů pomocí jazyka VHDL
se tak jeví jako vhodné použít datový typ BIT, který byl pro tento účel skutečně navržen.
Brzy se ale ukázalo, že takový dvoustavový signál nedostačuje pro popis reálných systémů,
neboť například nedokáže postihnout stav vysoké impedance na vodiči nebo současné
připojení dvojice aktivních budičů s rozdílným výstupem na jeden signál.
Proto byla brzy standardizována nová sloha STD_LOGIC_1164 (slohy viz
kapitola 2.1; [2]), která obsahuje definici nových datových typů, již vhodných pro popis
reálných systémů. Prvním z těchto typů je STD_ULOGIC, který je definován výčtem
možných hodnot:
TYPE STD_ULOGIC IS (
'U',
-- Uninitialized
'X',
-- Forcing Unknown
'0',
-- Forcing 0
'1',
-- Forcing 1
'Z',
-- High Impedance
'W',
-- Weak Unknown
'L',
-- Weak 0
'H',
-- Weak 1
'-');
-- Don’t care
Kromě logické 0 nebo 1 tak může signál typu STD_ULOGIC nabývat hodnoty 'U'
(typicky po spuštění systému, kdy signálu ještě nemá přiřazenu hodnotu), 'X' (log. 0 nebo 1,
ale není známo která z hodnot, případně konflikt hodnot 0 a 1), 'Z' (stav vysoké impedance
používaný u třístavových výstupů), 'H', 'L' (slabá úroveň '1', respektive '0'; odpovídá použití
rezistorů připojených mezi signál a napájecí napětí, respektive zem obvodu), 'W' (podobně
jako 'X', ale jde o konflikt úrovní 'H' a 'L') a '-' („don’t care“ hodnota; používá se především
při verifikaci, ale v některých případech ji lze použít pro popis, když chceme vyjádřit, že nám
nezáleží na hodnotě konkrétního výstupu v některém ze stavů systému).
FEKT Vysokého učení technického v Brně
12
Dalším datovým typem definovaným ve sloze STD_LOGIC_1164 je typ
STD_LOGIC. Tento datový typ je definován stejně, jako typ STD_ULOGIC jen s tím
rozdílem, že pro datový typ STD_LOGIC je navíc definována tzv. rozlišovací funkce
(resolution function):
----
--------------------------------------------------------| U
X
0
1
Z
W
L
H
|
|
--------------------------------------------------------( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |
Tato funkce je klíčová pro simulaci systémů a řeší konflikty, které mohou běžně nastat
při propojení aktivně buzených signálů. Bez použití této rozlišovací funkce by došlo při
konfliktu k neřešitelnému problému a simulace by skončila chybou. Rozlišovací funkce
jednoduše každé kombinaci hodnot signálů přiřazuje výslednou hodnotu. Díky rozlišovací
funkci tak můžeme například propojit třístavový výstup ve stavu 'Z' s jiným výstupem ve
stavu '1', přičemž výsledkem bude hodnota '1'. To odpovídá i situaci v reálných číslicových
obvodech.
Pro reálné obvody má ale význam pouze hodnota '0' nebo '1', neboť veškeré ostatní
hodnoty jsou vždy na vstupech obvodu vyhodnoceny jako jedna z těchto hodnot. Důsledkem
vystavení vstupu číslicového obvodu úrovni 'Z' sice může být krátkodobý stav metastability
jeho výstupu, který ale obvykle rychle odezní a výsledkem je hodnota log. 0 nebo 1, byť nelze
predikovat, který z obou stavů nastane. Pokud nevyužíváme třístavové výstupy, je z hlediska
implementace použití typů BIT, STD_ULOGIC a STD_LOGIC zcela ekvivalentní. Jelikož
se dnes prakticky veškeré systémy před vlastní implementací simulují, je použití datového
typu STD_LOGIC prakticky nezbytné a stalo se standardem.
Všechny tři zmíněné datové typy mají vždy definovaná i odpovídající jednorozměrná
pole (vektory) BIT_VECTOR, STD_ULOGIC_VECTOR a STD_LOGIC_VECTOR. Níže jsou
pro ilustraci uvedeny deklarace těchto datových typů:
TYPE bit_vector
IS ARRAY ( NATURAL RANGE <> ) OF bit;
TYPE std_logic_uvector IS ARRAY ( NATURAL RANGE <> ) OF std_ulogic;
TYPE std_logic_vector IS ARRAY ( NATURAL RANGE <> ) OF std_logic;
Tyto vektory se v praxi používají pro reprezentaci sběrnic a vícebitových signálů.
V případě potřeby je možné realizovat i vícerozměrná pole, což se využívá například
k realizaci paměťových struktury:
TYPE RAM_8b IS ARRAY ( NATURAL RANGE <> ) OF std_logic_vector(7 TO 0);
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
13
Často se lze setkat s diskuzí, zda je vhodnější pro popis systému použít datové typy
STD_LOGIC nebo STD_ULOGIC. Z hlediska implementace je výsledek korektně napsaného
kódu v obou případech identický. Rozdíl je ale v chování simulátorů v případě, že dojde
k propojení výstupů. Při použití typu STD_ULOGIC, který nemá definovanou rozlišovací
funkci, dojde při takovém konfliktu k chybě, kdežto u typu STD_LOGIC je dle rozlišovací
funkce vyhodnocen stav, který je z hlediska simulátoru korektní. Jelikož je propojení výstupů
v drtivě většině případů chybou v návrhu, je možné typ STD_ULOGIC využít k detekci
takovýchto chyb na úrovni simulace. Chyby tohoto druhu jsou odhaleny i v případě použití
datového typu STD_LOGIC, i když až nástroji implementačními. Obecně je datový typ
STD_LOGIC ve VHDL pro popis číslicových systémů používanější a na tomto typu je také
založeno několik dalších datových typů, především SIGNED a UNSIGNED:
TYPE
signed IS ARRAY ( NATURAL RANGE <> ) OF std_logic;
TYPE unsigned IS ARRAY ( NATURAL RANGE <> ) OF std_logic;
Kromě již předdefinovaných datových typů umožňuje VHDL deklarovat vlastní datové
typy formou výčtu (enumerated type). Tento fakt se velmi často využívá například při popisu
stavových automatů, kdy zpřehledňuje jejich popis a zároveň umožňuje snazší kontrolu
funkce (verifikaci). V některých firmách je použití výčtových typů pro popis stavových
automatů dokonce striktně požadováno. Níže je uveden příklad deklarace vlastního datového
typu t_state a deklarace dvojice signálů pres_state a next_state tohoto typu
s definicí výchozí hodnoty (inicializace).
TYPE t_state IS (Idle, Run, Lap, Stop);
SIGNAL pres_state, next_state:
t_state := Idle;
Veškeré výčtové datové typy jsou ordinální, tudíž je se signály takových typů možné
provádět nejen operace porovnání ekvivalence a nonekvivalence (=, /=), ale také porovnání
velikostí (>, <, >=, <=). Dle výše uvedené deklarace datového typu t_state platí, že výraz
(Idle < Run) má hodnotu TRUE (výsledek relační operace je vždy typu boolean).
Dále lze deklarovat i subtypy na základě již deklarovaného datového typu.
TYPE t_0to9 IS INTEGER RANGE 0 TO 9;
Takové datové typy lze využít k implicitní kontrole kódu během simulace systému
(funkční verifikace). Pokud například během simulace signálu, který je výše uvedeného typu
t_0to9, přiřadíme hodnotu 21, zahlásí simulátor ihned chybu.
2.4 Výrazy a operátory
Výrazy jsou skupiny identifikátorů (objektů) navzájem propojených operátory.
Vyhodnocování výrazů se provádí na základě priority zavedené definicí jazyka VHDL
(celkem 7 úrovní). Operátory definované ve standardu VHDL jsou uvedeny níže v seznamu
podle jejich priority od nejvyšší po nejnižší. V případě potřeby lze prioritu vyhodnocení
výrazu libovolně upravit pomocí závorek.
FEKT Vysokého učení technického v Brně
14
1) **
ABS
NOT
exponent
absolutní hodnota
komplement
negace
2**8 = 256
ABS(-128) = 128
NOT("1100") = "0011"
NOT(FALSE) = TRUE
2) *
/
MOD
REM
násobení
dělení
celočíselné dělení
zbytek po dělení
8*3 = 24
8/3 = 2.666666666...
14 MOD 8 = 1
14 REM 8 = 6
3) +
-
znaménko
znaménko
+(16) = 16
-(16) = -16
4) +
&
součet
rozdíl
sloučení (concatenate)
2+8 = 10
2-8 = -6
"0110" & "11" = "011011"
5) SLL
SRL
SLA
SRA
ROL
ROR
posun vlevo (log.)
posun vlevo (log.)
posun vlevo (aritm.)
posun vlevo (aritm.)
rotace vlevo
rotace vpravo
"100110"
"100110"
"100110"
"100110"
"100110"
"100110"
6) =
/=
<
<=
>
>=
rovno
není rovno
menší
menší nebo rovno
větší
větší nebo rovno
(5
(5
(5
(5
(5
(5
7) AND
logický součin
"1100"
FALSE
"1100"
FALSE
"1100"
FALSE
"1100"
FALSE
"1100"
FALSE
"1100"
FALSE
NAND
negovaný logický součin
OR
logický součet
NOR
negovaný logický součet
XOR
exkluzivní OR
XNOR
exkluzivní NOR
=
/=
<
<=
=
>=
SLL
SRL
SLA
SRA
ROL
ROR
12)
12)
12)
12)
12)
12)
=
=
=
=
=
=
2
2
2
2
2
2
=
=
=
=
=
=
"011000"
"001001"
"011000"
"111001"
"011010"
"101001"
FALSE
TRUE
TRUE
TRUE
FALSE
FALSE
AND "0110" = "0100"
AND TRUE = FALSE
NAND "0110" = "1011"
NAND TRUE = TRUE
OR "0110" = "1110"
OR TRUE = TRUE
NOR "0110" = "0001"
NOR TRUE = FALSE
XOR "0110" = "1010"
XOR TRUE = TRUE
XNOR "0110" = "0101"
XNOR TRUE = FALSE
Jazyk VHDL je přísně typový. Pokud chceme nějaký objekt použít, musíme předem
deklarovat jeho typ. Typ objektu pak určuje operace, které lze s objektem provádět. Jinými
slovy, operace je možné provádět pouze s objekty takových datových typů, pro které jsou tyto
operace definovány. Například ve standardní sloze STD_LOGIC_1164 je sice definován
datový typy STD_LOGIC_VECTOR, ale již ne funkce pro sčítání operandů tohoto typu.
Pokud chceme operaci sčítání objektů tohoto typu provádět, je nutné tuto funkci deklarovat
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
15
(jak je tomu například v nestandardní sloze STD_LOGIC_UNSIGNED). Přísná typovost také
neumožňuje přímé přiřazení hodnot jednoho objektu na druhý. K přiřazení je nutné použít
konverzní funkce, které bývají součástí standardních sloh. Příklady použití jsou uvedeny
v kapitole 4.3.
2.5 Objekty jazyka VHDL
Základními objekty jazyka VHDL jsou signály, proměnné, konstanty a soubory.
Signál (signal) je objekt, který se přímo používá pro popis číslicových systémů, a je
ekvivalentem vodiče v jejich fyzické realizaci. V rámci zdrojového kódu jsou signály
deklarovány buď jako porty v deklaraci entity, nebo jako vnitřní signály dané entity
v deklarativní části architektury. Nejběžnější typy signálů jsou definovány ve zdrojovém kódu
níže a graficky znázorněny na Obr. 3.
ENTITY ALU IS
PORT (A,B:
IN STD_LOGIC_VECTOR (7 DOWNTO 0);
OpSel: IN STD_LOGIC;
SUM:
OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
sig_1: INOUT STD_LOGIC;
-- tristavove I/O
sig_2: BUFFER STD_LOGIC);
-- nepouzivat
END ALU;
----------------------------------------------ARCHITECTURE Behavioral OF ALU IS
SIGNAL SUM_i:
STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL CARRY:
STD_LOGIC;
BEGIN
...
ALU
A
SUM_i
B
OpSel
Obr. 3
SUM
sig_1
CARRY
sig_2
Různé způsoby deklarace signálu z hlediska entity.
Dalším objektem jsou proměnné (variable), které slouží pro zjednodušení popisu, ale
již nemají fyzický ekvivalent v implementovaném designu. Typickým příkladem použití jsou
iterační proměnné v cyklech. Proměnné jsou většinou definovány uvnitř procesů a funkcí.
V takovém případě nejsou dostupné ve zbývající části kódu, jde tedy o jakýsi ekvivalent
lokální proměnné. Pokud má být hodnota proměnné dostupná i mimo daný proces či funkci,
je třeba její hodnotu přiřadit vhodnému signálu. Existuje možnost deklarovat i globální
proměnné, ale jejich použití se v kódech určených pro syntézu nedoporučuje. Použití
proměnných je častější v kódech určených pro simulaci, kódy určené pro syntézu je většinou
možné efektivně zapsat i bez použití proměnných.
Posledním pro syntézu důležitým objektem jsou konstanty (constant). Jejich význam
tkví především v možnosti snadno parametrizovat design a/nebo zpřehlednit jeho popis.
Konstanty mohou být definovány v deklarativní části architektury, kdy jsou dostupné pouze
v příslušné architektuře, nebo v uživatelem definovaných slohách, které umožní použít takto
FEKT Vysokého učení technického v Brně
16
definované konstanty ve všech zdrojových kódech, ve kterých je daná sloha použita. Obecně
se nedoporučuje v samotném popisu používat explicitní číselné hodnoty, ale nahradit je právě
konstantami. Týká se to například i definice rozměrů vektorů a polí při jejich deklaraci.
Takový způsob popisu je snáze verifikovatelný a lze jej jednoduše modifikovat.
2.6 Příkazy a procesy
Ačkoliv je jazyk VHDL určen pro syntézu číslicových obvodů, tak ne každý zdrojový
kód napsaný ve VHDL lze úspěšně syntetizovat. Existuje podskupina příkazů a funkcí jazyka,
označovaná jako syntetizovatelná (Synthesable Subset), která je podporována syntetizéry.
Zbývající příkazy lze bez omezení použít pouze pro verifikaci. Zda lze konkrétní konstrukce a
funkce syntetizovat, je třeba ověřit v dokumentaci použitého syntetizéru (viz např. [16]),
možnosti syntetizérů se liší. Typickým příkladem nesyntetizovatelných příkazů je skupina
příkazů WAIT nebo obecná operace dělení. Obecně je známa horší podpora cyklů (FOR,
WHILE…). Jejich syntéza je sice možná, ale při nevhodném použití může vést na velmi
neefektivní výslednou implementaci nebo dokonce nesyntetizovatelný zdrojový kód.
Moderní syntetizéry dnes zpracovávají zdrojové kódy do určité míry intuitivně, v kódu
se snaží rozpoznat typické struktury. Například klopný obvod typu D lze popsat mnoha
způsoby, které vyhoví při simulaci. Syntetizér ale dokáže klopný obvod typu D ze zdrojového
kódu extrahovat pouze v případě, že je popsán pomocí odpovídajícího procesu s předepsanou
strukturou. Proto je třeba při psaní kódu dodržovat některé konvence, které sice často
zdrojový kód zesložiťují, ale pro korektní syntézu jsou nezbytné. Některé tyto konvence jsou
uvedeny níže. Ve VHDL existují tři skupiny příkazů:

Souběžné příkazy (concurrent statement): jsou to příkazy, které jsou prováděny
nezávisle na pořadí zápisu, vždy „zároveň“, souběžně. Patří mezi ně
o podmíněný příkaz WHEN-ELSE
o podmíněný příkaz WITH-SELECT-WHEN
o instanciace komponent
o procesy (PROCESS) jako celek
o příkaz GENERATE

Sekvenční příkazy (sequential statement): příkazy, které se používají pro
algoritmický popis v procesech, funkcích a procedurách. Jejich provádění
probíhá sekvenčně (postupně), jak je to obvyklé například u zdrojových kódů
mikroprocesorů. Jsou to
o příkaz bezprostředního přiřazení pro proměnné :=
o podmíněný příkaz IF-THEN-ELSE-ELSIF
o podmíněný příkaz CASE-WHEN
o smyčky a jejich pomocné ovládací příkazy (FOR, WHILE, LOOP, NEXT,
EXIT)

Příkazy sekvenčního i souběžného charakteru: lze je použít jako sekvenční i
jako souběžné příkazy.
o bezprostřední přiřazení hodnoty signálu <=
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
17
o volání funkcí a procedur
o příkazy ASSERT a REPORT
Souběžné příkazy lze psát v libovolném pořadí architektury. Každý souběžný příkaz je
ekvivalentem propojení bloků nebo určité části číslicového obvodu, tedy kombinační části,
sekvenční části nebo subsystému obsahující jak kombinační tak sekvenční část. V popisu
systému pomocí souběžných příkazů lze vidět netlist s prvky vyšších programovacích jazyků.
Níže je uveden příklad zdrojového kódu s trojicí souběžných příkazů v architektuře popisující
entitu ALU a graficky naznačený výsledek syntézy tohoto kódu. Pořadí zápisu příkazů
přiřazení pro signály Z, X a Y může být libovolné.
ENTITY ALU IS
PORT(
A,B,C,D : IN INTEGER;
Z
: OUT INTEGER);
END ALU;
ARCHITECTURE Behavioral OF ALU IS
SIGNAL X, Y : INTEGER;
BEGIN
Z <= X + Y;
X <= A + B;
Y <= C + D;
END Behavioral;
ALU
A
+
X
B
C
+
+
Z
Y
D
Častou chybou při psaní kódu je přiřazení hodnoty jednomu signálu více souběžnými
příkazy. Výsledkem dvojice příkazů by byla realizace dvojice číslicových obvodů, jejichž
výstupy by byly propojeny. Takový kód nelze implementovat, při pokusu o syntézu dojde
k chybovému hlášení, které oznamuje návrháři tuto chybu jako existenci více zdrojů pro jeden
signál (multisource). Ukázka korektního a nekorektního způsobu zápisu je níže.
BEGIN
-- nekorektní kód (dva souběžné příkazy pro jeden signál)
Z <= X + Y;
Z <= "0000" WHEN reset = '1';
END Behavioral;
BEGIN
-- korektní kód (jeden souběžný příkaz pro jeden signál)
Z <= "0000" WHEN reset = '1' ELSE (X + Y);
END Behavioral;
Sekvenční příkazy lze použít pouze v procesech, funkcích a procedurách. Proces
(process) je speciální konstrukt jazyka VHDL, který slouží k zapouzdření části kódu, který
má algoritmický charakter. Jako celek je pak proces chápán jako jediný sekvenční příkaz a
obvykle je ve výsledné implementaci reprezentován kombinačním či sekvenčním logickým
obvodem. Sekvenční popis dostupný v procesech umožňuje ve srovnání se souběžnými
příkazy mnohem snazší zápis složitých algoritmů. Proto se procesy velmi často používají
především v behaviorálním stylu popisu.
Existují dva základní typy procesů:
 Proces obsahující některý z příkazů skupiny WAIT. Takový proces lze použít
pouze pro simulaci, neboť samotný příkaz čekání (wait) nelze přímo realizovat
žádným logickým obvodem.
 Proces obsahující citlivostní seznam (sensitivity list). Tyto procesy lze použít
jak pro simulaci, tak pro implementaci. Lze je dále rozdělit na procesy realizující
FEKT Vysokého učení technického v Brně
18
kombinační logické funkce (tzv. kombinační procesy) a procesy realizující
sekvenční funkce (tzv. sekvenční procesy).
Ukázka typického procesu je ve zdrojovém kódu níže. Proces realizuje funkci, která
odpovídá klopnému obvodu typu D řízenému hranou se signálem asynchronního nulování.
PROCESS (reset, clk)
BEGIN
IF reset = '1' THEN
Q <= '0';
ELSIF rising_edge(clk) THEN
Q <= D;
END IF;
END PROCESS;
Za klíčovým slovem PROCESS je uveden tzv. citlivostní seznam (sensitivity list). Je to
seznam signálů, na které proces reaguje. Z hlediska simulace dojde ke spuštění
(„přepočítání“) procesu v případě, že se jakkoliv změní některý ze signálů v tomto seznamu.
Vzhledem k tomu, že tyto signály bývají typu STD_LOGIC, může jít nejen o změnu z úrovně
log. 0 do log. 1 a naopak, ale také přechod do stavu vysoké impedance 'Z', nedefinované
hodnoty 'X' a podobně. Z hlediska implementace citlivostní seznam tak podstatný není,
jelikož syntetizéry neinterpretují kód „doslova“, ale snaží se v něm rozpoznat typické
struktury. Při implementaci kódu, v němž by byl citlivostní seznam neúplný, proběhne
implementace korektně. Syntetizér pouze upozorní návrháře na chybějící signál(y)
v citlivostním seznamu. To je velmi nebezpečná situace z hlediska funkční verifikace, neboť
v simulaci se tento kód chová jinak, než po implementaci. Proto je vždy nezbytné citlivostní
seznam korektně vyplnit.
V případě procesů popisujících sekvenční systémy (řízené hranou hodinového signálu)
je dovoleno do citlivostního seznamu uvést pouze hodinový signál (zde clk) a signál pro
asynchronní nulování nebo nastavení (zde reset). Na pořadí zápisu signálu nezáleží.
V případě procesů realizujících pouze kombinační logické funkce je třeba do citlivostního
seznamu uvést všechny signály, které figurují na pravé straně přiřazovacích příkazů a ty,
které jsou v argumentech podmíněných příkazů.
Za citlivostním seznamem může následovat deklarace vnitřních proměnných, funkcí a
procedur. Zde následuje rovnou klíčové slovo BEGIN uvozující samotný popis chování. Popis
je proveden jediným sekvenčním podmíněným příkazem IF-THEN-ELSE-ELSIF. U
klopného obvodu typu D má nejvyšší prioritu signál asynchronního nulování, proto je zapsán
jako první v podmínce IF. V případě, že je podmínka reset = '1' platná, dojde
k okamžitému vynulování výstupu Q. V opačném případě je vyhodnocována druhá podmínka,
která obsahuje funkci rising_edge(clk). Tento výraz nabývá hodnoty TRUE
v okamžiku náběžné hrany hodinového signálu. V ten okamžik je proveden příkaz přiřazení
Q <= D. Pokud požadujeme reakci na sestupnou hranu hodinového signálu, můžeme použít
komplementární funkci faling_edge. Ve starších zdrojových kódech se lze setkat s jinou
podmínkou pro detekci náběžné hrany, která je ekvivalentem funkce rising_edge. Je to
výraz clk'EVENT AND clk = '1'. Přesně tímto způsobem je funkce rising_edge
definována ve sloze STD_LOGIC_1164.
V rámci procesů se pro usnadnění popisu často používají proměnné (variable). Pro
přiřazení hodnoty proměnné se používá příkaz tzv. bezprostředního přiřazení :=, který je
proveden ihned. Naproti tomu pro signály se používá tzv. odložené přiřazení <=, které je
provedeno až v okamžiku skončení procesu (případně při provedení nejbližšího příkazu typu
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
19
WAIT). Níže je ukázka dvojice zdrojových kódů, které demonstrují rozdíl mezi odloženým a
bezprostředním přiřazením.
-- sig_A, sig_B, sig_C:
STD_LOGIC_VECTOR(3 DOWTNO 0);
-- v okamziku spusteni procesu je
-- sig_A = 3, sig_B = 5, sig_C = 2
PROCESS (clk)
VARIABLE v_A, v_B, v_C: STD_LOGIC_VECTOR(3 DOWTNO 0):= X"0";
BEGIN
IF rising_edge(clk) THEN
v_A := sig_A + 1;
-- v_A = 3 + 1 = 4
v_B := sig_B + v_A;
-- v_B = 5 + 4 = 9
v_C := v_A + v_B;
-- v_C = 4 + 9 = 13
sig_A <= v_A; sig_B <= v_B; sig_C <= v_C;
END IF;
END PROCESS;
po skončení procesu: sig_A = 4
sig_B = 9
sig_C = 13
Tento proces využívá proměnných deklarovaných lokálně (nejsou dostupné mimo
proces). V okamžiku náběžné hrany signálu clk dojde ke spuštění procesu a vyhodnocení
příkazů za podmínku IF rising_edge(clk). Každé přiřazení hodnoty proměnné je
provedeno ihned na příslušném řádku, takže v následujícím řádku je pro vyhodnocení výrazu
použita již nová hodnota. Přiřazení proměnných externím signálům (tři příkazy v posledním
řádku procesu) je provedeno v okamžiku skončení procesu). V tomto případě v procesu
záleží na pořadí zápisu příkazů, pořadí zápisu ovlivní výsledné hodnoty signálů.
-- sig_A, sig_B, sig_C:
STD_LOGIC_VECTOR(3 DOWTNO 0);
-- v okamziku spusteni procesu je
-- sig_A = 3, sig_B = 5, sig_C = 2
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
sig_A <= sig_A + 1;
-- sig_A = 3 + 1 =
sig_B <= sig_B + sig_A;
-- sig_B = 5 + 3 =
sig_C <= sig_A + sig_B;
-- sig_C = 3 + 5 =
END IF;
END PROCESS;
po skončení procesu: sig_A = 4
sig_B = 8
sig_C =
4
8
8
8
Výše uvedený proces, který nevyužívá proměnné, se chová jinak, byť je zápis operací
na první pohled stejný. Všechny tři příkazy v procesu představují odložené přiřazení, které se
provede až v okamžiku skončení procesu. Proto je pro vyhodnocení všech příkazů použita
hodnota signálů (sig_A a sig_B) taková, jaká byla v okamžiku spuštění procesu. Toto
chování může být první pohled matoucí a může být zdrojem chyb především u začínajících
návrhářů. Při správném použití ale umožňuje popisovat číslicové systémy velmi efektivně.
Níže je ukázka dvojice ekvivalentních kombinačních procesů, kde je využita vlastnost
odloženého přiřazení.
PROCESS (a,b,reset) BEGIN
IF reset = '1' THEN
x <= 0;
ELSE
x <= a + b;
END IF;
END PROCESS;
PROCESS (a,b,reset) BEGIN
x <= a + b;
-- default assignment
IF reset = '1' THEN
x <= 0;
END IF;
END PROCESS;
20
FEKT Vysokého učení technického v Brně
Oba kódy popisují kombinační obvod, který provádí sčítání operandů a a b, pokud je
vstupní signál reset neaktivní, v opačném případě je výstup x vynulován. Jelikož jde o tzv.
kombinační procesy, musí citlivostní seznam v obou případech obsahovat všechny signály
figurující na pravé straně příkazů přiřazení (zde a a b) a všechny signály figurující
v argumentech podmíněných příkazů (zde reset). V procesu uvedeném vlevo je explicitně
podmíněným příkazem specifikována priorita provádění příkazů. V procesu napravo je
využito vlastností odloženého přiřazení pomocí tzv. výchozí přiřazení (default assignment).
Pokud je aktivní signál reset, jsou při vyhodnocení procesu jako platné nalezeny dva
příkazy přiřazující hodnotu signálu x. Proveden je vždy pouze poslední příkaz, který je při
vyhodnocení procesu nalezen, v tomto případě tedy nulování signálu x.
Důležitým typem popisu ve VHDL je strukturální popis, který reprezentuje schéma
v textové podobě (netlist). Ukázka použití strukturálního popisu je uvedena níže na
jednoduchém obvodu složeném ze tří hradel AND. Samotné hradlo AND je popsáno
samostatným zdrojovým kódem a tvoří blok pojmenovaný AND_gate.
LIBRARY IEEE;
use IEEE.std_logic_1164.ALL;
-------------------------------------------ENTITY AND_gate IS
PORT ( A
: IN STD_LOGIC;
B
: IN STD_LOGIC;
Y
: OUT STD_LOGIC);
END AND_gate;
-------------------------------------------ARCHITECTURE Behavioral OF AND_gate IS
BEGIN
Y <= '1' WHEN (A='1' AND B='1') ELSE '0';
END Behavioral;
A
B
Y
Toto hradlo je pak použito jako základní blok složitějšího bloku AND_4in, k jehož
popisu je využit právě strukturální popis.
LIBRARY IEEE;
use IEEE.std_logic_1164.ALL;
----------------------------------------ENTITY AND_4in IS
PORT ( I1,I2,I3,I4 : IN STD_LOGIC;
Y :
OUT STD_LOGIC);
END AND_4in;
----------------------------------------ARCHITECTURE Structural OF AND_4in
COMPONENT AND_gate
PORT ( A,B : IN STD_LOGIC;
Y :
OUT STD_LOGIC);
END COMPONENT;
SIGNAL S1,S2:
STD_LOGIC;
BEGIN
AND_1: AND_gate PORT MAP ( A => I1, B => I2,
AND_2: AND_gate PORT MAP ( A => I3, B => I4,
AND_3: AND_gate PORT MAP ( A => S1, B => S2,
END Structural;
AND_4in
I1
I2
I3
I4
AND_1
S1
Y
AND_2
Y => S1);
Y => S2);
Y => Y );
AND_3
S2
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
21
3 Architektura obvodů FPGA
Cílem této kapitoly je nejen seznámit čtenáře s architekturou moderních obvodů FPGA,
ale také se vznikem a postupným vývojem programovatelných logických obvodů (PLD;
Programmable Logic Devices), k čemuž je třeba znát několik technologických a historických
faktů. Je zde zachycen vznik a vývoj moderních obvodů PLD, tedy SPLD, CPLD a FPGA.
3.1 Vývoj a výroba integrovaných obvodů
První číslicové systémy, které vznikaly v 18. století, byly čistě mechanické a pracovaly
s dekadickým vyjádřením čísla. Ještě v polovině 20. století se vyráběly velké
elektromechanické počítače, které již měly možnost programování pomocí děrných štítků, ale
jejich výpočetní rychlost byla omezená. Před 2. světovou válkou se objevily první reléové
počítače, které byly rychlejší, než jejich mechanické protějšky, a pracovaly s binárním
vyjádřením čísel. S nástupem elektronek přišlo podstatné zrychlení funkce počítačů a
s následným příchodem tranzistorů i snížení spotřeby, byť z hlediska rozměrů šlo stále o
sálové stroje. Teprve s příchodem integrovaných obvodů v počátku 60. let došlo k výraznému
zmenšení číslicových systémů. Aplikace technologie CMOS umožnila i jejich výrazné
zlevnění a tím i hromadnou výrobu.
Koncem 60. let již na trhu existovaly ucelené řady standardních integrovaných obvodů,
ze kterých bylo možné sestavit teoreticky libovolný číslicový systém. Šlo o základní
integrované obvody řady 54x, 74x, CMOS 4000, a dále některé specializovanější integrované
obvody (ASSP; Application Specific Standard Part). Číslicové systémy se tehdy skládaly
z desítek až tisíců takových integrovaných obvodů vzájemně propojených pomocí vodičů
nebo plošných spojů. Modifikace funkce těchto zařízení byla přirozeně obtížná, pokud vůbec
možná, a často se neobešla bez větších změn postihujících většinu systému. Takové systémy
navíc byly pro některé účely málo výkonné a vykazovaly nadměrnou spotřebu.
Pro mnoho aplikací proto bylo nutné navrhnout integrovaný obvod „šitý na míru“, tzv.
zákaznický integrovaný obvod (ASIC; Application Specific Integrated Circuit). Tyto obvody
v podstatě představovaly integraci diskrétních součástek na jeden čip. Vývoj takových obvodů
je ale velice nákladný, časově náročný a výrazně ovlivňuje cenu součástky. Proto se k výrobě
nového obvodu ASIC přistupuje pouze ve dvou případech:
 Obvod bude uplatněn ve velkém množství aplikací. Nevratné náklady na vývoj
(NRE Costs; Non-Recurring Engineering Costs) se projeví na ceně výsledné
součástky pouze nepatrně, jelikož jich budou vyrobeny statisíce až miliony kusů
 Potřebné vlastnosti obvodu jsou ceně nadřazené. Jde o speciální součástky,
typicky pro armádní a vesmírné aplikace, kde je i vysoká cena jedné součástky
akceptovatelná vzhledem k získaným užitným vlastnostem.
Obvody ASIC se od obvodů ASSP prakticky liší pouze z hlediska uplatnění na trhu:
obvody ASSP jsou komerčně dostupné, kdežto obvody ASIC jsou určeny pro jediného
zákazníka a bývají úzce specializované pro danou aplikaci. Vývoj a výroba těchto obvodů
jsou identické. Hlavní dva problémy obvodů ASIC jsou vysoké náklady NRE a dlouhá doba
potřebná pro jejich vývoj. Náklady jsou z velké části tvořeny cenou samotného vývoje (návrh
a verifikaci), a z nezanedbatelné části také cenou litografických masek použitých při výrobě
22
FEKT Vysokého učení technického v Brně
čipu. Tyto náklady se výrobci i uživatelé integrovaných obvodů snažili minimalizovat již od
počátků jejich výroby a tak nejen zlevnit, ale i zrychlit vývoj nových obvodů.
Na trhu tedy v 60. letech existovaly dvě krajní možnosti pro realizaci nového
číslicového systému: řešení z diskrétních součástek nebo řešení v podobě obvodu ASIC. Od té
doby se objevilo několik cest, které se snažily vyplnit mezeru (gap) na trhu mezi těmito
technologickými extrémy, a vytvořit komerčně úspěšný kompromis těmto dvěma variantám.
FPGA se v tomto směru ukázaly být jednou z nejúspěšnějších variant i z důvodů, které se
ukázaly jako klíčové až později.
Tímto způsobem (byť poněkud později, než níže uvedené varianty) vznikly i
mikropočítače tak, jak je známe dnes. V roce 1971 firma Intel uvedla na trh obvod Intel 4004,
což byl první komerčně dostupný mikropočítač (computer-on-a-chip). Obvod byl koncipován
tak, aby dokázal nahradit v mnoha aplikacích specializované řídicí obvody doposud
realizované jako ASIC. Jeho konkrétní funkce u něj nebyla definována při výrobě, ale
programem uloženým v paměti (na stejném čipu), kterou mohl uživatel libovolně měnit.
Stejný procesor tak bylo možné použít v mnoha aplikacích a tím byl zajištěn velký odbyt.
Náklady na vývoj a výrobu samotného procesoru (který byl samozřejmě také navržen jako čip
ASIC) bylo možné rozprostřít do velkého množství prodaných součástek, jejichž výroba je
sama o sobě poměrně levná. Přesto, že procesory jsou číslicové obvody, jejichž funkci lze
definovat programem, nezařazujeme je dnes do kategorie programovatelných logických
obvodů.
Šlo o zcela nový přístup, který se plně osvědčil a rychle rozvinul. Dnešní procesory jsou
ve srovnání s obvody ASIC mnohem levnější (v malých sériích), ihned k dispozici a mají
mnoho zabudovaných bloků (periferií), které zvyšují jejich užitnou hodnotu. Výpočetní výkon
(performance) i těch nejvýkonnějších procesorů je ale ve srovnání s možnostmi technologicky
srovnatelných obvodů ASIC malý. Je to dáno kompromisem ve prospěch programovatelnosti
(flexibility), která určuje univerzálnost použití procesorů. V době svého vzniku se tak
procesory výkonnostně zařadily spíše k obvodům, které byly složeny ze standardních
diskrétních integrovaných obvodů (74x, CMOS 4000).
Již v polovině 60. let se objevily jiné typy obvodů, které si kladly za cíl vyplnit mezeru
mezi diskrétním řešením a obvody ASIC. Jedna z myšlenek spočívala ve vytvoření
univerzálního základního čipu, který by byl základem pro více integrovaných obvodů. Výroba
základní čipu by probíhala ve velkých sériích, byl by tudíž poměrně levný. Zákazník by poté
konkrétní funkci čipu definoval vytvořením několika posledních výrobních vrstev, typicky
pouze metalických, jejichž návrh i výroba by nebyly tak nákladné.
První obvody tohoto typu byly obvody Micromatrix firmy Fairchild Semiconductor
(Obr. 4). Základní čip tvořilo pole nezapojených tranzistorů (přibližně 100). Propojení
tranzistorů mohl definovat uživatel pomocí dvojice metalických vrstev. Propojení bylo třeba
kreslit ručně na předlohy, zvlášť pro každou vrstvu, přičemž jedna vrstva obsahovala pouze
horizontální spoje, druhá pouze vertikální spoje. Propojením několika tranzistorů bylo možné
realizovat základní logické funkce (AND, OR) a jejich propojením vytvořit jednoduchý
číslicový systém. Jelikož návrh probíhal ručně, byl pracný, náročný na čas a náchylný na
chyby. Samotnou realizaci metalického propojení bylo nutné provést ve výrobním závodě a
nebylo možné provést přeprogramování. Byť tedy došlo k jisté úspoře času i financí, nakonec
se tato technologie neprosadila.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Základní čip
23
Naprogramovaný čip
Metalizace definovaná
uživatelem
Obr. 4
Programovatelná struktura Micromatrix / Micromosaic.
V roce 1967 společnost Fairchild představila nové obvody Micromosaic, které byly
založené na stejném základním principu, tedy tranzistorovém poli. V tomto případě ale
propojení nebylo definováno ručně na předlohu, ale textovým souborem v počítači. Tento
soubor nepopisoval přímo propojení tranzistorů, ale používal vyšší stupeň abstrakce:
Booleovské rovnice. Na základě tohoto popisu potom program automaticky vygeneroval
potřebnou mapu propojek, která se poté na základní čip s tranzistory nanesla (opět ve
výrobním závodě). Jde vůbec o první reálné použití nástrojů CAD (Computer Aided Design) a
struktura se stala předchůdcem moderních hradlových polí (Gate Array). Na jednom čipu bylo
možné takto realizovat přibližně 150 elementárních hradel. Přesto, že struktura Micromosaic
byla poněkud úspěšnější, nedošlo k jejímu většímu rozšíření a dalšímu rozvoji.
V polovině 70. let se místo toho na trhu objevily nové obvody, tzv. hradlová pole (Gate
Arrays). Základní myšlenka těchto obvodů je stejná, jako u předchozí dvojice tranzistorových
polí. Rozdíl je v elementární buňce pole na základním čipu, která je v tomto případě tvořena
více diskrétními součástkami (Obr. 5). Uživatel tak definuje nejen propojení buněk pole, ale i
funkci každé buňky. Jak funkce buňky, tak propojení je realizování metalickými vrstvami.
První obvody tohoto typu existovaly již v počátku 60. let, ale byly určeny pouze pro interní
potřebu výrobců těchto obvodů. Komerčně dostupný hradlová pole se objevily až o deset let
později s nástupem levné technologie CMOS.
Uvedené typy integrovaných obvodů (pole tranzistorů i hradlová pole), trpí dvěma
základními nedostatky:
 Většina systémů implementovaných na takové platformě využije pouze část čipu
(typicky 40-60%), zbývající buňky zůstávají nevyužité a snižují tak efektivitu
využití křemíkového čipu.
 Vzájemné propojení elementárních buněk není optimální, což vede k větším
zpožděním a větší spotřebě (dynamické ztráty). Tento problém je tím větší, čím
větší část čipu je využita.
Jako reakci na tyto nedostatky lze chápat vznik dalšího typu integrovaných obvodů,
které vznikly na počátku 80. let. Byly to zákaznické integrované obvody založené na
standardních buňkách (Standard Cell ASIC). Obvody v tomto případě nesdílely společný
základní čip, každý integrovaný obvod se musel vyrábět kompletně se všemi maskami.
Úspora spočívala v tom, že výrobci obvodů ASIC vytvořili knihovny standardních buněk
(Standard Cell Library), které byly tvořeny základními hradly (AND, OR, XOR...), klopnými
obvody, zesilovači (buffer), ale také většími bloky (hard macros), jako paměti ROM, RAM,
FEKT Vysokého učení technického v Brně
24
nebo dokonce celé procesory. Tyto buňky a bloky již byly ověřené (verified, silicon proven), a
návrháři je tak mohli jednoduše přímo použít, aniž by každou buňku museli konstruovat a
následně verifikovat. Takový přístup sice přímo nezlevnil samotnou výrobu čipu, ale
podstatně snížil náklady na vývoj a verifikaci nových čipů ASIC, snížil riziko neúspěšné
implementace a je dnes nejrozšířenějším způsobem návrhu číslicových obvodů ASIC.
Základní buňka (BiCMOS)
Obr. 5
Základní buňka (CMOS)
Základní čip
Struktura hradlového pole (Gate Array).
Návrh obvodu ASIC se standardními buňkami probíhá z velké části automaticky.
Návrhář vhodným způsobem popíše funkci obvodu a implementační nástroje zajistí převod
popisu do zapojení standardních buněk. Tyto buňky mají nejen standardní funkci, ale i
rozměr; na čip jsou umisťovány do řad těsně vedle sebe, přičemž ve vyšších metalických
vrstvách se vytváří potřebné vzájemné propojení buněk i propojení buněk na vstupy a
výstupy. Tento přístup zajišťuje mnohem efektivnější využití čipu a zároveň umožňuje
podstatně zvýšit jeho výpočetní výkon a snížit spotřebu.
V první polovině 80. let se v oblasti integrovaných obvodů objevil nový problém, který
se brzy reflektoval do způsobu návrhu číslicových obvodů. Vývoj technologie výroby
integrovaných obvodů byl (a stále je) podstatně rychlejší, než vývoj nástrojů EDA pro její
využití. Zatímco meziroční nárůst produktivity výroby je přibližně 50-60%, je vzrůst
možností návrhu jen asi 20-25%. To v praxi způsobuje, že návrháři se stávajícími nástroji
nejsou schopni v dostatečně krátkém čase efektivně využít možnosti (plochu čipu), kterou jim
technologie dává k dispozici. Tento jev se označuje jako design productivity gap. Jeho
důsledkem pak je fakt, že je výhodnější pro návrh číslicových obvodů použít méně efektivní
metody, jejichž horší vlastnosti jsou kompenzovány náskokem v technologii výroby. Tento
problém byl jednou z příčin vzniku a následného úspěchu obvodů FPGA.
První obvody typu FPGA vznikly již na počátku 80. let, ale nebyly komerčně dostupné.
Za první obvod FPGA je tedy považován až obvod firmy Xilinx, který byl v roce 1984
uveden na trh. Firma Xilinx jej hned od počátku prezentovala jako (elektrickým) polem
programovatelné hradlové pole, tedy Field Programmable Gate Array. Základní struktura
obvodu FPGA je na Obr. 6 a do dnešních dnů zůstala zachována. Obvod tvoří
programovatelné logické buňky, které slouží k realizaci logických funkcí a sekvenčních prvků
číslicového obvodu. Tyto buňky jsou propojeny programovatelnou strukturou, která je
propojuje navzájem a zajišťuje jejich vazbu na vstupně/výstupní buňky, které jsou rovněž
konfigurovatelné. Tento koncept se podobá hradlovým polím, jak byla popsána výše. Hlavní
rozdíl je ale v tom, že hradlová pole lze programovat pouze metalickými vrstvami přímo na
čipu, tedy pouze při jejich výrobě. Naproti tomu FPGA jsou programovatelné ryze
elektronicky. Programování funkce tak neprobíhá při výrobě čipu, ale na již hotové součástce,
s využitím vhodného programátoru.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
25
Programovatelné
logické buňky
Programovatelná
propojovací struktura
Vstupně/výstupní
buňky
Obr. 6
Základní vnitřní struktura obvodu FPGA.
Použití elektronické konfigurace vede k několika důležitým důsledkům:
 FPGA lze programovat kdykoliv, i opakovaně, což umožňuje mnohem snazší
vývoj s nižším rizikem neúspěchu a nasazení těchto obvodů i v aplikacích, které
se nevyrábí sériově.
 Značnou plochu čipu zabírají prvky zajišťující programovatelnost, proto je
efektivita využití čipu vzhledem k realizované funkci velmi malá.
 Obvod má výrazně vyšší spotřebu a menší výpočetní výkon, než by měl obvod
ASIC vyrobený srovnatelnou technologií.
 Na čipu vždy zůstává značné množství nevyužitých buněk, využití se typicky
pohybuje v rozsahu 40-70%. To dále snižuje efektivitu technologie FPGA
z hlediska využití plochy čipu.
Přes uvedená negativa se FPGA rychle prosadily, právě především díky rostoucí mezeře
v produktivitě návrhu (design productivity gap). Dnes jsou nasazovány do stále většího
množství aplikací, které byly dříve předurčeny pouze obvodům ASIC. Proto stále klesá podíl
obvodů ASIC na trhu, ale rozhodně nelze očekávat, že by je FPGA zcela vytlačily.
LUT
D
Q
CLK
Obr. 7
Základní logická buňka obvodu FPGA.
Základní logická buňka obvodu FPGA je zobrazena na Obr. 7. Skládá se z generátoru
kombinační funkce v podobě LUT (Look-Up Table) a sekvenčního prvku, typicky klopného
obvodu typu D. Klopný obvod i LUT lze obvykle využít nezávisle, k čemuž slouží přídavné
vstupy, výstupy a další vnitřní prvky buňky. Samotná LUT je v podstatě malá paměť typu
FEKT Vysokého učení technického v Brně
26
RAM, který má typicky 3 až 6 vstupů a jeden výstup. Může tedy realizovat libovolnou
kombinační funkci 3 až 6 vstupních proměnných a jedné výstupní proměnné. Princip realizace
logické funkce pomocí čtyřvstupé LUT (paměť 16 x 1 bit) je naznačen na Obr. 8.
d
c
Adresa
d
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
c
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
b
Data
a
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
y
0
0
0
0
0
0
1
0
1
1
0
0
1
1
0
0
minterm
/a·/b·/c·/d
a·/b·/c·/d
/a·b·/c·/d
a·b·/c·/d
/a·/b·c·/d
a·/b·c·/d
/a·b·c·/d
a·b·c·/d
/a·/b·/c·d
a·/b·/c·d
/a·b·/c·d
a·b·/c·d
/a·/b·c·d
a·/b·c·d
/a·b·c·d
a·b·c·d
y
a
a
c
d
0
0
0
0
0
0
0
1
1
1
0
0
1
1
0
0
Součet součinů
(SOP; Sum Of Products)
y = /a·/b·c·d + /a·/b·/c·d + a·/b·/c·d + a·/b·c·d + /a·b·c·/d =
= /b·d + /a·b·c·/d
Term
Obr. 8
b
Mintermy
Princip realizace kombinační logické funkce v LUT.
Každá paměťová buňka LUT představuje jeden minterm, přičemž celá paměť obsahuje
všechny možné mintermy. Sečtením požadovaných mintermů lze realizovat libovolnou
kombinační funkci vstupních proměnných. Potřebná velikost paměti pro realizaci LUT závisí
na počtu jejích vstupů N exponenciálně, potřebný počet paměťových buněk je 2N. S počtem
vstupů se výrazně zvětšuje vstupní část paměti (LUT) – adresní dekodér, což je fixní
kombinační obvod. Ten v paměti pro každou kombinaci vstupních signálů aktivuje právě
jednu paměťovou pozici (buňku). Pokud má LUT 3 vstupy, je počet potřebných buněk 23 = 8,
pokud by tabulka měla 16 vstupů, byl by potřebný počet buněk již 216 = 65536.
Použití LUT s velkým počtem vstupů není výhodné ze dvou důvodů:
 Plocha zabraná na čipu jednou LUT s velkým počtem vstupů by byla příliš
velká, přičemž využití takové LUT by bylo ve většině případů malé. Mnoho
systémů totiž vyžaduje realizaci kombinačních funkcí s menším počtem vstupů
nebo funkcí, které lze snadno minimalizovat. Struktura LUT neumožňuje využít
minimalizace logické funkce, která je tak vždy implementována plně.
 Velký počet vstupů znamená nutnost implementace velkého adresního dekodéru,
který by vykazoval poměrně velké zpoždění při průchodu signálu. To by
znamenalo, že i sekvenční obvody s velmi jednoduchou kombinační částí budou
mít mezní frekvenci limitovanou jednou velkou LUT.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
27
Z těchto důvodů se v obvodech FPGA používají LUT s menším počtem vstupů. První
obvody měly LUT se třemi nebo čtyřmi vstupy, existovaly varianty čipů, které měly dokonce
oba typy tabulek na jednom čipu s cílem využít efektivněji relativně drahou strukturu FPGA.
Od koncepce různých LUT na jednom čipu se ale upustilo, jelikož tehdejší nástroje EDA
nedokázaly takovou nehomogenní strukturu efektivně využít, a jako optimální byly na
dlouhou dobu zvoleny LUT se čtyřmi vstupy. Dnešní obvody již mají často tabulky se šesti
vstupy, které jsou ve skutečnosti složeny ze dvojice LUT s pěti vstupy a hradlem, které
slučuje jejich výstup. To v podstatě odpovídá dříve opuštěné koncepci různých LUT na
jednom čipu. Dnešní implementační nástroje již takovou strukturu dokáží využít, což vede jak
k lepšímu využití čipu, tak zvýšení výpočetního výkonu, neboť pro realizaci jednodušších
funkcí lze použít menší (tedy rychlejší) LUT. I šestivstupé LUT jsou dnes díky pokročilé
technologii dostatečně rychlé a v budoucnu lze očekávat, že se budou vyskytovat i ještě větší
LUT.
Krátce po vzniku obvodů FPGA (začátkem 90. let) se na trhu objevil další typ obvodů,
který byl založen na společném základním čipu, a byl programovatelný metalickou maskou
při výrobě podobně, jako hradlová pole. Základní buňkou těchto obvodů v tomto případě
nebyly primitivní elektronické prvky jako tranzistory a rezistory, ale již elementární hradla,
multiplexory, klopné obvody a tabulky LUT. Tyto obvody se později začaly označovat jak
strukturované obvody ASIC (Structured ASIC) a tvořily logický evoluční stupeň navazující na
hradlová pole. V době svého vzniku ale neobstáli v konkurenci dalších typů obvodů a byly na
nějaký čas zapomenuty. Znovu se tyto obvody objevily až kolem roku 2001, přičemž každý
výrobce měl jiný „recept“ na nejvhodnější složení základních buněk. Jednou z variant
strukturovaných obvodů ASIC byly obvody určené k přímé náhradě obvodů FPGA. Takové
obvody měly základní strukturu, která odpovídala struktuře příslušného obvodu FPGA.
Programovatelné propojky ale byly nahrazeny propojkami metalickými, čímž došlo k výrazné
úspoře plochy čipu a spotřeby, vzrůstu výpočetního výkonu a bezpečnosti obvodu (ve smyslu
zpětného inženýrství i odolnosti proti nepříznivým vnějším vlivům). K náhradě obvodu FPGA
strukturovaným obvodem ASIC se přistupovalo v případě, že na prototypech s FPGA byla
odladěna funkce zařízení, konfigurace FPGA byla zafixována a následovala sériová výroba
zařízení. Ta nesměla být příliš velká ani malá. Při velké produkci by se vyplatilo pro danou
funkci vyrobit obvod ASIC, při malé produkci by naopak bylo cenově výhodnější použít
přímo FPGA.
Nezávisle na hradlových polích, obvodech ASIC se standardními buňkami,
strukturovaných obvodech ASIC a FPGA vznikly další typy programovatelných logických
obvodů: SPLD a CPLD.
Vznik obvodů SPLD lze vysledovat v období, kdy se objevily první komerčně dostupné
paměti PROM (Programmable Read Only Memory) a EPROM (Erasable PROM). V té době
se začaly paměti používat pro realizaci složitějších kombinačních funkcí, přičemž se
využívalo stejného principu, který je využit pro realizaci kombinačních funkcí pomocí LUT.
Paměť, která má 10 adresních vstupů a 8 bitové výstupní datové slovo (tedy
1024 x 8 b = 1 kB), může realizovat až 8 libovolných kombinačních funkcí až deseti vstupním
proměnných. Rychlost pamětí ve funkci kombinačních obvodů byla poměrně malá (ve
srovnání s diskrétními logickými obvody té doby) a efektivita využití poměrně nízká.
Hlavním benefitem takového využití ale byla programovatelnost, v případě technologie
EPROM dokonce opakovatelná.
Funkce číslicového systému, který byl složen z diskrétních obvodů realizujících
základní funkce (kombinační i sekvenční) byla dána jejich vzájemným propojením. Pokud
bylo nutné funkci změnit, bylo třeba provést výměnu některých komponent či dokonce změnu
FEKT Vysokého učení technického v Brně
28
zapojení, tedy provést nový návrh desky plošného spoje, nové osazení a nové testování. To
sebou neslo značné finanční a časové náklady. Použití programovatelných prvků (byť
primitivních, v podobě pamětí) v klíčových bodech zapojení umožnilo snadnou změnu funkce
bez nutnosti nového návrhu a procesu výroby.
Tak se začaly paměti používat jako první programovatelné logické obvody (PLD;
Programmable Logic Devices). Jelikož jejich vlastnosti nebyly z hlediska použití jako
generátorů kombinačních funkcí vhodné, začaly se hledat cesty, kterými by došlo jednak ke
zvýšení rychlosti a také efektivity implementace programovatelných obvodů. Na paměť lze
nahlížet jako na dvojstupňovou strukturu AND-OR (Obr. 9). První stupeň je součinový
(AND) a je v případě paměti reprezentován adresní dekodérem. Jeho výstupem je 2N linek
(součinových termů), kde N je počet vstupů stupně AND (adresního dekodéru). Tyto výstupní
linky jsou přivedeny do stupně součtového (OR), které představuje samotné paměťové pole.
V případě pamětí je tedy první stupeň (AND) fixní a druhý stupeň (OR) programovatelný a
tato struktura se dnes obecně označuje jako struktura PROM, nezávisle na technologii, kterou
je paměť vyrobena.
Obr. 9
Dvojstupňová struktura AND-OR obvodů PROM/SPLD.
Jak již bylo uvedeno, hlavní příčinou nízké efektivity struktury PROM je rozsáhlý
adresní dekodér. Jelikož lze většinu reálně implementovaných kombinačních funkcí
minimalizovat, je zbytečné použití kompletního dekodéru. Proto byla vyvinuta nová struktura,
označovaná jako PAL, která respektuje tento fakt, a má programovatelný stupeň AND a
pevný stupeň OR. Obvody založené na tomto principu se dnes označují jako SPLD (Simple
PLD).
Obecná struktura PAL je zachycena na Obr. 10. Tvoří ji několik makrobuněk
(Macrocell), které jsou tvořeny programovatelným součinovým polem AND a jedním
pevným hradlem OR s několika vstupy. Každá makrobuňka může realizovat právě jednu
kombinační logickou funkci (zde y1 a y2). Na obrázku jsou zachyceny dvě makrobuňky, které
mají 5 vstupů (a, b, c, d a e; vstupy do pole AND). Každá makrobuňka může realizovat funkci
pěti vstupních proměnných, kterou lze popsat maximálně čtveřicí termů ve tvaru součtu
součinů (SOP). Počet realizovatelných termů je roven počtu vstupů součtového členu (≥1,
hradlo OR).
Kromě struktury PAL vznikla i struktura PLA, která měla programovatelné oba stupně,
tedy AND i OR. Umožňovala tak dosáhnout větší flexibility a potenciálně i lepší efektivity
implementace. V době svého vzniku ale technologie neumožňovala vyrábět obvody s tak
velkým počtem programovatelných propojek dostatečně levně a struktura tak byla na nějakou
dobu opuštěna. V 90. letech se ale došlo k jejímu nasazení v obvodech CPLD, kde se dodnes
používá.
Struktura PAL má obvykle větší počet vstupů, než je počet termů makrobuňky. Tím je
dosaženo vyšší efektivity při realizaci jednodušších funkcí, ale zároveň to neumožňuje
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
29
realizovat libovolnou kombinační funkci všech vstupních proměnných. Pokud je nutné
realizovat funkce složitější, existuje možnost řetězení makrobuněk, kdy je výstup
makrobuňky přiveden dedikovaným spojem zpět do pole AND. Tuto funkci měly již první
obvody tohoto typu a pro jednoduchost není v obrázku naznačena.
Obr. 10
Struktura PAL s pěti vstup a dvěma makrobuňkami o velikosti čtyři termy.
Samotné programování struktury PAL bylo původně provedeno pomocí tzv. pojistek
(fuse), tedy vodivých cest, které se při programování přerušily velkým proudem. Tento
způsob programování je jednorázový (OTP; One-Time Programmable), a je shodný se
způsobem programování prvních pamětí PROM. Příklad realizace kombinační logické funkce
čtyř vstupních proměnných ve struktuře PLA je na Obr. 11. Funkci lze popsat pomocí dvojice
termů a makrobuňka je tak využita pouze částečně.
Obr. 11
Realizace kombinační logické funkce se dvěma termy ve struktuře PAL.
První obvody SPLD tohoto typu měly až 16 vstupů do programovatelného pole AND a
součtové bloky s osmi vstupy schopné realizovat funkce až o osmi termech
FEKT Vysokého učení technického v Brně
30
v jednoprůchodovém zapojení. První obvody byly ryze kombinační, s možností použití
třístavového výstupu. Teprve později výrobci přidali u obvodů některých řad na výstupy
součtových členů také klopné obvody. To umožnilo realizovat pomocí těchto obvodů
jednoduché synchronní sekvenční systémy (např. čítače).
Postupným vývojem těchto obvodů vznikly obvody, které měly na výstupu součtových
členů tzv. výstupní makrobuňku (OLMC; Output Logic MacroCell), která umožnila
konfigurovat každý výstup nezávisle jako kombinační, sekvenční nebo třístavový. Novější
obvody SPLD byly realizovány technologií EPROM (později i EEPROM) a byly tedy
reprogramovatelné. To značně zvýšilo jejich užitnou hodnotu a popularitu. S jejich oblibou
přirozeně rostl zájem o větší obvody tohoto typ. Původní myšlenkou, která respektovala tuto
snahu realizovat více logických funkcí na jednom čipu, bylo rozšíření stávajícího pole AND,
zvětšení počtu vstupů i výstupů a zvětšení počtu termů každé makrobuňky. Výsledkem této
snahy byly obvody, které se ukázaly jako příliš neefektivní a pomalé, proto byla tato cesta
opuštěna.
V roce 1984 firma Altera představila obvod, který byl založen na obvodech SPLD a
dokázal realizovat podstatně složitější funkce. Jeho základem bylo několik malých obvodů
SPLD, které byly navzájem propojeny pomocí programovatelné propojovací struktury (někdy
zvané přepínací matice). Tím vzniklo jakési pole obvodů SPLD, a takové obvody se začaly
označovat jako komplexní PLD, tedy CPLD (Complex PLD).
Z hlediska architektury jde o koncept velmi podobný obvodům FPGA: pole
programovatelných buněk, které je doplněno programovatelnou propojovací strukturou.
Rozdíl je ale ve velikosti elementární buňky, tedy ve složitosti kombinační logické funkce,
kterou buňka dokáže realizovat (Obr. 12). Obvod FPGA je založen na LUT, které mají
typicky 4-6 vstupů, mají tudíž poměrně malé zpoždění, ale pro složitější funkce je nutné
zřetězit více LUT. Elementární buňka CPLD má výrazně větší počet vstupů a většinu běžných
funkcí tak lze realizovat jedním průchodem. Cenou za to je fakt, že jednoduché funkce jsou
implementovány neefektivně, jelikož většina makrobuňky zůstává nevyužita.
Generátor
logické
funkce
CPLD
FF
FF
vstupy
vstupy
FPGA
Obr. 12
Generátor
logické funkce
Základní rozdíl mezi obvody FPGA a CPLD.
Z hlediska velikosti elementárních buněk se někdy v souvislosti s konfigurovatelnými
číslicovými obvody zavádí pojem granularita, který slouží k vyjádření relativní velikost
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
31
buněk různých architektur integrovaných obvodů. FPGA se pak označují jako obvody
s jemnozrnnou strukturou (fine grain) a CPLD jako obvody s hrubozrnnou strukturou (coarse
grain). V praxi se ale často podobně srovnávají CPLD a FPGA navíc například se
strukturovanými obvody ASIC. Při takovém porovnání se FPGA označují jako obvody se
střední velikostí základní buňky (medium grained) a strukturované obvody ASIC jako
jemnozrnné. Granularita je tedy relativní metrika, která je pouze orientační.
Číslicové systémy implementované do CPLD jsou dnes popisovány a implementovány
stejnými nástroji, jaké se používají pro implementaci číslicových systémů do FPGA. Rozdíl
v použití jednoho či druhého typu obvodu bývá určen především velikostí obvodu, který
chceme implementovat. Obvody CPLD jsou schopny pojmout pouze relativně malé číslicové
systémy. Dalším aspektem je volatilita, tedy schopnost uchovat konfiguraci
v programovatelné struktuře i při odpojení napájecího napětí. Většina obvodů CPLD je na
rozdíl od většiny FPGA nevolatilní, CPLD jsou tedy ihned po zapnutí funkční, a pro mnoho
aplikací tedy vhodnější.
Obvody CPLD již několik let neprocházejí dalším vývojem a začínají ustupovat do
pozadí. Jejich místo přebírají malé obvody FPGA vyráběné nevolatilní (FLASH) technologií.
Takové obvody někteří výrobci stále označují jako CPLD, ale jde spíše o zjednodušené
vyjádření faktu, že jsou to malé nevolatilní obvody PLD. Výhodou použití struktury FPGA je,
že pro návrh systémů s takovými obvody lze použít identické nástroje, jako pro návrh
systémů s klasickými obvody FPGA (obvody CPLD přeci jen mají svá specifika).
Tento trend bude zřejmě sledovat většina výrobců obvodů CPLD, kteří mají ve svém
portfoliu i obvody FPGA. Z dnešního pohledu je tak velmi pravděpodobné, že klasické
obvody CPLD postupně z trhu zmizí.
3.2 Logické buňky obvodů FPGA a jejich využití
Jak bylo výše uvedeno (Obr. 6), tvoří základní strukturu FPGA pole programovatelných
logických buněk, programovatelná propojovací struktura a programovatelné vstupně/výstupní
buňky. Tyto prvky, původně primitivní, se postupem času vyvíjely a v dnešní době nabízejí
řadu funkcí, které výrazně zvyšují efektivitu implementace číslicových systémů v FPGA.
Samotná LUT je tvořena pamětí, proto bylo logickým krokem výrobců FPGA přidat
k této paměti pomocné vstupy a výstupy, které umožnily použít ji nejen jako logický
generátor, ale také jako malou paměť typu RAM nebo ROM. Takto realizovaná paměť se
označuje jako distribuovaná paměť RAM (distributed RAM). Ukázka takové paměti je na
Obr. 13. Jedna čtyřvstupá LUT realizuje paměť o velikosti 16 x 1 b. Použitím více LUT lze
realizovat paměti větší, navíc v různé konfiguraci – na obrázku je uveden příklad realizace
paměti 16 x 4 b ze čtveřice LUT. Obdobně lze čtveřicí LUT realizovat paměť 64 x 1 b, ale to
již vyžaduje použití dalších logických buněk pro realizaci výstupního multiplexoru.
Distribuovaná paměť je velmi efektivní nástroj pro realizaci malých pamětí. Paměť o
velikosti 1024 bitů lze realizovat pomocí 16 LUT tabulek se šesti vstupy, tedy pomocí 16
základních buněk FPGA (Obr. 7). Pokud bychom stejnou paměť realizovali pomocí klopných
obvodů, bylo by nutné použít 1024 těchto buněk. Pro větší paměťové struktury se ale tento
způsob implementace nehodí, neboť jde o relativně neefektivní implementaci (z hlediska
plochy čipu potřebné na implementaci jednoho bitu). Řešením je použití tzv. blokových
pamětí RAM (6.1).
FEKT Vysokého učení technického v Brně
32
16 x 1b
Data
16 x 1b
Adresa
LUT4
(16 x 1b)
paměť 16 x 1b (16b)
Obr. 13
16 x 1b
Data
Adresa
16 x 1b
paměť 16 x 4b (64b)
Použití LUT jako distribuované paměti RAM/ROM.
Z hlediska implementace lze použití distribuované paměti provést několika způsoby:
 Popis pamětí HDL kódem a následné automatické rozpoznání paměťové
struktury implementačními nástroji.
 Použití speciálních předdefinovaných entit ve spojení se strukturálním popisem
nebo schematickým návrhem.
 Použití průvodce (wizard) pro vytvoření vlastní nové entity a následné využití
strukturálního nebo schematického popisu.
První způsob použití pomocí HDL kódu je naznačen pomocí níže uvedeného
zdrojového kódu. Jeho výhodou je především portabilita kódu (nezávislost na vývojovém
prostředí a cílové platformě) a možnost implementace pamětí s libovolným uspořádáním.
Moderní implementační nástroje dokáží automaticky rozpoznat paměť i její typ (RAM/ROM)
a provést její co nejefektivnější implementaci, a dokonce dokáží rozhodnout, zda je vhodnější
paměť implementovat jako distribuovanou, nebo blokovou (BRAM; 6.1). Bloková paměť
RAM ale na rozdíl od distribuované neumožňuje implementovat operaci asynchronního čtení.
Ta je v uvedeném kódu realizována výstupem D_out, který použití BRAM znemožňuje.
V případě, že tento výstup odstraníme, může systém zvolit pro implementaci i pomocí
blokových pamětí.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--------------------------------------------------------ENTITY RAM_64x8 IS
PORT (clk
: IN STD_LOGIC;
WR
: IN STD_LOGIC;
ADDR
: IN STD_LOGIC_VECTOR (5 DOWNTO 0);
D_in
: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
D_out
: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
D_out_reg : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END RAM_64x8;
--------------------------------------------------------ARCHITECTURE Behavioral OF RAM_64x8 IS
-- deklarace pameti a jeji inicializace
TYPE RamType IS ARRAY (0 TO 63) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ram_1 : RamType := (X"78", X"76", X"30", OTHERS => X"00");
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
33
--------------------------------------------------------BEGIN
-- zapis dat
RAM_write_proc : PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
IF WR = '1' THEN
ram_1(TO_INTEGER(UNSIGNED(ADDR))) <= D_in;
END IF;
END IF;
END PROCESS RAM_write_proc;
-- asynchronni cteni dat
D_out <= ram_1(TO_INTEGER(UNSIGNED(ADDR)));
-- synchronni cteni dat
RAM_read_proc : PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
D_out_reg <= ram_1(TO_INTEGER(UNSIGNED(ADDR)));
END IF;
END PROCESS RAM_read_proc;
--------------------------------------------------------END Behavioral;
Druhé dva způsoby popisu jsou vázány vždy na cílovou platformu a často i na konkrétní
návrhový systém. Níže je uveden příklad instanciace bloku RAM16X1D_1, který představuje
jednu čtyřvstupou LUT tabulku použitou jako paměť RAM. Tento kód lze použít ve
strukturálním popisu VHDL. Návrhové systémy obvykle obsahují i ekvivalentní schematické
symboly, které lze použít v grafickém popisu číslicového obvodu. Takové komponenty jsou
vázány na konkrétní rodinu obvodů FPGA, portabilita kódu je tedy omezená. Vytváření
větších pamětí je komplikované, ale dává designérovi plnou kontrolu nad vytvářeným
číslicovým systémem.
RAM16X1D_1_i : RAM16X1D_1
GENERIC MAP(
INIT => X"0000")
PORT MAP(
DPO
=> DPO,
-- Read-only 1-bit data output for DPRA
SPO
=> SPO,
-- R/W 1-bit data output for A0-A3
A0
=> A0,
-- R/W address[0] input bit
A1
=> A1,
-- R/W address[1] input bit
A2
=> A2,
-- R/W address[2] input bit
A3
=> A3,
-- R/W ddress[3] input bit
D
=> D,
-- Write 1-bit data input
DPRA0 => DPRA0,
-- Read-only address[0] input bit
DPRA1 => DPRA1,
-- Read-only address[1] input bit
DPRA2 => DPRA2,
-- Read-only address[2] input bit
DPRA3 => DPRA3,
-- Read-only address[3] input bit
WCLK => WCLK,
-- Write clock input
WE
=> WE);
-- Write enable input
Poslední možností pro vytvoření distribuované paměti je použít průvodce (wizard),
který umožňuje realizovat různě velké paměti optimalizované pro cílový obvod FPGA. Takto
lze snadno realizovat paměti různé velikosti bez nutnosti spoléhat se na schopnosti
návrhového systému extrahovat paměti z obecného popisu pomocí HDL. Použití takto
vytvořených komponent je možné pomocí strukturálního popisu nebo schématu. Opět dochází
k vazbě na cílovou platformu (v tomto případě dokonce konkrétní typ a velikost FPGA) a
navíc vždy na konkrétní návrhový systém.
FEKT Vysokého učení technického v Brně
34
Další možné využití LUT je založeno na faktu, že paměť tvořící LUT, je v podstatě
souborem registrů (čtyřvstupá LUT je složena z 16 registrů). Jejich vhodným propojením tak
lze jednoduše získat posuvný registr o maximální délce odpovídající počtu buněk LUT
(typicky tedy 16 nebo 64; Obr. 14).
MUX
Q
...
D_in
D_out
clk
adr
Obr. 14
Využití LUT pro realizaci posuvného registru proměnné délky.
Použití takového posuvného registru v designu je podobné, jako použití distribuované
paměti RAM: vhodným HDL kódem (viz níže) nebo instanciací předdefinované komponenty,
respektive jejím použitím ve schematickém popisu.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--------------------------------------------------------ENTITY ShReg_16x8b IS
PORT (clk
: IN STD_LOGIC;
addr
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
D
: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
CE
: IN STD_LOGIC;
Q15
: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
Q
: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ShReg_16x8b;
--------------------------------------------------------ARCHITECTURE Behavioral OF ShReg_16x8b IS
-- deklarace posuvneho registru
TYPE t_ShReg IS ARRAY (15 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL Shift_reg : t_ShReg := (X"22", X"11", OTHERS => X"00");
--------------------------------------------------------BEGIN
-- posun registru
ShRegProcess : PROCESS (CLK) BEGIN
IF rising_edge(CLK) THEN
IF CE = '1' THEN
Shift_reg <= Shift_reg(14 DOWNTO 0) & D;
END IF;
END IF;
END PROCESS ShRegProcess;
-- vystupni signal celeho posuvneho registru
Q15 <= Shift_reg(15);
-- vyber vystupniho signalu (volba zpozdeni registru)
Q <= Shift_reg(TO_INTEGER(UNSIGNED(addr)));
--------------------------------------------------------END Behavioral;
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
35
Takto realizovaný posuvný registr nedovoluje přímý přístup k jednotlivým buňkám,
provádět operaci nulování ani načtení dat (set, reset, load). Pokud je některá z těchto funkcí
v kódu použita, nemůže návrhový systém pro realizaci posuvného registru LUT použít.
Ne všechny FPGA umožňují realizovat distribuovanou paměť a posuvný registr v LUT.
I obvody, které tyto realizace umožňují, se ale většinou skládají ze dvojice typů buněk, které
jsou na čipu většinou zastoupeny v poměru 1:1. Část buněk umožňuje realizovat alternativní
funkce LUT, část nikoliv. Buňky, které alternativní funkci neumožňují, zabírají menší plochu
na čipu a podílejí se na zvýšení efektivity využití čipu. Motivací k tomuto kroku je fakt, že
drtivá většina designů nevyužívá většinu buněk alternativním způsobem. Přesto lze
v dnešních největších obvodech FPGA realizovat distribuované paměti o velikosti až desítek
megabitů.
3.3 Vlastnosti vstupně/výstupních buněk
Současné FPGA mají vstupně/výstupní (I/O) buňky, které obsahují řadu pokročilých
bloků (subsystémů). Jejich původní hlavní úkol, tedy bezpečně připojit vnitřní
programovatelnou logickou strukturu k vnějším signálům, je dnes zastíněn množstvím funkcí,
které umožňují realizovat.
Pro přenos signálů mezi integrovanými obvody i celými systémy se dnes používá řada
standardů. Standardy TTL a CMOS, používané v době vzniku prvních integrovaných obvodů
řad 74 a 4000, mají definovánu logickou úroveň 1 napětím 5 V a logickou úroveň 0 pak 0 V.
Tyto hodnoty napětí jsou samozřejmě pouze zjednodušeným vyjádřením skutečných
parametrů logických obvodů pracujících s těmito standardy. Standard CMOS například
stanovuje, že výstupní napětí budiče generujícího logickou úroveň 1 musí být v rozsahu 2,4 až
5 V. Vstup obvodu TTL pak musí být schopen interpretovat jako logickou úroveň 1 signál o
napětí v rozsahu 2,0 až 5,0 V.
Moderní logické standardy využívají podstatně menší úrovně napětí, což umožňuje
zvýšit přenosovou rychlost, snížit spotřebu a zmenšit rušení, které taková rozhraní generují.
Použitý standard také souvisí s konkrétní aplikací (např. DDR paměti mají stanovené
standardy) a napájecím napětí integrovaného obvodu. Nelze například předpokládat, že obvod
napájený napětím 1,8 V bude schopen generovat signál s logickými úrovněmi odpovídajícími
standardu TTL. Nejběžněji se dnes u jednovodičových vedení (signálových cest) setkáme se
standardy LVTTL, s napájecím napětím 3,3 V, a LVCMOS s napájecím napětím 3,3 V, 2,5 V,
1,8 V, 1,5 V nebo 1,2 V. Pro přenos rychlých signálů (typicky pro komunikaci s pamětmi
DDR SDRAM) se používají různé varianty standardu HSTL (High-Speed Transceiver Logic)
a SSTL (Stub Series Terminated Logic) pracujících s napájecím napětím v rozmezí 1,2 V až
3,3 V, které již předpokládají použití kontrolovaných impedancí výstupů budičů, vedení i
vstupů obvodů.
Pro vyšší přenosové rychlosti (nad cca 200 Mb/s na jeden signál) se dnes téměř
výhradně používají dvojvodičová vedení, tzv. diferenční páry. Takové vedení je tvořeno
dvojicí vodičů s kontrolovanou impedancí, které jsou vedeny v těsné blízkosti (ukázka
realizace takového vedení na plošném spoji je Obr. 15). Jednotlivé vodiče páru se obvykle
označují jako P a N. Logická úroveň 1 nebo 0 pak není dána velikostí napětí na vodiči vůči
společnému potenciálu (zemi), ale rozdílem napětí mezi vodiči. Pokud je napětí na vodiči P
větší, než na vodiči N, pak je přenášena logická úroveň 1, a naopak. Základní výhodou tohoto
uspořádání ve srovnání s jednovodičovým vedením je podstatně vyšší odolnost vůči
souhlasnému rušení. Ta je dána tím, že vnější rušení působí souhlasně na vodiče, které jsou
vedeny ve vzájemné těsné blízkosti. Toto rušení se projeví jako současná změna stejné
FEKT Vysokého učení technického v Brně
36
velikosti potenciálů obou vodičů. Rozdíl jejich potenciálů, který je nositelem informace, ale
zůstane zachován. Toto uspořádání zároveň snižuje vyzařování elektromagnetického rušení
do okolí.
Obr. 15
Ukázka použití diferenčních vedení na desce plošných spojů.
Tyto faktory umožňují pro přenos informace použít podstatně menší rozdíl napětí pro
vyjádření logické 0 a 1. To dále snižuje úroveň vyzařování elektromagnetického rušení a také
spotřebu. Tak lze přenášet velmi rychlé binárně kódované signály v základním pásmu a to až
do přenosových rychlostí několika desítek gigabitů za sekundu. Mezi nejběžněji dnes
používané standardy pro komunikaci po diferenčním páru patří různé varianty standardu
LVDS, dále CML, LVPECL a diferenční verze standardů pro komunikaci s pamětmi (HSTL a
SSTL)
Jádra obvodů FPGA dnes pracují s velmi malým napájecím napětím (typicky 0,9 V až
1,5 V, podle typu cílového obvodu). Nízké napětí umožňuje jádru pracovat s nižší spotřebou a
vyšším pracovním kmitočtem, než by tomu bylo při vyšším napájecím napětí. Většina
standardů fyzických rozhraní ale potřebuje pro korektní funkci vyšší napětí. Proto jsou
vstupně/výstupní buňky obvodů FPGA vybaveny samostatným napájecím vstupem, jehož
konkrétní hodnotu napětí volíme podle standardu zvoleného pro přenos signálů. FPGA
v systému často komunikují s řadou dalších zařízení (integrovaných obvodů) pomocí
standardů, jejichž napěťové úrovně se navzájem odlišují. Proto je nutné I/O buňky v rámci
jednoho FPGA napájet různým napětím. Z tohoto důvodu jsou I/O buňky rozděleny do
skupin, typicky po 20-40 (jedna buňka = jeden I/O pin FPGA), které mají společné napájecí
napětí a některé další vlastnosti. Velké FPGA dnes mají běžně i přes 10 I/O bank.
Zjednodušená struktura I/O buňky moderního obvodu FPGA je zobrazena na Obr. 16.
V levé části jsou vstupy a výstupy buňky, které zajišťují její vazbu na programovatelnou
strukturu pole. Výstupní část obsahuje blok ODDR, což je obvod podporující výstup dat
technologií DDR (Dual Data Rate). Tento blok lze použít také jako klasický klopný obvod
(SDR; Single Data Rate). Blok také může zůstat nevyužitý a signál do programovatelného
výstupního zesilovače může vstupovat přímo z programovatelného hradlového pole. Za
blokem ODDR následuje programovatelný výstupní zesilovač (output buffer). Ten převádí
signál, který má logické úrovně odpovídající jádru FPGA na signál, který má logické úrovně
požadované obvody vně FPGA. Logické úrovně výstupního signálu jsou dány vstupním
napájecím napětím příslušné banky (VCCO) a konfigurací FPGA (na základě omezujících
podmínek). Programovatelný výstupní zesilovač může svůj výstup nastavit i do stavu vysoké
impedance, který umožňuje příslušnou buňku použít jako vstupní. Pro ovládání funkce
třístavového výstupu je I/O buňka vybavena dalším dedikovaným blokem ODDR. Výstupní
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
37
zesilovač má obvykle také programovatelnou rychlost přeběhu (slew rate), která umožňuje
snížit strmost hran (a tím elektromagnetické rušení) u méně kritických signálů, jako jsou
výstupy pro LED diody a podobně. Často se lze setkat i s funkcí řízení výstupního proudu,
kdy lze například nastavit proud v několika diskrétních rozsazích v rozmezí od 2 do 24 mA.
Tyto vlastnosti bývají dostupné pouze pro některé logické standardy (typicky LVCMOS a
LVTTL).
Za výstupním zesilovačem může být zařazen blok ODELAY, který slouží ke zpoždění
signálu. Toto zpoždění bývá programovatelné, může se dynamicky měnit a často se využívá
ke kompenzaci různé elektrické délky vedení na plošném spoji.
VCCO
Výstupní část
Keeper
I/O PIN
P
ODELAY
ODDR
DCI
pull
ESD
ODDR
Programovatelný
výstupní zesilovač
sousední
I/O PIN
IDELAY
N
IDDR
Vstupní část
Obr. 16
Zjednodušené schéma vstupně/výstupní buňky obvodu FPGA.
Následuje blok označený DCI (Digitally Controlled Impedance), který umožňuje
realizovat impedanční zakončení signálních vedení přímo na čipu a to jak na straně vstupu,
tak výstupu. Tradičně se zakončovací rezistory umisťují na plošný spoj co nejblíže vstupů,
případně i výstupům příslušného obvodu (podle typu vedení). Pokud je třeba přivést velké
množství takových signálů do integrovaného obvodu, bylo by potřebné množství rezistorů na
desce plošných spojů příliš velké a často by ani nebylo možné je umístit dostatečně blízko
příslušným vstupům a výstupům. Proto se dnes tyto rezistory realizují uvnitř integrovaných
obvodů. Nevýhodou takového zakončení je, že FPGA umožňují realizovat pouze tzv.
rozdělené zakončení (split termination), označované také jako ekvivalentní Theveninovo
zakončení, které vykazuje vyšší statickou spotřebu, než tzv. paralelní zakončení. Hodnota
zakončovací impedance navíc mívá poměrně velkou toleranci, i když novější FPGA již mají
zabudovaný obvod sloužící k přesné kalibraci hodnoty interních rezistorů, který využívá
externí přesný referenční rezistor připojený na dedikovaný vstup příslušné banky.
38
FEKT Vysokého učení technického v Brně
Většina obvodů FPGA dnes umožňuje připojit na pin FPGA rezistory upínající
vstup/výstup k napájecímu napětí nebo zemi (pull-up, pull-down). Tyto rezistory mají
poměrně velkou hodnotu a tvoří tak poměrně slabé upnutí (weak pull-up/down), ale pro
mnoho aplikací jsou vyhovující. Dalším obvodem je blok pro zachování poslední známé
hodnoty (keeper), který upíná linku do stavu log. 1 nebo 0 podle toho, v jakém stavu se
naposledy nacházela. Tyto obvody dokáží zajistit, že i při ponechání vstupu ve stavu vysoké
impedance je vstupní komparátor schopen jednoznačně určit logickou hodnotu 0 nebo 1, a
nehrozí tak vznik metastabilit na jeho výstupu.
Každý pin je vybaven také základní ESD (Electrostatic Discharge) ochranou v podobě
dvojice diod. Pokud se na pinu objeví příliš vysoké nebo příliš nízké napětí, je odvedeno přes
diody do napájecí nebo zemní větve a neohrozí tak zbývající část FPGA. Ochranné diody jsou
dimenzovány pouze na malé proudy (desítky mA) a krátkodobé zatížení, neměly by být
používány jako aktivní obvodové prvky. Lze je ale využít například při kontrole zapájení
pouzder FPGA: každý signál plošného spoje připojený k jeho pinu by měl být přes tyto diody
spojen se zemním a napájecím signálem, což lze ověřit vhodným měřicím přístrojem
(multimetr).
Vstupní část I/O buňky obsahuje podobné bloky, jako výstupní část. Samotný vstup je
tvořen komparátorem, který může pracovat buď s interní referencí (standardy LVTTL,
LVCMOS...), externí referencí nebo jako diferenční komparátor, který využívá také sousední
pin pro realizaci vstupu diferenčního páru. Za komparátorem je možné použít blok realizující
programovatelné zpoždění, který opět slouží primárně pro kompenzaci elektrické délky
signálů sběrnic. Signál pak může vstupovat přímo do programovatelného hradlového pole
nebo může být zpracován dedikovaným klopným obvodem (IDDR), který může pracovat jak
v režimu SDR, tak DDR.
I/O buňky moderních obvodů obsahují řadu dalších prvků, které dále rozšiřují možnosti
a zjednodušují použití obvodů FPGA. Jsou to například zabudované synchronní serializéry /
deserializéry (SERDES), které umožňují realizovat rozhraní s přenosovou rychlostí dosahující
až 2 Gb/s na jeden pin. Taková rozhraní se dnes používají například pro komunikaci
s pamětmi typu DDR3.
Důležitým parametrem, který je třeba sledovat u obvodů FPGA, je počet zároveň se
měnících výstupů (Simultaneous Switching Outputs; SSO). Tento parametr určuje, kolik
výstupů dané banky může v jeden okamžik měnit stav, aniž by došlo k překročení /
nedodržení parametrů daných katalogovým listem příslušného obvodu. Tento parametr
obvykle závisí na zvolených parametrech výstupu, tedy rychlosti přeběhu, výstupním proudu
a především konkrétním logickém standardu.
3.4 Konfigurace obvodů FPGA
Moderní FPGA jsou natolik složitá, že je nelze konfigurovat jinak, než s využitím
pokročilých nástrojů EDA. Proces návrhu a implementace se velmi podobá způsobu, který je
použit pro obvody ASIC. Návrh je prováděn pomocí komplexních systémů, které slouží jak
pro tvorbu návrhu (design capture), tak pro verifikaci, implementaci, programování a
testování fyzické realizace. Přední výrobci obvodů FPGA takový systém nabízí většinou
zdarma ke stažení. Ten bývá omezen na menší a méně výkonné obvody a disponuje pouze
některými vlastnostmi. Placená verze pak umožňuje pracovat i s velkými FPGA a disponuje
různými pokročilými nástroji. Všechny tyto nástroje jsou ale omezeny na FPGA příslušného
výrobce.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
39
Existuje řada dalších nástrojů určených pro FPGA, které jsou vyvíjeny firmami, které se
samy nezabývají výrobou FPGA (tzv. third party vendors). Nástroje těchto firem jsou
prakticky vždy placené a většinou podporují FPGA od více výrobců. Tyto nástroje poskytují
především firmy zabývající se vývojem nástrojů pro obvody ASIC, proto lze v takových
nástrojích najít řadu pokročilých funkcí a modulů, především v oblasti verifikace designu.
Pro popis (návrh, design) číslicových systémů se dnes používají především speciální
HDL (Hardware Description Language) jazyky, kterým je věnována kapitola 2., a pro
hierarchický návrh se používají schémata, která výrazně zpřehledňují navrhovaný systém a
zároveň často slouží jako část dokumentace. Dále existují některé speciální techniky popisu,
jako jsou stavové diagramy, tzv. IP jádra (kapitola 6) a další, jako například generování HDL
kódu přímo z prostředí Matlab/Simulink.
Vytváření popisu číslicového systému uvedenými metodami se obecně považuje za
hlavní činnost při jejich návrhu. Vzhledem k rostoucí složitosti systémů je ale stále více času
nutné věnovat také verifikaci tohoto návrhu. Především v oblasti obvodů ASIC je tento trend
markantní a uvádí se, že čas (vynaložené úsilí) strávený verifikací tvoří typicky 60-80% času
návrhu, kdežto návrh samotný pak zbývajících 20-40%. V případě obvodů ASIC je to
nezbytné, neboť tímto způsobem lze výrazně omezit tzv. respin, tedy opakovanou výrobu
prototypů čipu. Tu je nutné provést, pokud byla v návrhu čipu chyba. Vzhledem k extrémní
finanční a časové náročnosti respinu je třeba tyto chyby eliminovat, a proto je prováděna
důkladná verifikace. U obvodů FPGA podobné nebezpečí nehrozí. V případě, že jsou
v návrhu chyby, lze je jednoduše opravit v kódu a opětovným spuštěním implementace a
přeprogramováním FPGA odstranit.
Návrh
Behaviorální
simulace
Syntéza
Formální
verifikace
Implementace
Statická časová
analýza
Programování
Ověření v
systému
Produkce
Obr. 17
Postup implementace číslicového systému do obvodu FPGA.
Moderní FPGA jsou ale velmi rozsáhlé a proces implementace může trvat i desítky
hodin. Navíc funkci některých bloků často nelze spolehlivě ověřit za běhu zařízení, ale pouze
simulací. Proto roste význam verifikace i v oblasti obvodů FPGA. Obecně se doporučuje pro
každý zdrojový kód (HDL, schéma…) v hierarchii návrhu vytvořit i testovací modul
(testbench), který ověří funkčnost příslušného zdrojového kódu.
FEKT Vysokého učení technického v Brně
40
Proces implementace číslicových obvodů do FPGA má posloupnost uvedenou na Obr.
17. Prvním krokem je návrh, což je vytvoření syntetizovatelného popisu systému na základě
specifikace. Tento popis je poté verifikován pomocí funkční (behaviorální) simulace. Tato
simulace bere v potaz pouze ideální logické funkce, nikoliv reálné časové parametry
implementovaného obvodu. Může ale brát v potaz reálné časové parametry externích
rozhraní, pokud jsou známé a pokud je to žádoucí. V případě, že behaviorální simulace
prokáže chyby v návrhu, je třeba proces návrhu opakovat úpravou zdrojových kódů.
Jakmile je funkční simulace v pořádku, lze přistoupit k procesu syntézy (Obr. 18).
Syntéza je proces, při kterém program (syntetizér, synthesis tool) převede veškeré zdrojové
kódy do zapojení elementárních logických buněk, jako jsou hradla AND, OR, XOR, klopné
obvody a makrobloky. Zároveň probíhá optimalizace navrženého číslicového obvodu a to jak
na úrovni booleovských rovnic, tak z hlediska vyloučení duplicitních bloků, volby vhodného
kódování pro stavové automaty atd. Výsledné schéma zapojení se nazývá RTL netlist
(Register Transfer Logic).
Syntéza číslicových systémů je dnes považována za dobře zvládnutou problematiku,
nicméně z hlediska psaní zdrojových kódů je nutné dodržovat určitá pravidla. Ne každý kód,
který je funkční v simulaci, lze také syntetizovat (viz kapitola 2). Syntetizéry nezpracovávají
zdrojové kódy v HDL jazycích „doslova“, ale snaží se v nich najít typické (známé) struktury.
Jakmile syntetizér takovou strukturu v kódu rozpozná, dokáže ji implementovat a často navíc
velmi efektivně optimalizovat (například čítače). Proto je nutné dodržovat pravidla uvedená
v dokumentaci syntetizéru. Ta obvykle obsahuje doporučený způsob popisu běžných
číslicových subsystémů, jako jsou čítače, stavové automaty, posuvné registry, paměti a
podobně.
ENTITY prepinac IS PORT(
a,b,c:
IN STD_LOGIC;
volba:
IN STD_LOGIC_VECTOR(1 DOWNTO 0);
y:
OUT STD_LOGIC);
END prepinac;
ARCHITECTURE Behavioral OF prepinac IS BEGIN
y <= a WHEN volba = "00" ELSE
b WHEN volba = "01" OR volba = "10" ELSE
c;
END Behavioral;
RTL Netlist
Syntetizér
Obr. 18
Princip syntézy číslicových obvodů z abstraktního popisu.
V ideálním případě je funkce syntetizovaného RTL schématu identická, jako funkce
designu zachyceného pomocí HDL jazyků, hierarchických schémat a dalších nástrojů. V praxi
se ale může stát, že nevhodným popisem nebo nedokonalostí syntetizérů dojde k odchylkám
ve funkci designu, které mohou ve výsledku znamenat chybnou funkci navrženého zařízení.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
41
Proto se někdy přistupuje k simulaci i v tomto bodě (především při návrhu obvodů ASIC). K
simulaci RTL netlistu lze využít stejné testovací soubory, jako pro simulaci HDL kódů.
Simulace je ale v tomto případě časově mnohem náročnější, neboť systém je modelován na
nižší úrovni (větším počtem elementárních prvků). Proto se pro kontrolu RTL netlistu často
používají speciální nástroje, které provádí tzv. formální verifikaci (formal verification; [10]).
Formální verifikace je založena na zjišťování ekvivalence dvojice popisů pomocí vhodného
algoritmu. Existuje řada algoritmů, které se liší rychlostí a spolehlivostí verifikace. Mezi
nejběžnější patří metody založené na kontrole ekvivalence (Equivalence Checking), které jsou
realizovány například jako Binary Decision Diagram nebo pomocí Statisfiability solverů.
Tyto metody jsou sice spolehlivé, ale neefektivní, proto se hledají nové metody verifikace,
jako například Model Checking, Bounded Model Checking a metody hybridní formální
verifikace.
Pokud RTL schéma nesplní test formální verifikace, je třeba znovu upravit zdrojové
kódy, případně i nastavení syntetizéru. Pokud je RTL netlist v pořádku, lze přikročit
k procesu implementace. Doposud byl postup do značné míry nezávislý na cílové platformě
(FPGA nebo ASIC). Zjednodušeně lze říci, že stejný RTL popis lze přímo použít pro
implementaci jak pro FPGA, tak pro obvody ASIC. Další uvedené kroky již budou specifické
pro FPGA.
Syntetizované schéma obsahuje logické obvody, které z valné části nemají fyzické
ekvivalenty ve struktuře cílového obvodu FPGA. Typicky jde o elementární kombinační
hradla, která se v FPGA realizují pomocí LUT. Proto je nutné provést proces tzv. mapování,
který převede RTL schéma na zapojení prvků, které již v FPGA dostupné jsou. Výsledkem
této operace je schéma (někdy označované jako technologické), jehož příklad je na Obr. 19.
Na rozdíl od RTL schématu neobsahuje kombinační logické buňky v podobě elementárních
hradel, ale v podobě LUT.
Obr. 19
Ukázka výsledku procesu mapování – výřez technologického schématu.
Zároveň s tvorbou technologického schématu jsou zohledněny požadavky na fyzické
rozmístění signálů na vývody FPGA a požadavky na časové parametry vnitřních signálů a
vstupně/výstupních signálů. Souhrnně se tyto tzv. omezující podmínky nazývají constraints.
FEKT Vysokého učení technického v Brně
42
Nyní je třeba vybrat vhodné lokace jednotlivých komponent na čipu FPGA (proces
Place). Cílem je rozmístit komponenty tak, aby jejich následné propojení bylo co
nejefektivnější (obvyklým obecným kritériem je minimální délka spojů. To ale nelze
aplikovat globálně, neboť globálně optimální řešení (minimální celkové zpoždění) by
s vysokou pravděpodobností vedlo na řešení, v němž bude mít několik spojů zpoždění větší,
než dovolené. U kritických bloků designu, kde lze již při jejich návrhu předpokládat, že
splnění požadavků na časové parametry bude kritické, lze pomocí omezujících podmínek
některým buňkám umístění přiřadit. Toto umístění může být buď fixní (s ohledem na cílový
obvod) nebo relativní (vzhledem k dalším buňkám). V jednodušších případech se proces
rozmístění ponechává zcela na návrhovém systému.
Většina nástrojů umožňuje prostřednictvím grafického editoru rozmisťovat buňky
ručně, případně jejich pozici korigovat po automatickém rozmístění. Na Obr. 20 je ukázka
grafického rozhraní takového programu, na níž je výřez designu, který již prošel procesem
Place. Na obrázku jsou patrné základní bloky čipu FPGA, byť nejsou v reálném měřítku ani
vzájemné poloze. Samotné logické buňky jsou v tomto zobrazení velmi malé. Využité buňky
mají modrou barvu, nevyužité pak černou. Většinu plochy zobrazení zabírá programovatelná
propojovací struktura, která je tvořena lokálními spoji (šedá barva), globálními spoji
(purpurová) a přepínacími maticemi, které slouží ke vzájemnému propojení vodivých cest a
logických buněk. Logické buňky jsou v tomto kroku propojeny jen virtuálními vzdušnými
vodiči (air wires) naznačenými na obrázku zelenou barvou. Jde o ekvivalent vzdušných spojů
známých z oblasti návrhu plošných spojů. Tyto vodiče informují návrháře o tom, které buňky
mají být vzájemně propojeny a měly by tedy být umístěny co nejblíže u sebe.
programovatelná přepínací matice
využitá logická buňka
globální propojovací struktura
lokální propojovací struktura
nevyužitá logická buňka
Obr. 20
Rozmístění buněk technologického schématu na čipu FPGA.
Jakmile je proveden proces rozmístění (place), může být spuštěn proces automatického
propojení buněk (route), tedy převedení vzdušných spojů do fyzické podoby s využitím
programovatelné propojovací struktury. Ukázka výsledku procesu propojení je na Obr. 21 a
představuje v podstatě hotový návrh FPGA.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Obr. 21
43
Výsledek procesu Place and Route – rozmístěné a propojené buňky
technologického schématu.
Proces rozmístění a proces propojení buněk se často považuje za jediný proces,
označovaný jako Place and Route, pro nějž se pak běžně používá zkratka PAR (případně
P&R). Moderní FPGA jsou natolik rozsáhlá, že problém rozmístění a propojení prvků na čip
má obrovský počet stupňů volnosti, tj. obrovský počte možností. Proto se do těchto procesů
vkládají náhodné prvky, které při každém jejich novém spuštění nastaví jiné výchozí
podmínky. Tím může být výsledek každé iterace jiný, čehož se využívá při hledání
optimálního rozmístění a propojení při implementaci systémů, u kterých jsou požadované
časové parametry na mezi cílového obvodu FPGA (obtížně splnitelné omezující podmínky,
typicky mezní pracovní frekvence).
Uvádí se, že z hlediska splnění časových parametrů, má přibližně 80% podíl na
výsledku proces rozmístění buněk (place) a pouze 20% jejich propojení (route). Pokud tedy
implementovaný design nesplňuje požadované časové parametry, je efektivnější provést
znovu proces rozmístění buněk. Implementační nástroje navíc obvykle umožňují zvolit,
s jakým úsilím (effort) mají tyto dva procesy probíhat. Pokud je nastavená nízká úroveň,
proběhne proces poměrně rychle, výsledek je ale nebývá optimální. Naopak vysoká úroveň
vede nástroj k hledání co nejoptimálnějších variant rozložení a propojení buněk, ovšem za
cenu značného (i několikanásobného) nárůstu doby potřebné pro implementaci.
Po skončení procesu PAR je provedena tzv. statická časová analýza (Static Timing
Analysis; STA), která slouží k ověření časových parametrů výsledné implementace
číslicového obvodu v FPGA, tedy zda implementovaný design splňuje omezující podmínky
(constraints). Po provedení procesu PAR jsou již známé délky a trasy všech použitých spojů
na čipu a lze tedy stanovit dobu šíření všech signálů mezi klopnými obvody, vstupy a
výstupy. Výpočet doby šíření je založen na změřených parametrech reálných čipů a je
uvažován pro nejhorší možný případ, tedy nejméně výhodné pracovní podmínky (teplota,
napájecí napětí) a nejhorší variantu výrobního procesu. Tato analýza se označuje jako worstcase TVP analysis (TVP = temperature, voltage, process).
Pokud je na základě časové analýzy zjištěno, že design nesplňuje omezující podmínky,
je nutné provést implementaci znovu. V případě, že je rozdíl mezi požadovanými hodnotami a
dosaženými hodnotami velmi malý, je možné provést pouze proces implementace
FEKT Vysokého učení technického v Brně
44
s modifikovaným nastavením, například s nastavením vyššího úsilí (effort) procesu rozmístění
buněk. Je-li ale rozdíl požadavků a výsledku STA příliš velký, je většinou nutné provést
úpravy zdrojových kódů některou z technik uvedených v kapitole 5.5.
Pokud jsou omezující podmínky splněny, lze přistoupit k samotné konfiguraci
(naprogramování) FPGA. K tomu je zapotřebí vygenerovat programovací soubor určený buď
přímo pro FPGA (označovaný jako BitStream) nebo pro vhodnou paměť (typicky FLASH), ze
které je bitstream při každém zapnutí systému do FPGA načten. Testování na hardwarové
platformě často odhalí další chyby v návrhu, které je pak nutné korigovat ve zdrojových
kódech. Korekce kódu ovšem znamená provést znovu celý proces implementace, včetně
příslušných kroků verifikace. To je u větších designů velmi náročné na čas a výpočetní
prostředky, proto je snahou návrhářů se takovým změnám v maximální míře vyhnout
důkladnou funkční verifikací. Obecně platí, že odhalení chyby v počátku vývoje (např. právě
pomocí funkční verifikace) je mnohem levnější, než odhalení chyby v pozdější fázi vývoje,
nebo v extrémním případě až ve výrobě.
V současné době se na vývoji elektronických systémů nepříznivě projevuje trend velmi
rychlého uvádění produktů na trh. Tlak je způsoben faktem, že potenciální zisk z produktu je
tím větší, čím dříve se jej podaří uvést na trh před konkurenčním produktem (Obr. 22), a je
příčinou řady chyb, které se v nových produktech objevují (nedostatečný čas na testování). To
platí především v oblasti spotřební elektroniky, kam sice FPGA teprve začínají pronikat, nebo
jsou prozatím relativně drahá a mají velkou vlastní spotřebu. V blízké budoucnosti lze ale
předpokládat značný rozmach použití FPGA i v této oblasti spolu s tím, jak se bude dařit
snižovat jejich cenu a spotřebu. FPGA totiž nabízí ve srovnání s obvody ASIC mnohem
rychlejší proces návrhu a možnost jednoduše provádět změny konfigurace i během produkce a
dokonce u zákazníka (formou nového firmware).
Potenciální dosažitelné tržby
100%
90%
80%
70%
60%
50%
40%
30%
20%
10%
0%
0
3
6
9
12
Zpoždění v uvedení produktu na trh (měsíců)
Obr. 22
Potenciální dosažitelné tržby z prodeje produktu v závislosti na zpoždění
v uvedení produktu na trh.
3.5 Výrobní technologie obvodů FPGA
FPGA pro svoji funkci potřebují programovatelné konfigurační buňky, které slouží
k ovládání prvků na čipu (LUT, multiplexory, propojovací struktura…). Tyto
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
45
programovatelné buňky jsou ve své podstatě paměťové buňky, které lze realizovat téměř
libovolnou technologií používanou pro výrobu pamětí. Typ použitých paměťových buněk
velmi výrazně ovlivňuje vlastnosti celého obvodu FPGA a to ze dvou důvodů.
 FPGA obsahují obrovské množství programovacích paměťových buněk (až
stovky milionů), které tak zabírají značnou část celého čipu. Jejich velikost má
tedy zásadní vliv na celkovou velikost čipu. Provedení navíc může výrazně
ovlivnit vlastní spotřebu obvodu, odolnost vůči vnějším vlivům (radiace…) a
podobně.
 Z hlediska výroby vyžadují některé typy paměťových buněk speciální
technologické kroky, které nejsou dostupné v nejnovějších výrobních
technologiích (technology node). Jsou tak limitujícím faktorem z hlediska
velikosti hradlového pole (počtu programovatelných buněk) a rychlosti (mezní
pracovní frekvence) takto realizovaných čipů.
Výrobní technologie (proces, technology node) bývá označována fyzickým rozměrem
(µm, nm), který odpovídá polovině nejmenší realizovatelné vzdálenosti mezi dvěma vodivými
cestami ve struktuře paměti DRAM (half pitch between two adjacent DRAM metal lines; Obr.
23). Někdy je tento rozměr poněkud nesprávně interpretován jako nejmenší šířka motivu,
který lze danou technologií na čipu realizovat.
Pitch
Half-pitch
GATE
SOURCE
kontakt
DRAIN
kontakt
CHANNEL
Obr. 23
Význam označení technologie výroby integrovaných obvodů (technology node).
Z hlediska zabrané plochy na čipu lze konfigurační buňky nejefektivněji realizovat
přímo při výrobě základního čipu FPGA využitím metalických vrstev, tedy vhodnými
fotolitografickými maskami (mask programmable). Tato technologie neumožňuje po výrobě
čip programovat (odpovídá pamětem ROM), přesto se s ní dnes lze v souvislosti s obvody
FPGA setkat. Používá se pro realizaci strukturovaných obvodů ASIC, které jsou založeny na
obvodech FPGA, pouze jsou v nich programovatelné konfigurační buňky nahrazen buňkami
ROM. Použití těchto obvodů vychází z klasických obvodů FPGA založených typicky na
technologii SRAM (viz dále). Na nich je vyvíjený číslicový obvod odladěn a poté je
provedena migrace designu do technologie maskou programovatelných obvodů. Obvody
tohoto typu jsou dostupné například pod komerčním označením HardCopy nebo EastPath.
Použití pevně nakonfigurovaných buněk umožňuje výrazné snížení spotřeby, zmenšení
zabrané plochy čipu, zmenšení délek spojů a tím i zvýšením výkonu čipu při stejné
46
FEKT Vysokého učení technického v Brně
konfiguraci. Pokud je obvod vyroben v dostatečném množství, je takový čip levnější, než
odpovídající obvod FPGA, a představuje kompromis mezi obvody FPGA a ASIC. Takto
realizované konfigurační buňky jsou přirozeně velmi odolné vůči ionizujícímu záření.
Výhodný je i fakt, že po zapnutí jsou obvody ihned funkční. Naopak základní nevýhodou této
technologie je fixní konfigurace daná při výrobě, která zcela vylučuje použití těchto obvodů
pro vývoj. Ke každému typu takového obvodu ale existuje odpovídající obvod FPGA, který
tuto funkci přebírá. Proces zpětného inženýrství je u těchto obvodů relativně snadný a spočívá
v analýze rentgenových snímků čipu. Technologie výroby takových obvodů nevyžaduje
zvláštní technologické kroky a pro výrobu takového čipu je tedy možné využít nejnovější
CMOS technologii.
První opravdu programovatelné obvody PLD byly vyráběny technologií tavných
propojek, pojistek (fuse). Programování čipu spočívalo v přepálení vybraných pojistek
dostatečným proudem. Tento způsob programování je jednorázový, jde tedy o obvody OTP.
V oblasti pamětí těmto obvodům odpovídá technologie PROM. Technologie pojistek se
v dnešní době již prakticky nepoužívá, ale jako velmi perspektivní se ukázala být obdobná
technologie antipojistek (antifuse) založená na technologii amorfního křemíku. Tento druh
paměťové buňky je v nenaprogramovaném stavu nevodivý. Přivedením dostatečně velkého
napětí a proudu na paměťovou buňku se buňka stává trvale vodivou – naprogramovanou.
Programování je trvalé, nevratné (OTP), obvody jsou tedy nevhodné pro vývoj (prototyping).
Mezi výhody těchto obvodů patří vysoká odolnost vůči radiaci, velmi obtížné zpětné
inženýrství a okamžitá funkčnost po zapnutí. Z těchto důvodů jsou tyto obvody používány
v armádních zařízeních (military, defense), v leteckém průmyslu a vesmírných aplikacích
(aerospace).
Výrobci obvodů FPGA založených na technologii antipojistek často vyzdvihují plošnou
efektivitu těchto konfiguračních buněk ve srovnání s dalšími typy buněk (především SRAM).
Díky ní lze realizovat obvod FPGA mnohem efektivněji, tedy s větším mezním kmitočtem a
větší efektivitou využití čipu, než srovnatelný obvod s buňkami SRAM. Takové srovnání je
korektní, pokud provedeme porovnání obvodů vyrobených stejnou technologií. Problém
obvodů založených na technologii antipojistek ale je, že k jejich výrobě jsou nutné speciální
výrobní technologické kroky, a ty nejsou dostupné v nejnovějších technologiích. Současné
obvody s technologii antipojistek jsou vyráběny technologií 150 nm, zatímco obvody
s technologií SRAM jsou běžně dostupné s technologií 28 nm (obvody FPGA vyrobené
technologii 150 nm založené na buňkách SRAM byly dostupné již v roce 2000). To
způsobuje značnou zaostalost obvodů s antipojistkami za obvody s buňkami SRAM, která
zcela eliminuje zisk daný plošnou efektivitou. Plošnou efektivitu dále poněkud zhoršuje fakt,
že k programování antipojistek jsou nutné poměrně velké programovací tranzistory, o kterých
se výrobci příliš nezmiňují.
Použitím technologie EPROM (Erasable Programmable Read Only Memory),
v obvodech PLD vznikly první opakovaně programovatelné logické obvody. Programovatelná
buňka je založena na tranzistoru MOS-FET s plovoucí (nezapojenou) elektrodou hradla
(floating gate). Elektroda je izolována vrstvou oxidu křemičitého a dokáže si tak po velmi
dlouhou dobu uchovat elektrický náboj, který je na ni přiveden. Elektrodu lze nabít (tj. buňku
naprogramovat) přivedením dostatečně vysokého napětí na její příslušnou elektrodu, přičemž
se využívá jevu injektování horkých nosičů – elektronů (hot carrier injection). Vyšší napětí
bylo dříve nutné zajistit externě, novější integrované obvody jsou schopny toto napětí
generovat interně pomocí nábojové pumpy. Vybití náboje z elektrody, tedy smazání obsahu
buňky, probíhá pomocí ionizujícího UV záření. Ozářením vznikají v oxidu křemičitém ionty,
které zhorší jeho izolační vlastnosti a umožní náboji z hradla uniknout. Tento proces mazání
paměti trvá typicky 10-30 minut.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Obr. 24
47
Pouzdro DIL integrovaného obvodu vybaveného pamětí typu EPROM; rozteč
vývodů je 2,54 mm.
Obvody technologie EPROM se vyznačovaly pouzdry s okénkem z křemičitého skla,
které umožnilo proniknout UV záření až na čip (Obr. 24). Taková pouzdra byla velmi drahá, a
i proto se od použití technologie EPROM brzy upustilo. V oblasti obvodů PLD se tato
technologie nedočkala rozšíření (až na několik starších řad obvodů SPLD a CPLD), používala
se spíše pro paměti a mikroprocesory s integrovanou pamětí.
Dalším vývojovým krokem v oblasti programovatelných buněk je technologie
EEPROM (někdy E2PROM), tedy elektricky mazatelná paměť. Na rozdíl od pamětí EPROM
lze obsah takové paměti nejen naprogramovat, ale i vymazat elektricky, a to nejen všechny
buňky najednou, ale každou buňku zvlášť. Možnost mazat každou buňku zvlášť ale vyžaduje
implementovat ke každé buňce další tranzistor pro funkci mazání, čímž se poněkud zhoršuje
plošná efektivita této struktury. Základní výhoda technologie EEPROM ale tkví v možnosti
relativně rychlého mazání buněk (ve srovnání s EPROM), které nevyžaduje aplikaci UV
záření, tedy použití pouzdra s okénkem. Rychlost mazání buněk EEPROM je ale omezená a
pro potřeby moderních integrovaných obvodů nevhodná. Proto byla vyvinuta technologie
FLASH, která je přímo založena na technologii EEPROM, a liší se od ní pouze strukturou
pro mazání obsahu buněk. U technologie FLASH dochází k mazání buněk ne individuálně,
ale po blocích. To má dva důsledky: zvýšení rychlosti procesu mazání a zvýšení plošné
efektivity využití čipu (tranzistor pro mazání je sdílen několika buňkami).
Technologie EEPROM byla dříve používána u obvodů SPLD a CPLD. Vzhledem
k tomu, že konfigurační soubor je při programování nahrán celý znovu (nejde o změnu
individuálních buněk), byla technologie EEPROM brzy nahrazena technologií FLASH.
V současné době se FLASH používá pro realizaci konfiguračních buněk CPLD a
nevolatilních FPGA. Volatilní obvody FPGA využívají pro uchování konfigurace externí
paměti typu FLASH.
Technologie EEPROM/FLASH vyžaduje při výrobě použití speciálních
technologických procesů nad rámec základního výrobního procesu. Podobně, jako u
technologie antipojistek, tyto procesy nejsou dostupné pro nejnovější výrobní technologie.
Ačkoliv jsou tedy buňky těchto typů plošně efektivnější, než srovnatelné buňky SRAM,
zpoždění o několik generací technologií je řadí z hlediska výpočetních možností (počet a
rychlost logických buněk) až za obvody založené na technologii SRAM. Nejnovější dostupné
FPGA a CPLD založené na technologii FLASH jsou dnes vyráběny technologií 65 nm (běžně
dostupné FPGA založené na SRAM jsou vyráběny technologií 28 nm).
FEKT Vysokého učení technického v Brně
48
Obvody založené na EEPROM/FLASH jsou vhodné pro vývoj aplikací (prototyping),
neboť proces programování je opakovatelný a dosažitelná rychlost přeprogramování je již
přijatelná (podstatně menší, než typická doba syntézy a implementace designu). Každý cyklus
zápisu a mazání má negativní vliv na životnost buňky, neboť dochází k degradaci vrstvy
oxidu křemíku. Životnost se podle konkrétního provedení uvádí v rozmezí 100 až 100 000
cyklů, což pro konfigurační buňky FPGA plně dostačuje. Obvody založené na technologii
FLASH vykazují nízkou statickou spotřebu a jsou dobře odolné vůči zpětnému inženýrství.
Odolnost vůči ionizujícímu záření je nižší, neboť to má stejný efekt, jako UV záření u
EPROM technologie, tedy ztrátu náboje v plovoucím hradle. Rychlost této ztráty je úměrná
intenzitě ionizujícího záření.
Poslední, a zdaleka nejpoužívanější technologií konstrukce konfiguračních buněk
moderních FPGA, je statická buňka SRAM (Static Random Access Memory cell). Ta je
typicky složena ze šesti tranzistorů vyrobených standardní technologií MOS-FET (Obr. 25),
ale existují i varianty s více či méně tranzistory. Základní výhodou této buňky je právě fakt,
že ji lze vyrobit standardní technologií, nejsou vyžadovány další technologické kroky, jako
antipojistek nebo EEPROM/FLASH. To je činí jednak poměrně levnými a zároveň to
umožňuje takové obvody vyrábět nejmodernější dostupnou technologií, což je hlavní důvod
použití technologie SRAM v drtivé většině dnešních FPGA.
Obr. 25
Základní paměťová buňka technologie SRAM.
Buňky typu SRAM přináší i několik nevýhod. Fakt, že každá buňka je složena ze šesti
tranzistorů (oproti jednomu v technologii FLASH) je činí značně neefektivní z hlediska
využití plochy křemíkového čipu. Technologický náskok oproti technologii FLASH ale tuto
nevýhodu více než kompenzuje. Buňky SRAM jsou volatilní, tedy pro uchování stavu
naprogramování vyžadují trvalou přítomnost napájecího napětí. To v praxi vyžaduje
přítomnost externí FLASH paměti, ze které je po každém zapnutí systému načtena
konfigurace do SRAM buněk FPGA. Tento proces je jednak časově náročný (u větších
obvodů může trvat stovky milisekund) a zároveň umožňuje poměrně snadno provést proces
zpětného inženýrství vyčtením konfiguračního souboru z externí paměti. Tuto nevýhodu lze
kompenzovat zabezpečovacím kódováním (typicky AES; Advanced Encryption Standard)
použitým pro přenos dat z paměti do FPGA. SRAM buňky jsou také náchylné na ionizující
záření, které může poměrně snadno změnit jejich stav z log. 0 do log. 1 nebo naopak.
Odolnost buněk lze zvýšit použitím přídavného stínění nebo použitím starší výrobní
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
49
technologie, které jsou z principu odolnější. Tím se ale ztrácí výhoda technologického
náskoku vzhledem ke srovnatelným obvodům založeným na technologii antipojistek a
FLASH.
Porovnání všech uvedených technologií výroby konfiguračních buněk je v Tab. 1. Dnes
běžně komerčně dostupné technologie jsou v naprosté většině založeny na technologii SRAM,
výjimečně na technologii FLASH. Obvody s antipojistkami lze použít jen pro speciální
aplikace. Maskou programovatelné obvody jsou vhodné pro náhradu SRAM FPGA pro
hromadnou výrobu, jejich význam ale klesá s rostoucími možnostmi a klesající cenou SRAM
FPGA.
Tab. 1
Vzájemné porovnání vlastností technologií konfiguračních buněk obvodů PLD.
ASIC / Mask
Programmable
Antifsue
EPROM
EEPROM /
FLASH
SRAM
ano
ano
ano
ano
ne
nejmenší
velmi malá
malá
střední / malá
velká
zpětné inženýrství
(reverse engineering)
snadné (RTG
snímání)
velmi obtížné
obtížné
obtížné
snadné,
(externí paměť)
dostupná výrobní
technologie (2014)
28/22/14 nm
150nm
-
- / 65 nm
28/22 nm
vhodné pro vývoj
(prototyping)
NE
NE
ANO
ANO
ANO
odolnost
konfiguračních
buněk vůči radiaci
dokonalá
velmi dobrá
střední
střední
nízká (nutné použít
přídavné stínění)
statická spotřeba
malá
malá
malá
malá
velká
výpočetní výkon
(performance)
velmi velký
malý
sřední
střední
velký
Structured ASIC
FPGA
starší paměti
CPLD, FPGA
FPGA
funkční ihned po
zapnutí
relativní plocha na
čipu
použití
3.6 Pouzdra obvodů FPGA
Starší obvody PLD se vyráběly v pouzdrech DIL (Dual In-Line; Obr. 24) s roztečí
vývodů 2,54 mm, PLCC (Plastic Leaded Chip Carrier; Obr. 26) s roztečí 1,27 mm, v různých
variantách SO (Small Outline package) s roztečí 0,5 až 1,27 mm a QFP (Quad Flat Package;
Obr. 28) s roztečí 0,5 až 0,8 mm. Tato pouzdra měla vývody pouze po svém obvodu (DIL a
SO dokonce pouze ze dvou stran), což umožňovalo realizovat pouze obvody s relativně
malým počtem vstupů a výstupů (cca do 250 u největších QFP pouzder). Vývody byly navíc
tvořeny poměrně dlouhými vodiči (především u pouzdra DIL) a vykazovaly tak poměrně
velkou indukčnost, která znemožňovala jejich použití pro rozhraní s vysokou přenosovou
rychlostí. Jistou výjimkou jsou pouzdra typu PGA (Pin Grid Array), která mají vývody
FEKT Vysokého učení technického v Brně
50
rozmístěny po většině plochy čipu a umožňují tak realizovat i součástky s více vývody (i přes
600). Tato pouzdra se ale příliš nepoužívala, brzy je nahradily modernější varianty.
Obr. 26
Ukázka obvody CPLD v pouzdře PLCC44 (17 x 18 mm, rozteč vývodů 1,27 mm).
Obr. 27
FPGA ve vývodovém pouzdře typu QFP-208 s roztečí vývodů 0,5 mm.
Moderní obvody FPGA mají velký počet vstupů a výstupů, které jsou navíc uzpůsobeny
pro vysoké přenosové rychlosti (stovky megabitů až desítky gigabitů). To nutně vyžaduje
použití moderních pouzder s velkým počtem pinů a malými parazitními vlastnostmi. Dnes se
lze běžně setkat s pouzdry typu QFP, QFN (Quad Flat No-leads; Obr. 28) a především BGA
(Ball Grid Array; Obr. 29), u nichž se počet pinů může blížit i třem tisícům.
Obr. 28
Bezvývodové pouzdro typu QFN s roztečí vývodů 0,5 mm s termální ploškou.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Obr. 29
51
Ukázka provedení pouzdra typu BGA s roztečí vývodů 1 mm.
Pouzdra typu BGA a QFN jsou poměrně náročná z hlediska osazování, neboť mají
vývody v oblasti pod pouzdrem, kterou nelze přímo kontrolovat a případné chyby v zapájení
opravit. Vždy jsou osazována technologií přetavení (reflow) s přesně kontrolovaným
průběhem teploty během procesu. To zajistí, že dojde k dostatečnému rozlití pájky po
plošném spoji a kontaktech a zároveň nedojde k přepálení cínu. I při chladnutí desky je nutné
dodržet předepsaný teplotní profil, který zamezí vzniku mechanického pnutí mez plošným
spojem a pouzdrem. Především v případě bezolovnatých pájek (drtivá většina dnes
používaných) jsou požadavky na teplotní profil kritické.
Základem pouzder typu BGA (Obr. 30, Obr. 31) je mnohavrstvý plošný spoj (základní
substrát), který slouží jako nosná konstrukce pouzdra a propojovací struktura. Na spodní
straně tohoto substrátu jsou rozmístěny kuličky pájky, které slouží jako piny. Na horní straně
desky je pak umístěn samotný křemíkový čip (v našem případě FPGA), který může být
připojen k základnímu substrátu dvěma způsoby. Levnější způsob je použití bondovacích
drátků (technika wire bonding), které jsou postupně strojově nataženy mezi čip a substrát
(Obr. 30). Čip je v tomto případě na základním substrátu přilepen teplovodným epoxidovým
lepidlem. Celá sestava je zalita epoxidovou pryskyřicí, která chrání přípojné (bondovací)
drátky i samotný čip před poškozením.
epoxidová
pryskyřice
kuličky
pájky
Obr. 30
základní
substrát
přípojné
drátky
blokovací
kondenzátory
teplovodné
lepidlo
křemíkový
čip
plošné
spoje
Schéma pouzdra typu BGA s čipem připojeným bondováním (wire bonding).
Bondovací drátky mají poměrně velkou vlastní indukčnost, což omezuje použití
takových pouzder pro obvody s relativně nízkými rychlostmi na jeden pin (přesto jde o
jednotky Gb/s). Samotný čip je zalit v pryskyřici a nemůže mít tedy přímý kontakt
FEKT Vysokého učení technického v Brně
52
s chladičem. Takto způsobený větší tepelný odpor pouzdra znemožňuje použít pouzdro pro
obvody s velkým ztrátovým výkonem, tedy pro obvody optimalizované na rychlost
(výpočetní výkon). Pro takové obvody se používá dražší, ale kvalitnější způsob montáže čipu
na substrát – tzv. Flip Chip.
V tomto případě je křemíkový čip opatřen ze strany kontaktů mikrokuličkami pájky,
které slouží k připájení čipu na základní substrát (Obr. 31). Čip je tak sám vlastně jakousi
miniaturní součástkou s pouzdrem typu BGA. Výhodou takové montáže je především výrazné
snížení parazitních vlastností propojení čipu se základním substrátem. Další výhodou je, že
čip lze efektivněji chladit z horní strany pouzdra, neboť čip není blokován bondovacími
drátky. Provedení pouzdra může být bez teplovodného ochranného krytu (Bare Die nebo
Lidless FCBGA; foto na Obr. 31) nebo s ochranným krytem (Lidded FCBGA; Obr. 29).
teplovodné
lepidlo
teplovodný
kovový kryt
kuličky
pájky
základní
substrát
Obr. 31
křemíkový
čip
mikrokuličky
pájky
blokovací
kondenzátory
plošné
spoje
epoxidová
pryskyřice
Schéma pouzdra typu FCBGA a jeho reálná ukázka.
V okolí čipu jsou na substrátu většinou (pokud to umožňuje kombinace velikosti
pouzdra a čipu) rozmístěny blokovací kondenzátory, které podstatně zvyšují kvalitu
napájecího napětí a částečně snižují nároky na množství blokovacích kondenzátorů na
hlavním plošném spoji. Jsou vždy keramické, s malou vlastní indukčností a ekvivalentním
sériovým odporem (ESR; Equivalent Series Resistance). Dobře patrné jsou na fotografii
pouzdra FCBGA bez ochranného teplovodného krytu (Obr. 31).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
53
4 Základy logických obvodů
Číslicové systémy se obecně dělí na kombinační a sekvenční. Kombinační obvody jsou
takové, u nichž stav výstupů závisí pouze na okamžitém stavu vstupů (pokud nebereme
v úvahu zpoždění dané šířením signálů reálným systémem). Sekvenční systémy jsou takové, u
nichž aktuální stav výstupů závisí nejen na současném stavu vstupů, ale i na předchozím
stavu, ve kterém se systém nacházel. Systém tedy obsahuje vnitřní paměť, která je typicky
realizována klopnými obvody. Kromě paměťových prvků ale může obsahovat i kombinační
obvody, které realizují potřebné aritmetické a logické funkce. Synchronní systémy jsou pak
takové sekvenční systémy, jejichž stav se může měnit pouze v okamžicích určených
vyhrazeným řídicím signálem. Klopné obvody těchto systémů proto mají společný řídicí
signál, označovaný jako signál hodinový (clock). Pokud klopné obvody v systému nemají
společný hodinový signál, označují se takové systémy jako asynchronní. Toto tvrzení je ale
třeba s ohledem na současné číslicové systémy upřesnit. Dnešní systémy jsou totiž většinou
složeny z několika (i desítek) relativně složitých subsystému, z nichž každý je sám o sobě
synchronním systémem. Vzájemným propojení se ale formálně stávají asynchronním
systémem, jelikož každý z nich pracuje s jiným hodinovým signálem. Takové systémy jako
celek se pak označují jako lokálně synchronní, globálně asynchronní (locally synchronous,
globally asynchronous). Jednotlivé synchronní subsystémy takového celku se navrhují jako
synchronní systémy a jejich vzájemné propojení je realizováno speciálními technikami, které
zaručí korektní přenos signálů mezi nimi (viz kapitola 5.4).
Drtivá většina moderních číslicových systémů je navrhována jako synchronní sekvenční
systémy především proto, že je dobře zvládnutý návrh těchto systémů s podporou EDA
nástrojů. Takový návrh zároveň bývá nezávislý na cílové platformě, je spolehlivý, odolný
vůči změnám ve výrobních procesech a pracovních podmínkách (teplota, napájecí napětí).
V obvodech ASIC/ASSP se lze někdy setkat se sub-bloky, které jsou asynchronní (např.
čítače) a jako celek se zapojují do synchronního systému. Motivací k použití takových
asynchronních obvodů je vyšší efektivita implementace z hlediska menší potřebné plochy
zabrané na čipu, menší spotřeby a vyšší pracovní frekvence. Specifické požadavky na časové
parametry signálů asynchronních obvodů lze v obvodech ASIC/ASSP vhodným způsobem
zajistit. V obvodech FPGA ale tento způsob návrhu není možný, neboť časové parametry
vnitřních prvků a především propojovací struktury nelze libovolně nastavit. Jsou totiž závislé
na výstupech automatických procesů mapování a PAR, takže výsledek každé kompilace může
být odlišný.
4.1 Kombinační logické obvody
Kombinační logické obvody jsou číslicové obvody bez vnitřní paměti, které se skládají
pouze z navzájem propojených kombinačních hradel (NOT, AND, OR, XOR a jejich variant).
Příklad čistě kombinačního číslicového obvodu je na Obr. 32 v podobě schématu. Takový
obvod lze popsat například pravdivostní tabulkou, Karnaughovou mapou nebo Booleovskou
rovnicí, zapsanou ve tvaru součtu součinů (SoP; Sum of Products), jak je uvedeno na Obr. 33,
nebo součinu součtů (PoS; Product of Sums). Naproti tomu sekvenční systémy nelze popsat
pouze pomocí těchto metod a k jejich popisu se využívají stavové diagramy, tabulky stavů
nebo vyšší programovací jazyky.
FEKT Vysokého učení technického v Brně
54
Obr. 32
Ukázka jednoduchého kombinačního logického obvodu.
O =
( ( I0
(!I0
( I0
(!I0
* I1 * !I2
* !I1 * I2
* I1 * I2
* !I1 * !I2
* !I3) +
* I3) +
* I3) +
* !I3) );
Obr. 33 Ukázka několika typů popisu kombinačního logického obvodu: pravdivostní
tabulka (vlevo), Karnaughova mapa (vpravo nahoře) a Booleovská rovnice.
4.2 Klopné obvody
Základním stavebním prvkem synchronních sekvenčních systémů je klopný obvod.
Těch existuje mnoho různých typů, z nichž se dnes nejčastěji používají klopné obvody typu D
řízené staticky (úrovní; latch) a řízené dynamicky (hranou; flip-flop). Jak bylo uvedeno
v předchozí kapitole, v dnešních obvodech FPGA jsou k dispozici klopné obvody typu D,
které lze nakonfigurovat jako staticky nebo dynamicky řízené (Obr. 34). Výrobci obvodů
FPGA ale důrazně nedoporučují používat staticky řízené klopné obvody, protože jejich
použití může snadno vést na nesplnitelné požadavky časových parametrů systému. Některé
firmy svými interními předpisy přímo zakazují použití staticky řízených klopných obvodů
v navrhovaných číslicových systémech s obvody FPGA.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
55
Obr. 34 Ukázka možnosti konfigurace klopného obvodu v FPGA jako obvodu řízeného
hranou (FF) nebo řízeného úrovní (LATCH) a programu FPGA Editor (Xilinx ISE).
Faktem je, že klopný obvod typu D řízený staticky lze v číslicovém systému prakticky
vždy bez problémů nahradit dynamicky řízeným, který je obecně považován za kvalitativně
lepší. V obvodech FPGA tedy nemá smysl latch používat, protože jeho použitím nedojde
k úspoře strukturálních prvků. Z hlediska obvodů ASIC je ale použití staticky řízených
klopných obvodů atraktivní, neboť pro jejich realizaci je zapotřebí přibližně poloviční
množství tranzistorů. Klopný obvod tak zabere poloviční plochu na čipu. Problém plynoucí ze
specifických požadavků na časové parametry číslicového obvodu v obvodech ASIC ztrácí
význam, neboť návrhář má všechny časové parametry obvodu plně pod kontrolou (na rozdíl
od obvodů FPGA).
Staticky řízený klopný obvod má v nejjednodušším případě dva vstupy CLK a D a
jeden výstup Q. Pokud je na vstupu CLK aktivní úroveň (typicky logická '1'), je signál ze
vstupu D přímo propojen na výstup Q. Jakmile přejde signál CLK do neaktivní úrovně,
zůstane na výstupu Q úroveň platná v době sestupné hrany hodinového signálu. Na Obr. 35 je
naznačena schematická značka staticky řízeného klopného obvodu a časové průběhy
ilustrující jeho funkci.
CLK
D
CLK
Q
D
Q
Obr. 35
Schematická značka a časové průběhy signálů staticky řízeného klopného obvody
typu D (Latch).
Dynamicky (hranou) řízený klopný obvod typu D má v nejjednodušším případě opět
dva vstupy CLK a D a jeden výstup Q. Signál je ze vstupu D na výstup Q přenesen pouze
v okamžiku aktivní hrany hodinového signálu CLK (většinou v době náběžné hrany). Od té
doby až do příchodu další aktivní hrany na vstup CLK je na výstupu Q ponechán stav beze
změny. Na Obr. 36 je naznačena schematická značka dynamicky řízeného klopného obvodu a
časové průběhy ilustrující jeho funkci.
FEKT Vysokého učení technického v Brně
56
CLK
D
Q
CLK
D
Q
Obr. 36
Schematická značka a časové průběhy signálů dynamicky řízeného klopného
obvody typu D (Flip-Flop).
Odpovídající popis staticky i dynamicky řízeného klopného obvodu pomocí procesu
v jazyce VHDL je uveden zde:
-- Staticky rizeny klopny obvod
typu D
PROCESS (CLK) BEGIN
IF (CLK = '1') THEN
Q <= D;
END IF;
END PROCESS;
-- Dynamicky rizeny klopny obvod
typu D
PROCESS (CLK) BEGIN
IF rising_edge(CLK) THEN
Q <= D;
END IF;
END PROCESS;
U dynamicky řízeného klopného obvodu zajišťuje funkce rising_edge detekci
náběžné hrany. Ve starších zdrojových kódech se vyskytuje poněkud odlišný, ale zcela
ekvivalentní výraz pro detekci vzestupné hrany signálu:
IF (CLK'EVENT = '1' AND CLK = '1') THEN
Funkce rising_edge je přímo takto definována ve sloze STD_LOGIC_1164 a
jediným účelem této definice je zjednodušení zápisu této podmínky v kódu. Komplementární
funkcí, detekující sestupnou hranu, je pak funkce faling_edge. Při vytváření
syntetizovatelného popisu číslicových systémů by se neměly kombinovat ve zdrojových
kódech obě tyto funkce. Jinými slovy: všechny klopné obvody v celém navrhovaném
systému by měly reagovat (být sensitivní) pouze na jeden typ hrany, zpravidla na
náběžnou. Výjimkou jsou speciální bloky, jako rozhraní typu DDR (Double Data Rate).
Pozor, funkce pro detekci hrany se smí v kódech určených pro implementaci
používat pouze za účelem detekce hran hodinových signálů, tedy s úmyslem
implementovat klopný obvod řízený hranou!!! Touto funkcí nelze detekovat například stisk
tlačítka, jak se mnoho začínajících návrhářů domnívá. Použití funkce takovým způsobem
vede buď na zcela nesyntetizovatelný kód, nebo na kód, který je po implementaci nefunkční.
Číslicové systémy v FPGA by se měly vyvarovat použití staticky řízených klopných
obvodů. Ty mohou vzniknout i neúmyslně nevhodným způsobem kódování. Návrhové
systémy určené pro obvody FPGA během implementace vždy sledují výskyt takto vzniklých
latchů a upozorňují návrháře formou upozornění (warning). Návrhový systém ISE firmy
Xilinx by například na základě výše uvedeného kódu vygeneroval následující chybové
hlášení, které přímo varuje před použitím latchů:
WARNING: Xst:737 - Found 1-bit latch for signal <Q>. Latches may be
generated from incomplete case or if statements. We do not recommend
the use of latches in FPGA/CPLD designs, as they may lead to timing
problems.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
57
Při použití staticky řízeného klopného obvodu v FPGA totiž systém nedokáže
automaticky zajistit požadované časové parametry pro spolehlivou funkci latchů, a při jeho
nevhodném použití navíc hrozí riziko vzniku kombinační zpětné vazby (kombinační smyčky;
combinatorial loop). Vznik kombinační zpětné vazby při použití staticky řízeného klopného
obvodu je ilustrován na Obr. 37. Tuto situaci řeší použití hranou řízeného klopného obvodu
dle Obr. 38.
A=Q
A
B
B
Y
D
Q
CLK
CLK
Y=D
Obr. 37
Y=!(A·B)
Vznik kombinační zpětné vazby při použití úrovní řízeného klopného obvodu
typu D (D-type latch).
A=Q
B
CLK
Y=D
Obr. 38
A
B
Y
D
Q
CLK
Odstranění kombinační zpětné vazby při použití hranou řízeného klopného
obvodu typu D (D-type Flip-Flop).
4.3 Binární čítače
Čítače tak, jak jsou používány v obvodech FPGA, jsou vždy synchronní sekvenční
systémy. Lze je charakterizovat jako stavové automaty, u nichž převládá režim čítání, tedy
přechodů mezi sousedními stavy. Existuje několik typů čítačů, které se běžně používají,
z nichž každý nabízí některé specifické vlastnosti a podle nich je používán v určitých
aplikacích.
Nejčastěji používaným čítačem je čítač binární. Časový průběh výstupních signálů
čtyřbitového binárního čítače je naznačen na Obr. 39.
FEKT Vysokého učení technického v Brně
58
clk
b[0]
b[1]
b[2]
b[3]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 ....
Obr. 39
Časový průběh výstupních signálů čtyřbitového binárního čítače čítajícího vpřed.
Chování čítače lze efektivně zachytit pomocí tabulky stavů nebo stavových diagramů.
Příklad stavového diagramu čtyřbitového binárního čítače je na Obr. 40.
0
Obr. 40
1
2
...
14
15
Stavový diagram čtyřbitového nevratného binárního čítače.
Čítač je v cílovém obvodu (FPGA/ASIC) realizován pomocí registru, který uchovává
současný stav čítače, a obvodu zpětné vazby, který na svém výstupu má stav příští (Obr. 41).
V případě binárního čítače je zpětná vazba kombinačním obvodem inkrementujícím současný
stav o 1. Přechod ze stavu 15 do stavu 0 je přirozeně ošetřen přetečením hodnoty v registru.
Obr. 41
Typický způsob realizace binárního čítače.
Odpovídající kompletní zdrojový kód entity (bloku) realizující binární čítač je níže. Kód
respektuje schéma systému podle Obr. 41, tedy obsahuje samostatnou část (proces) popisující
registr a samostatnou část popisující zpětnovazební kombinační logický obvod.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
59
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
ENTITY citac_4b IS
PORT ( clk
: IN STD_LOGIC;
data
: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END citac_4b;
ARCHITECTURE rtl OF citac_4b IS
SIGNAL cit
SIGNAL cit_next
: UNSIGNED(3 DOWNTO 0):= "0000";
: UNSIGNED(3 DOWNTO 0);
BEGIN
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
cit <= cit_next;
END IF;
END PROCESS;
PROCESS (cit) BEGIN
cit_next <= cit + 1;
END PROCESS;
data <= STD_LOGIC_VECTOR(cit);
END rtl;
Na uvedeném kódu lze demonstrovat několik klíčových vlastností jazyka VHDL a
pravidel, která je vhodné při psaní kódu dodržovat. Kód začíná deklarací použitých knihoven
a sloh. Ve všech zdrojových kódech určených pro implementaci najdeme deklaraci knihovny
IEEE a v ní obsažené slohy STD_LOGIC_1164 (důvody jsou uvedeny v kapitole 2.1). Dále
je použita sloha NUMERIC_STD, která v kódu umožňuje použít datový typ UNSIGNED a
provádět se signály tohoto typu operace sčítání.
Následuje popis entity bloku, který je zde nazván citac_4b. Název entity by se měl
shodovat s názvem zdrojového souboru, ve kterém je obsažen (zde tedy citac_4b.vhd). Entita
(blok) čítače má jeden jednobitový vstupní signál clk a jeden výstupní čtyřbitový signál
data. Tím je jednoznačně určeno rozhraní entity, kterou tak lze například použít instanciací
v dalších zdrojových kódech (strukturální popis). V praxi je dodržováno nepsané pravidlo, že
všechny porty by měly být typu STD_LOGIC nebo STD_LOGIC_VECTOR. Důvodem je
jednoznačná vzájemná kompatibilita komponent bez ohledu na to, jaké byly pro popis bloku
použity slohy (standardní NUMERIC_STD nebo STD_LOGIC_ARITH) a kompatibilita
s jednoduššími schématickými editory.
Každá entita musí mít přiřazenu alespoň jednu architekturu (popis funkce). V tomto
případě se architektura jmenuje rtl, vztah k entitě je vyjádřen názvem entity za klíčovým
slovem OF. První částí architektury je tzv. deklarativní část, kde je možné deklarovat použité
komponenty (již zkompilované entity), funkce, signály, konstanty a podobně. V našem
případě obsahuje deklaraci dvojice čtyřbitových signálů cit a cit_next typu UNSIGNED.
Signálu cit je přímo při jeho deklaraci přiřazena výchozí hodnota, která je využita při
simulaci. Přiřazení výchozí hodnoty registrům je z hlediska simulace klíčové především u
zpětnovazebních obvodů, kterými čítače a obecně stavové automaty jsou. Pokud by nebyla
60
FEKT Vysokého učení technického v Brně
provedena tato inicializace a kód by byl simulován bez dalších změn, byl by obsah signálu
cit nedefinovaný (vektor hodnot 'U'). Inkrementace takové hodnoty pak nedává smysl a
výsledkem je opět nedefinovaný signál. Inicializace signálu cit do stavu "0000" po startu
simulace způsobí, že zpětnovazební obvod provede inkrementaci tohoto čísla, jejímž
výsledkem bude hodnota "0001".
V simulaci lze tento problém obejít zavedením nulovacího signálu, který je po spuštění
simulace aktivován a provede nastavení všech registrů do výchozí hodnoty. To ale znamená
vybavit všechny registry takovým vstupem a může to vést k nezanedbatelnému nárůstu
složitosti systému. V případě vývojového systému ISE firmy Xilinx je definice hodnoty
v deklaraci registrových signálů zohledněn také implementačními nástroji. Tímto způsobem je
možné definován výchozí stav těchto signálů (registrů) po zapnutí systému.
Všimněte si, že u signálu cit_next není tato výchozí hodnota definována. Je to proto,
že jde o signál, který je výstupem kombinační části (tzv. kombinační signál). Jeho stav
(hodnota) po startu simulace, respektive zapnutí systému, je jednoznačně dán stavem
vnitřních registrů případně vstupních signálů. Výchozí přiřazení tedy z hlediska implementace
nemá význam a z hlediska simulace pouze ve výjimečných případech, kdy transportní
zpoždění způsobují postupnou změnu vnitřních signálů (tedy ne při typické čistě funkční
simulaci). Přiřazení výchozí hodnoty ale není chybou a pro nezkušeného návrháře je
jednodušší přiřadit výchozí hodnotu všem vnitřním signálům.
Stejným způsobem lze výchozí hodnotu přiřadit i výstupním portům entity. V případě,
že jde o registrové výstupy, platí pro ně stejná pravidla a vlastnosti, jako pro vnitřní signály.
Toto použití je ale méně časté a v případě potřeby by mělo být realizováno spíše
prostřednictvím dalšího pomocného vnitřního signálu, jemuž lze hodnotu přiřadit při jeho
deklaraci.
Za klíčovým slovem BEGIN následuje tzv. tělo architektury, které obsahuje samotný
popis funkce číslicového obvodu. Zde je popis tvořen třemi souběžnými příkazy: dvěma
procesy a jedním prostým přiřazením. První proces reprezentuje stavový registr, tedy čtveřici
klopných obvodů typu D, jejichž vstupy jsou připojeny na signál cit_next a výstupy na
signál cit. Vzhledem k použití podmínky rising_edge(clk) jde o tzv. sekvenční
proces, v němž všechny signály na levé straně příkazů odloženého přiřazení (<=) budou
implementovány jako registry. Druhý proces nemá tuto podmínku a jde tedy o tzv.
kombinační proces. Realizuje kombinační zpětnou vazbu, která na základě současného stavu
čítače (vstup procesu v podobě signálu cit) na svém výstupu generuje signál odpovídající
stavu příštímu (cit_next).
Kombinační obvod realizuje operaci sčítání. Ta ale není definována pro datový typ
STD_LOGIC_VECTOR, který je použit jako výstupní port entity (viz výše zmíněná
konvence). Proto je nutné sčítání provádět se signály typu UNSIGNED, pro něž jsou
aritmetické operace definovány přímo v použité sloze NUMERIC_STD.
Poslední příkaz prostého přiřazení slouží pouze k propojení vnitřního signálu čítače
s výstupním portem entity. Obsahuje konverzní funkci, která vnitřně používaný signál typu
UNSIGNED převede na signál typu STD_LOGIC_VECTOR. Tato konverze je nezbytná kvůli
striktní typovosti jazyka VHDL. Byť jsou jednotlivé prvky obou vektorů (data i cit)
stejného typu a mají stejný rozměr, VHDL považuje oba vektory za neslučitelné. Tento
poněkud nepříjemný fakt by měl být vyřešen v nových revizích jazyka implicitním
přetypováním (u těchto často používaných typů).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
61
Dvojice procesů použitá pro popis čítače respektuje jeho strukturu, která odpovídá
jednoduchému stavovému automatu. Stejný výsledek implementace obdržíme i v případě, že
sloučíme oba procesy do jediného. Takový způsob zápisu je obvyklý především pro
jednodušší synchronní sekvenční systémy, jako jsou právě čítače.
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
cit <= cit + 1;
END IF;
END PROCESS;
Čítač lze dále doplnit o několik běžně používaných funkcí. Z hlediska popisu jde o
zavedení přídavných řídicích signálů do kombinační části a patřičné doplnění podmínek v této
části. Funkce, kterou je třeba bezpodmínečně implementovat na úrovni klopného obvodu, je
funkce asynchronního nulování či nastavení. Ostatní funkcionality lze definovat
v kombinačním procesu tak, jak požadují priority jednotlivých funkcí.
...
ENTITY citac_4b IS
PORT ( clk
: IN STD_LOGIC;
arst_n : IN STD_LOGIC;
srst
: IN STD_LOGIC;
load
: IN STD_LOGIC;
en
: IN STD_LOGIC;
up
: IN STD_LOGIC;
data_in : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
data
: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END citac_4b;
...
PROCESS (clk, arst_n) BEGIN
IF arst_n = '0' THEN
-- asynchronni reset, aktivni v 0
cit <= "0000";
ELSIF rising_edge(clk) THEN
IF srst = '1' THEN
-- synchronni reset, aktivni v 1
cit <= "0000";
ELSE
IF load = '1' THEN
-- synchronni nacteni, aktivni v 1
cit <= UNSIGNED(data_in);
ELSE
IF en = '1' THEN
-- povoleni behu citace, aktivni v 1
IF up = '1' THEN
-- citani vpred
cit <= cit + 1;
ELSE
-- citani vzad
cit <= cit - 1;
END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
...
FEKT Vysokého učení technického v Brně
62
Výše je upravený zdrojový kód s jedním společným procesem pro popis kombinační i
sekvenční části, který rozšiřuje základní čítač o nejběžnější funkce. Obecně lze každé z těchto
funkcí přiřadit libovolnou prioritu, ale prakticky se setkáváme s tímto pořadím priorit, které je
respektováno i prezentovaným zdrojovým kódem:
1) Asynchronní nulování (asynchronous reset); vstup arst_n, aktivní v log. '0'
2) Synchronní nulování (synchronous reset); vstup srst, aktivní v log, '1'
3) Synchronní načtení (synchronous load); vstup load, aktivní v log, '1'
4) Povolení běhu čítače (clock enable); vstup en, aktivní v log. '1'
5) Směr čítání vpřed/vzad (up/down); vstup up, aktivní v log. '1'
Takový zápis podmínek je sice korektním ale poměrně rozsáhlý a ne zcela přehledný.
VHDL umožňuje provést zápis i zjednodušeným způsobem, přičemž priorita jednotlivých
řídicích signálů je dodržena:
...
PROCESS (clk, arst_n) BEGIN
IF arst_n = '0' THEN
-cit <= "0000";
ELSIF rising_edge(clk) THEN
IF srst = '1' THEN
-cit <= "0000";
ELSIF load = '1' THEN
-cit <= UNSIGNED(data_in);
ELSIF en = '1' THEN
-IF up = '1' THEN
-cit <= cit + 1;
ELSE
-cit <= cit - 1;
END IF;
END IF;
END IF;
END PROCESS;
...
asynchronni reset, aktivni v 0
synchronni reset, aktivni v 1
synchronni nacteni, aktivni v 1
povoleni behu citace, aktivni v 1
citani vpred
citani vzad
Poslední uvedenou variantou je kód, který využívá speciální vlastnost procesů ve
VHDL. Jednotlivé podmíněné příkazy jsou nezávislé a v případě kombinace více aktivních
řídicích signálů tak může platit více přiřazení pro signál cit současně. Konflikt je řešen na
úrovni jazyka VHDL tak, že jako platné přiřazení se vybere to, které je nalezeno v procesu
jako poslední platné. Pokud tedy bude současně aktivní signál en, up, load i srst, budou
pro signál cit nalezeny při vyhodnocení procesu tři příkazy. Jako platný bude ale vybrán
pouze poslední z nich, v tomto případě cit <= "0000";.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
63
...
PROCESS (clk, arst_n) BEGIN
IF arst_n = '0' THEN
-- asynchronni reset, aktivni v 0
cit <= "0000";
ELSIF rising_edge(clk) THEN
IF en = '1' THEN
IF up = '1' THEN
cit <= cit + 1;
ELSE
cit <= cit - 1;
END IF;
END IF;
-- povoleni behu citace, aktivni v 1
-- citani vpred
-- citani vzad
ELSIF load = '1' THEN
-- synchronni nacteni, aktivni v 1
cit <= UNSIGNED(data_in);
END IF;
IF srst = '1' THEN
cit <= "0000";
END IF;
-- synchronni reset, aktivni v 1
END IF;
END PROCESS;
...
Této vlastnosti procesů (odložené přiřazení) se ve VHDL hojně využívá pro
zjednodušení zápisu požadované funkce číslicového obvodu. Lze ji ale doporučit spíše
zkušenějším návrhářům, neboť vyžaduje větší pozornost při tvorbě a editaci kódu (podmínky
nejsou explicitně uvedeny).
Z hlediska implementace je podstatný fakt, že výsledek syntézy všech tří uvedených
zdrojových kódů bude identický. Nároky na strukturní prvky FPGA, ani mezní pracovní
frekvence přímo nesouvisí s počtem řádků kódu, který popisuje navrhovaný systém (což je
pro mnohé začínající návrháře poněkud zarážející fakt). Proto je vždy vhodnější psát kód
srozumitelně a přehledně, byť to často znamená rozsáhlejší zdrojový kód. Přehlednější kód
totiž vede ke spolehlivějšímu návrhu a zjednodušuje následný proces ladění (hledání a
odstraňování funkčních chyb pomocí simulace).
4.4 Další typy čítačů
Kromě binárních čítačů se v číslicových obvodech používá řada dalších typů čítačů.
Jedním z nich je binární čítač se zkráceným cyklem, který je základním prvkem čítačů
pracujících v BCD kódu. Zkrácení cyklu čítače je dosaženo přidáním podmínky, která při
překročení stanovené hodnoty nastaví registr do výchozího stavu. Příklad kódu popisujícího
dekadický čítač (cyklus čítání 0 až 9) je níže:
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
IF cit = X"9" THEN
-- zkraceni cyklu
cit <= X"0";
ELSE
cit <= cit + 1;
END IF;
END IF;
END PROCESS;
FEKT Vysokého učení technického v Brně
64
Pro reprezentaci čísel v rozsahu od 0 do 9 je třeba použít alespoň čtyřbitový signál. Ten
ale může nabývat hodnot v rozsahu od 0 do 15. Pokud aplikujeme na čítač terminologii
stavových automatů, můžeme stavy 0 až 9 označit jako stavy pracovní a stavy 10 až 15 jako
nepracovní. Chování čítače v pracovních i nepracovních stavech je v tomto případě
jednoznačně dáno zdrojovým kódem. Čítač by ze stavu X"A" pokračoval v inkrementaci až
do stavu X"F", ze kterého by přešel do stavu X"0", tedy do pracovního cyklu. Chování
čítače lze zachytit stavovým diagramem na Obr. 42.
Pracovní stavy
0
1
2
10
11
12
...
8
13
9
14
15
Nepracovní stavy
Stavový diagram dekadického čítače.
Obr. 42
Chování čítače v nepracovních stavech lze snadno ovlivnit změnou podmínky přetečení.
Pokud místo detekce čísla 9 (cit = X"9") bude podmínka detekovat čísla 9 a větší (cit >
X"8"), přejde čítač ze kteréhokoliv nepracovního stavu hned do stavu 0, tedy do pracovního
cyklu (Obr. 43).
Pracovní stavy
0
1
2
10
11
12
...
13
8
9
14
15
Nepracovní stavy
Obr. 43
Stavový diagram dekadického čítače s ošetřením návratu ze všech nepracovních
stavů ve zdrojovém kódu.
Tento urychlený návrat do pracovního cyklu bývá žádoucí především v kritických
aplikacích, kde by stav čítače mimo jeho standardní rozsah mohl způsobit problémy
v navazujících systémech. Podobné ošetření nepracovních stavů samozřejmě v některých
případech může vést k méně efektivní implementaci. V případě binárních čítačů jde ale o
velmi malý nárůst složitosti, neboť počet nepracovních stavů je obvykle mnohem menší, než
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
65
počet stavů pracovních. Možné příčiny přechodu čítače do nepracovního stavu jsou uvedeny
v kapitole 4.5, která se zabývá se stavovými automaty.
Zcela jiným typem čítače je Grayův čítač. Jde o speciální čítač, jehož výstupní signály
splňují podmínku Grayova kódování, tedy že sousední stavy se na výstupu liší vždy právě
jedním stavovým bitem. Tuto podmínku lze také definovat tak, že Hammingova vzdálenost
dvojice sousedních slov je vždy rovna 1. Nejběžněji je takto chápan tzv. reflektovaný binární
Grayův kód (binary-reflected Gray code; BRGC), který respektuje jeden možný způsob
implementace čítače pracujícího v Grayově kódu. Tento kód bude chápan pod pojmem
Grayův kód v dalším textu, pokud nebude výslovně uvedeno jinak. Existuje ale více druhů
kódu, které splňují podmínku Grayova kódu. Příkladem je tzv. vyrovnaný Grayův kód
(balanced Gray code), který oproti kódu BRGC zajišťuje, že četnost změn všech bitů čítače je
vyrovnaná. Pro ilustraci je v Tab. 2 provedeno srovnání těchto dvou kódů. Dále existuje
například Single-track Gray code, Beckett-Gray code a další. Ne všechny Grayovy kódy ale
umožňují při použití n-bitového registru realizovat čítač procházející 2n stavy, jako je tomu u
kódu BRGC.
Tab. 2
Porovnání Grayových kódů s vyznačením změn v jednotlivých bitech:
reflektovaného binárního (vlevo) a kódu s vyrovnaným počtem změn (balanced; vpravo).
g(3)
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
g(2)
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
g(1)
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
g(0)
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
HEX
0
1
3
2
6
7
5
4
C
D
F
E
A
B
9
8
0
g(3)
0
1
1
1
1
1
1
0
0
0
0
0
0
1
1
0
0
g(2)
0
0
1
1
1
1
0
0
1
1
1
1
0
0
0
0
0
g(1)
0
0
0
0
1
1
1
1
1
0
0
1
1
1
0
0
0
g(0)
0
0
0
1
1
0
0
0
0
0
1
1
1
1
1
1
0
HEX
0
8
C
D
F
E
A
2
6
4
5
7
3
B
9
1
0
Grayův kód má řadu aplikací. Jednou z nich je snímání polohy (rotační senzory
absolutní polohy), kde je nutné, aby optické snímače jednoznačně určily přechod mezi
každými dvěma sousedními hodnotami. Při použití binárního kódu hrozí, že na rozhraní
dvojice poloh dojde vlivem mechanických nepřesností k detekci několika jiných stavů. Situaci
ilustruje Obr. 44.
Na obrázku je zobrazen detail signálů výstupu kódu, který může reprezentovat výstup
senzoru polohy. V případě použití binárního kódu dochází k přechodu ze stavu 15 do stavu 0
ne přímo, ale přes několik dalších stavů. Pokud bychom výstup senzoru snímali právě v době
FEKT Vysokého učení technického v Brně
66
přechodu, byl by zjištěný údaj o poloze chybný. Při použití Grayova kódu tento efekt nehrozí,
vždy je přečtena buď ještě hodnota původní, nebo hodnota nová.
Zcela identicky se čítač používá v číslicových obvodech. Typickou aplikací jsou DA
převodníky a především paměti typu FIFO zajišťující přenos signálů mezi různými
hodinovými doménami (viz kapitola 5.4). V tomto případě nejde o snímání polohy, ale o
vzorkování výstupu čítače, který pracuje v jedné hodinové doméně jiným obvodem, který
pracuje v jiné hodinové doméně. Nezávislost hodinových domén nutně vede k riziku, že
výstup čítače bude s nenulovou pravděpodobností přečten v době, kdy dochází k jeho změně.
V případě binárního kódování opět hrozí riziko přečtení zcela odlišné hodnoty, než odpovídá
aktuálnímu stavu.
12 13 14 15 0
1
2
3
4
5
14 15 13 12 8
b(0)
g(0)
b(1)
g(1)
b(2)
g(2)
b(3)
g(3)
9 11 10 2
3
1
0
4
5
7
6 14
b(0)
g(0)
b(1)
g(1)
b(2)
g(2)
b(3)
g(3)
15
14
Obr. 44
10
2
0
10
2
Přechod mezi dvěma sousedními stavy u binárního a Grayova kódu.
Pokud budeme interpretovat binární hodnotu Grayova kódu jako číslo, nelze
jednoznačně určit posloupnost stavů (viz sloupec HEX v Tab. 2). Reflektovaný Grayův kód
lze ale snadno převést na kód binární (a naopak) pomocí jednoduchého kombinačního obvodu
(Obr. 45). Oba převody vyžadují stejný počet logických členů XOR, ale převodník Grayova
kódu na binární je zapojen tak, že hradla XOR tvoří sérií za sebou zapojených hradel. Toto
sériové zapojení tedy potenciálně může omezovat mezní pracovní kmitočet systému.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
b(0)
g(0)
b(0)
XOR
b(1)
g(1)
b(1)
XOR
g(2)
b(2)
XOR
g(3)
b(3)
Obr. 45
b(2)
b(3)
67
XOR
g(0)
XOR
g(1)
XOR
g(2)
g(3)
Převodník Grayova kódu na binární (vlevo) a binárního kódu na Grayův (vpravo).
Na principu převodu binárního kódu na Grayův je založena realizace Grayova čítače,
která je doporučena pro implementaci v návrhovém prostředí Xilinx ISE:
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
bin_cnt <= next_bin_cnt;
gray_cnt <= next_gray_cnt;
END IF;
END PROCESS;
next_bin_cnt <= bin_cnt + 1;
next_gray_cnt <= (('0' & next_bin_cnt(next_bin_cnt'HIGH DOWNTO 1))
XOR next_bin_cnt);
next_bin_cnt
+1
bin_cnt
REG
gray_cnt
B»G
REG
next_gray_cnt
Obr. 46
Příklad realizace čítače pracujícího v reflektovaném binárním Grayově kódu.
Odpovídající blokové schéma vnitřního uspořádání takového čítače je na Obr. 46. Jeho
základem je binární čítač s odpovídajícím počtem bitů. Výstup binárního čítače je převeden
pomocí kombinačního obvodu (B»G) na Grayův kód a přiveden na vstup registru. Tento
registr je vhodné použít, pokud chceme dodržet konvenci, že výstup každého uceleného bloku
(zde Grayova čítače) má být registrový. Tento registr ale zavádí do cesty signálu latenci, která
může být v některých aplikacích nepřijatelná. Na tuto realizaci čítače lze pohlížet jako na
Moorův stavový automat s registrovým výstupem, jak je popsán v kapitole 4.5.
FEKT Vysokého učení technického v Brně
68
Dalším používaným čítačem je Johnsonův čítač. Formálně čítač generuje Grayův kód
(jednotlivá slova na výstupu se liší vždy pouze v jednom bitu), ale nebývá do této kategorie
běžně zařazován. Jeho realizace je velmi jednoduchá (Obr. 47), zabírá malý počet strukturních
prvků na čipu a umožňuje čítači pracovat na vysokých pracovních kmitočtech. Základem
čítače je n-bitový posuvný registr, jehož výstup je přes invertor přiveden zpět na jeho vstup.
Nutnou podmínkou funkce je inicializace čítače při startu systému do některého z pracovních
stavů.
REG N-bit
Obr. 47
Realizace N-bitového Johnsonova čítače.
Johnsonův čítač založený na n-bitovém posuvném registru prochází celkem pouze 2∙n
stavy, což jej ve srovnání s binárním čítačem činí značně neefektivním (2n stavů). S tím
souvisí velký počet nepracovních stavů čítače, jejichž ošetření v tomto případě znamená
implementaci poměrně složitého kombinačního obvodu, který (pokud je implementován)
degraduje výhodu jednoduchosti čítače.
Dalším typem čítače založeným na posuvném registru je tzv. LFSR čítač (Linear
Feedback Shift Register). Obvod LFSR není vždy chápán jako čítač, spíše jde o jednu z jeho
aplikací. Jeho implementace je podobně jednoduchá, jako v případě Johnsonova čítače (Obr.
48). a umožňuje velmi efektivní realizaci z hlediska počtu zabraných strukturních prvků i
mezního pracovního kmitočtu.
REG N-bit
Obr. 48
Realizace LFSR ve Fibonachiho (vlevo) a Gauloisově verzi.
Hlavní využití LFSR je pro generování pseudonáhodných sekvencí, konkrétně tzv.
M-sekvencí (Maximum length sequences). Ty se používají například jako testovací sekvence
při měření chybovosti, pro rozprostírání spektra v systémech kódového multiplexu,
v kryptografických aplikacích a také tvoří základ pro generátory složitějších sekvencí
(Goldovy sekvence). Výstup pseudonáhodné sekvence je sériový, jako výstup může být
použit kterýkoliv registr (libovolná odbočka).
Jak je naznačeno na Obr. 48, existují dvě varianty implementace LFSR, Fibonachiho a
Gauloisova, které jsou rovnocenné z hlediska generované pseudonáhodné sekvence.
Z hlediska popisu je poněkud jednodušší Fibonachiho verze, proto budeme dále v textu
pracovat s touto variantou.
Vlastnosti generované M-sekvence, tedy její délka a statistické vlastnosti (především
autokorelační a kroskorelační), jsou určeny konfigurací zpětné vazby. Tím se rozumí
připojení vstupů hradla XOR/XNOR ve zpětné vazbě na konkrétní odbočky (Taps)
posuvného registru. Základním požadavkem pro generování M-sekvencí je, aby byla
generovaná sekvence na výstupu LFSR maximální možné délky (co nejdelší perioda
opakování sekvence). Ta může být u LFSR nanejvýš 2n-1 a to je i počet pracovních stavů
LFSR jako čítače. Ne každá kombinace odboček zpětné vazby ale vede na posloupnost
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
69
maximální délky. A i v případě, že se nám podaří nalézt kombinaci, která splňuje požadavek
maximální délky, mohou být statistické vlastnosti generované sekvence nevyhovující. Proto
existuje tabulka doporučených konfigurací zpětné vazby pro různé délky registrů tak, aby
generovaná pseudonáhodná sekvence splňovala i požadované statistické vlastnosti.
Tab. 3
Doporučená konfigurace zpětné vazby LFSR (TAPS) pro vybrané délky
posuvného registru (BITS).
BITS
TAPS
BITS
TAPS
BITS
TAPS
BITS
TAPS
3
3,2
16
16,15,13,4
4
4,3
17
17,14
29
29,27
42
42,41,20,19
30
30,6,4,1
43
43,42,38,37
5
5,3
18
18,11
31
31,28
44
44,43,18,17
6
6,5
19
19,6,2,1
32
32,22,2,1
45
45,44,42,41
7
7,6
20
20,17
33
33,2
46
46,45,26,25
8
8,6,5,4
21
21,19
34
34,27,2,1
47
47,42
9
9,5
22
22,21
35
35,33
48
48,47,21,20
10
10,7
23
23,18
36
36,25
49
49,4
11
11,9
24
24,23,22,17
37
37,5,4,3,2,1
50
50,49,24,23
12
12,6,4,1
25
25,22
38
38,6,5,1
51
51,50,36,35
13
13,4,3,1
26
26,6,2,1
39
39,35
52
52,49
14
14,5,3,1
27
27,5,2,1
40
40,38,21,19
53
53,52,38,37
15
15,14
28
28,25
41
41,38
54
54,53,18,17
Některé délky LFSR vyžadují, aby bylo ve zpětné vazbě zařazeno hradlo XOR se
čtyřmi vstupy. Vzhledem k tomu, že dnešní obvody FPGA mají LUT tabulky se 4 a více
vstupy, lze i takové hradlo implementovat jedinou tabulkou LUT. Proto tento fakt nemá
zásadní vliv na hardwarové nároky ani na mezní pracovní kmitočet LFSR.
Jak bylo uvedeno, počet pracovních stavů LFSR čítače se správně zvolenou konfigurací
zpětné vazby je 2n-1, má tedy právě jeden nepracovní stav, kterému se v tomto případě někdy
říká zakázaný. Pokud se čítač do tohoto stavu dostane, zůstává v něm trvale. Z toho vyplývá
požadavek na korektní inicializaci čítače při startu systému, podobně, jako v případě
Johnsonova čítače. U LFSR stačí zajistit, aby při startu systému nebyly v zakázaném stavu,
tedy je-li ve zpětné vazbě hradlo XOR, aby v registru nebyly pouze hodnoty '0', respektive
samé '1', pokud je ve zpětné vazbě hradlo XNOR.
LFSR čítač lze ve VHDL popsat jednoduchým kódem, který bývá často parametrizován
s ohledem na možnou změnu konfigurace zpětné vazby:
CONSTANT Tap_1 : INTEGER := 23;
CONSTANT Tap_2 : INTEGER := 18;
SIGNAL ShReg
: STD_LOGIC_VECTOR(Tap_1 DOWNTO 1):= (OTHERS => '1');
SIGNAL Feedback : STD_LOGIC;
...
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
ShReg <= ShReg(ShReg'HIGH-1 DOWNTO 1) & Feedback;
END IF;
END PROCESS;
Feedback <= ShReg(Tap_1) XOR ShReg(Tap_2);
70
FEKT Vysokého učení technického v Brně
Délku čítače i konfiguraci zpětné vazby je možné jednoduše ovlivnit dvojicí konstant
TAP_1 a TAP_2. Inicializace posuvného registru je provedena v deklaraci signálu s využitím
klíčového slova OTHERS, které zajistí nastavení všech prvků pole (vektoru) do požadované
hodnoty, v tomto případě '1'. Pokud by ve zpětné vazbě byl logický člen XNOR, musela by být
inicializace provedena například do stavu samých '0'.
4.5 Stavové automaty
Jako stavový automat, správněji konečný stavový automat (Finite State Machine; FSM)
je v oblasti číslicových systémů chápán synchronní sekvenční číslicový systém, který se může
nacházet v jednom ze svých definovaných stavů (konečný počet stavů). Mezi stavy přechází
na základně vstupů (vstupních signálů) a na základě stavů (případně i vstupů) pak generuje
výstupy (výstupní signály).
Stavové automaty (SA) bývají často srovnávány s mikrokontroléry a čítači. Čítač lze
považovat za specifický stavový automat, u nějž je dominantní režim čítání, tedy přechod
mezi „sousedními“ stavy. Naopak stavové automaty lze považovat za zobecněné čítače. Na
mikroprocesory můžeme nahlížet jako na velmi složité stavové automaty, u nichž je počet
stavů sice konečný, ale z praktického hlediska tak velký, že nemá význam pracovat se
stavovými diagramy a pro jejich popis se používají jiné metody.
Stavové automaty se v číslicové technice používají jako obvody pro rychlé řízení a
rozhodování. Typickou aplikací jsou dekodéry, arbitry sběrnic, řadiče standardních rozhraní
(UART, SPI, I2C…), obvody realizující nižší vrstvy komunikačních protokolů a podobně
(Ethernet MAC, PCS/PMA) atd. Obecně jde o aplikace, které vyžadují relativně komplexní,
rychlé a časově přesné řízení.
Mikroprocesory jsou navrženy tak, aby dokázaly vykonávat co možná největší množství
nejrůznějších funkcí. Jejich univerzálnost ale znamená, že jsou relativně pomalé a tak přesto,
že je samozřejmě lze pro výkon výše uvedených funkcí naprogramovat, není jejich výpočetní
výkon dostatečný pro zajištění potřebné propustnosti, časové přesnosti nebo by jejich použití
bylo jednoduše neefektivní.
Typickým příkladem je realizace rozhraní UART (Universal Asynchronous Receiver
Transmitter) v mikroprocesorech. Většina moderních mikroprocesorů má jednu nebo více
periferií tohoto typu. Každá z těchto periferií je stavovým automatem implementovaným
pomocí klopných obvodů a kombinačních logických buněk na čipu. Pokud procesor takovou
periferii nemá, nebo jich nemá dostatečný počet, je možné takové rozhraní realizovat
programově (softwarově) s využitím obecných vstupně výstupních pinů (GPIO; General
Purpose Input / Output). V tom případě je část programu (část instrukcí) procesoru určena pro
emulaci tohoto rozhraní. Fakticky jde o softwarovou implementaci stavového automatu.
Softwarová realizace stavového automatu je sice velmi efektivní z hlediska
hardwarových nároků, ale vyžaduje část výpočetních prostředků (času) procesoru. U
automatů, u kterých je kritické časování jednotlivých kroků, bývá obtížné (pokud vůbec
možné) realizovat automat softwarově. Typickým příkladem jsou vysokorychlostní rozhraní,
jako vyšší verze rozhraní USB, Ethernet, PCI-Express a podobně. Drtivá většina procesorů
ani není schopna pracovat na rychlostech, na kterých probíhá přenos dat, proto je nutné pro
obsluhu těchto rozhraní na nižší úrovni použít právě stavové automaty.
V praxi jsou návrháři číslicových systémů (systémoví architekti) postaveni před
problém, jakým způsobem realizovat jednotlivé funkce zařízení. Funkce lze rozlišit podle
kritičnosti a potřebné rychlosti reakce. Obecně platí, že funkce kritické (např. bezpečnostní) a
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
71
především funkce vyžadující rychlou a přesnou odezvu musí být realizovány pomocí
stavových automatů. Z hlediska rychlosti hovoříme o tzv. nanosekundové logice (nanosecond
logic), což zahrnuje rozsah doby reakce (přesnosti řízení) od zlomků nanosekund po stovky
nanosekund. Funkce, které jsou naopak méně náročné na obsluhy (např. obsluha
uživatelských rozhraní v podobě klávesnice, LED zobrazovačů a podobně), vyžadují dobu
reakce v řádu jednotek až stovek milisekund, bez požadavku na přesnost reakce (v časové
oblasti). Blokům, které realizují takové funkce, se říká milisekundová logika (millisecond
logic). Aplikace, které vyžadují přesnost a rychlost odezvy mezi těmito extrémy, tedy
v rozsahu přibližně od jedné mikrosekundy po stovky mikrosekund, jsou realizovány bloky,
které se označují jako mikrosekundová logika (microsecond logic).
Z hlediska realizace bývá ve většině jednoznačné rozhodnutí realizace dvojice krajních
případů. Nanosekundová logika je téměř vždy realizována pomocí stavových automatů,
protože procesory jsou příliš pomalé. Použití výkonného procesoru pro realizaci rychlé, ale
v principu jednoduché funkce, by bylo značně neefektivní. Naopak milisekundová logika je
pak ve většině případů realizována pomocí procesorů, neboť ten má pro takové operace
dostatečný výpočetní výkon, navíc jej lze využít pro více „pomalých“ úloh a jeho konfigurace
(programování) je snazší, než tvorba stavového automatu. Pro realizaci mikrosekundové
logiky je nutné dobře zvážit obě možnosti realizace. Výběr realizace bývá klíčový pro celý
systém a může zásadně rozhodnout o výsledné kvalitě a spolehlivosti produktu (tedy o jeho
konečném komerčním úspěchu či neúspěchu).
Dále se budeme zabývat pouze stavovými automaty (FSM). Formálně lze stavové
automaty rozdělit na Moorovy a Mealyho. Moorův stavový automat (Obr. 49) je takový
automat, u něhož stav výstupů závisí pouze na jeho aktuálním stavu. U Mealyho automatu
(Obr. 50) stav výstupů závisí nejen na současném stavu, ale také na stavu vstupů. Automaty
mohou mít buď kombinační výstupy, nebo registrové výstupy. Na obrázcích jsou zachyceny
pouze varianty s registrovým výstupem. Odpovídající verze s kombinačním výstupem jsou
identické, pouze postrádají výstupní registr.
soucasny_stav
vystupy
pristi_stav
vstupy
KČ1
clk
rst
Obr. 49
STATE
REG
KČ2
clk
OUT
REG
Moorův stavový automat s registrovým výstupem.
FEKT Vysokého učení technického v Brně
72
soucasny_stav
vystupy
pristi_stav
vstupy
STATE
REG
KČ1
clk
rst
Obr. 50
OUT
REG
KČ2
clk
Mealyho stavový automat s registrovým výstupem.
Oba automaty se skládají ze tří základních částí: stavového registru (STATE REG; state
register), z kombinační části pro stanovení příštího stavu (KČ1, někdy také logika příštího
stavu; next state logic) a z výstupní kombinační části (KČ2 zvaná výstupní dekodér; output
decoder), která na základě současného stavu (případně i stavu vstupů) určuje stav výstupů.
Pokud jde o automat s registrovým výstupem, pak je výstup kombinační části přiveden do
dalšího registru (OUT REG; output register), který je řízen stejným hodinovým signálem,
jako stavový registr. Stavový automat s registrem na výstupu se označuje jako Pipelined
Moor/Mealy FSM.
Pokud aplikujeme tuto terminologii na binární čítač na Obr. 41, pak blok realizující
inkrementaci stavu (+1) tvoří KČ1. Naproti tomu KČ2 je v případě binárního čítače zcela
redukována na pouhé propojení. Takový automat se označuje jako SA se stavovým výstupem
(speciální případ SA). Jelikož stav výstupních signálů tohoto SA (čítače) závisí pouze na jeho
současném stavu, jde o Moorův stavový automat. Naproti tomu čítač pracující
v reflektovaném Grayově kódu (Obr. 46) je typickým příkladem Moorova stavového
automatu s registrovým výstupem. KČ2 je v tomto případě tvořena převodníkem binárního
kódu na Grayův kód a ten je následován výstupním registrem (OUT REG).
Stavový registr musí být v FPGA vždy realizován klopným obvodem typu D řízeným
hranou (Flip-Flop). Pokud by pro realizaci byl použit klopný obvod řízený úrovní (Latch),
došlo by po dobu trvání aktivní úrovně hodinového signálu k uzavření kombinační zpětné
vazby (combinatorial feedback loop) a nepredikovatelnému chování automatu. Tato situace je
demonstrována na příkladu binárního čítače na Obr. 51, včetně příslušného zdrojového kódu
(VHDL).
PROCESS (clk) BEGIN
IF clk = '1' THEN
citac <= citac + 1;
END IF;
END PROCESS;
citac
1
2
3
4
citac
citac + 1
5
+1
clk
citac+1
Obr. 51
2
3
4
5
clk
Latch
6
Nevhodné použití staticky řízeného klopného obvodu (Latch) jako stavového
registru stavového automatu (binárního čítače).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
73
Návrhové systémy takový obvod dovolí implementovat (klopné obvody v FPGA lze
nakonfigurovat do funkce LATCH). Během syntézy jsou ale veškeré takto vzniklé klopné
obvody typu Latch v navrženém systému detekovány a návrhář je o každém z nich
informován formou upozornění (warning; viz kapitola 4.2). Potom je na návrháři, aby tyto
chyby odstranil, případně jiným způsoben zajistil dodržení časových parametrů (což je u
stavových automatů realizovaných v FPGA prakticky nemožné). Korektní ošetření je v tomto
případě jednoduché a spočívá v nahrazení staticky řízeného klopného obvodu dynamicky
řízeným (Obr. 52).
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
citac <= citac + 1;
END IF;
END PROCESS;
citac
1
citac
citac + 1
2
+1
clk
citac+1
Obr. 52
2
clk
FlipFlop
3
Korektní použití dynamicky řízeného klopného obvodu (Flip-Flop) jako
stavového registru stavového automatu (binárního čítače).
Popis stavového automatu (čítače) dle Obr. 52 je možné v jazyce VHDL provést
několika způsoby, přičemž výsledné číslicové systémy budou z hlediska chování identické.
Jejich vnitřní struktura (implementace) ale může být různá, neboť syntetizéry zohledňují
způsob psaní kód při vytváření a následné optimalizaci těchto systémů. Tuto vlastnost
syntetizérů lze demonstrovat na implementaci jednoduchého obvodu, jakým je binární čítač
(Obr. 53).
soucasny_stav
pristi_stav
+1
Obr. 53
clk
vystup
REG
Binární čítač jako stavový automat.
Zdrojový kód VHDL, který obvod popisuje, jako čítač, v podstatě odpovídá kódu
uvedenému v kapitole 4.3. Pro ilustraci možností jazyka VHDL je zde uvedena mírně odlišná
varianta popisu využívající stavový signál typu INTEGER s vymezením rozsahu (RANGE):
FEKT Vysokého učení technického v Brně
74
ENTITY citac IS
PORT ( clk
vystup
END citac;
: IN STD_LOGIC;
: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
ARCHITECTURE Behavioral OF citac IS
SIGNAL soucasny_stav: INTEGER RANGE 0 TO 15 := 0;
BEGIN
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
soucasny_stav <= soucasny_stav + 1;
END IF;
END PROCESS;
vystup <= STD_LOGIC_VECTOR(soucasny_stav,4);
END Behavioral;
Syntetizér takový kód interpretuje (rozpozná) jako čítač a použije pro jeho realizaci
takovou strukturu, která je optimální právě pro realizaci čítače. Stejnou funkci lze zachytit i
VHDL kódem, který popisuje chování čítače jako stavového automatu. Stavové automaty lze
popsat pomocí samostatných procesů, z nichž každý popisuje právě jeden blok automatu
(KČ1, stavový registr, případně i KČ2 a výstupní registr). Odpovídající popis binárního čítače
je pak zde:
...
SIGNAL pres_st: INTEGER RANGE 0 TO 15 := 0;
SIGNAL next_st: INTEGER RANGE 0 TO 15;
BEGIN
PROCESS (pres_st) BEGIN
CASE pres_st IS
WHEN
0
=> next_st <= 1;
WHEN
1
=> next_st <= 2;
...
WHEN OTHERS => next_st <= 0;
END CASE;
END PROCESS;
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
pres_st <= next_st;
END IF;
END PROCESS;
PROCESS (pres_st) BEGIN
CASE pres_st IS
WHEN
0
=> vystup <= X"0";
WHEN
1
=> vystup <= X"1";
...
WHEN OTHERS => vystup <= X"F";
END CASE;
END PROCESS;
...
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
75
První proces popisuje KČ1, druhý proces stavový registr a třetí proces výstupní
kombinační část KČ2. Druhým způsobem popisu stavových automatů je popis pomocí
jediného procesu, kdy jsou všechny části SA sloučeny do jednoho procesu. Tento způsob
zápisu bývá u jednoduchých stavových automatů přehlednější, ale je náchylnější na chybu při
návrhu a vyžaduje tak větší pozornost návrháře vytvářejícího popis.
...
PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
CASE pres_st IS
WHEN
0
=> pres_st <= 1; vystup <= "0";
WHEN
1
=> pres_st <= 2; vystup <= "1";
...
WHEN OTHERS => pres_st <= 0; vystup <= "F";
END CASE;
END IF;
END PROCESS;
...
Výsledek implementace je v obou posledně uvedených případech stejný, neboť oba
způsoby zápisu syntetizér korektně interpretuje jako popis stavového automatu. Proto
syntetizér volí způsob implementace a optimalizační postupy odpovídající obecně stavovým
automatům. Výsledek implementace se tak může lišit (a obvykle také liší) od implementace
kódu, v němž syntetizér čítač přímo rozpoznal. Výsledek se pak liší nikoliv funkcí, ale
množstvím a způsobem propojení strukturních prvků, které jsou potřebné pro jejich realizaci.
To ovlivňuje jednak efektivitu implementace a také mezní pracovní frekvenci takového
systému.
Pokud je čítač implementován jako stavový automat, závisí vlastnosti jeho
implementace na zvoleném způsobu kódování stavů (to platí obecně pro stavové automaty).
Kódováním stavů se rozumí přiřazení jednoznačné binární kombinace každému z pracovních
stavů automatu. Pokud syntetizér rozpozná ve zdrojovém kódu stavový automat, dokáže
jednotlivým stavům přiřadit vhodná kódová slova nezávisle na samotném jejich zápisu ve
zdrojovém kódu. Jinými slovy, v uvedeném příkladu binárního čítače nelze automaticky
předpokládat, že stav čítače 0 bude zakódován jako čtyřbitové binární slovo "0000".
Syntetizéry mají několik předdefinovaných způsobů kódování stavů, jejichž použití se řídí
nastavením optimalizačních kritérií syntetizéru.
Ukázka některých typů kódování stavů je v Tab. 4. Některé kódy odpovídají kódům, ve
kterých pracují běžné čítače, v jiných případech může jít o kódy, které jsou určeny speciálně
pro stavové automaty a na první pohled nemají zvláštní smysl (např. Speed1 implementovaný
v syntetizéru XST Xilinx).
FEKT Vysokého učení technického v Brně
76
Tab. 4
Stav
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Různé způsoby kódování stavů stavových automatů.
Sequential Compact Gray Johnson
0000
0000 0000 00000000
0001
1000 0001 00000001
0010
0100 0011 00000011
0011
1100 0010 00000111
0100
0110 0110 00001111
0101
1110 0111 00011111
0110
1010 0101 00111111
0111
0010 0100 01111111
1000
0111 1100 11111111
1001
1111 1101 11111110
1010
0011 1111 11111100
1011
1011 1110 11111000
1100
1001 1010 11110000
1101
0001 1011 11100000
1110
0101 1001 11000000
1111
1101 1000 10000000
Kódování
One-hot
0000000000000001
0000000000000010
0000000000000100
0000000000001000
0000000000010000
0000000000100000
0000000001000000
0000000010000000
0000000100000000
0000001000000000
0000010000000000
0000100000000000
0001000000000000
0010000000000000
0100000000000000
1000000000000000
Speed1
00100000000000000000
00010000000000000010
00001000000000000001
00000100000000000011
00000010000010000000
00000001000010000010
00000000100010000001
00000000010010000011
01000000001000000000
01000000000100000010
01000000000000100001
01000000000001000011
01000000000010010000
01000000000010001010
11000000000010000001
00000000000000000100
Některé kódy vedou na realizaci, která je optimální z hlediska délky slova popisujícího
stavy. Jde například o sekvenční, kompaktní a Grayovo kódování, které pro N-stavový
automat vyžadují použití minimálního počtu M registrů, přičemž M = ⌈ log2(N) (výsledek
logaritmu zaokrouhlen na celá čísla nahoru). Efektivita z hlediska počtu registrů ale může vést
na složitější kombinační části automatu. Naproti tomu kódování „1 z N“ (One-hot) vyžaduje
pro stejný stavový automat použití M = N registrů. Pro automaty s velmi velkým počtem stavů
je takové kódování evidentně nevýhodné, neboť je velmi náročné na potřebný počet
strukturních prvků. Na druhou stranu toto kódování obvykle umožňuje významně zjednodušit
kombinační části stavového automatu a často jsou takové automaty schopny pracovat na
vyšším mezním kmitočtu, než varianty s úsporným kódováním. Porovnání výsledku
implementace stavového automatu (čítače) pro vybrané typy kódování je uvedeno v Tab. 5.
V tomto konkrétním případě, kdy jde o stavový automat bez větvení a bez řídicích vstupů,
dosahuje nejlepších výsledků implementace se sekvenčním kódováním, která přesně odpovídá
implementaci automatu jako čítače. Kódování 1 z N je v tomto případě nevýhodné, neboť
výstupní signály nelze jednoduše odvodit ze stavového signálu, jako je tomu u sekvenčního
kódování.
Obecně se doporučuje používat binární (kompaktní) kódování pro SA s malým počtem
stavů (max. 8). Pro větší SA je toto kódování nevýhodné kvůli složité KČ1, proto se pro
středně velké SA (s počtem stavů přibližně do 32) doporučuje používat kódování 1 z N. Pro
velké stavové automaty je pak preferováno Grayovo kódování, které při správném návrhu
(podobně jako kódování 1 z N) umožňuje realizovat systémy, v nichž se zároveň mění jen
malý počet bitů.
Volba kódování může být samozřejmě plně v rukou návrháře. V nastavení syntetizéru
lze obvykle zvolit možnost extrakce kódování stavů přímo ze zdrojového kódu (bývá
označováno jako „User encoding“). V tom případě syntetizér převezme kódy stavů uvedené
ve zdrojovém kódu. Alternativně bývá možné automatické rozpoznávání stavových automatů
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
77
ve zdrojovém kódu zcela zakázat, čímž se ale připravíme o možnosti optimalizačních
algoritmů pro stavové automaty zabudovaných v syntetizérech.
Tab. 5
Porovnání mezní frekvence a hardwarových nároků na implementaci čtyřbitového
binárního čítače pro různé způsoby jeho realizace (cílový obvod Xilinx Spartan-6
xc6slx45t-2ffg484)
Typy popisu
Kódování stavů
Mezní frekvence [MHz]
Klopné obvody (FF)
LUT
One-hot
262
16
57
Stavový automat
Speed1
Compact
287
375
20
4
100
6
Gray
375
4
6
Sequential
375
4
4
Čítač
375
4
4
S problematikou kódování stavu úzce souvisí problematika nepracovních stavů
automatů. Jde o stavy, kterých může nabývat stavový registr, ale nepatří do pracovního cyklu
automatu, a jde o identický problém, jako například v případě čítačů s neúplným cyklem
(kapitola 4.4, Obr. 42, Obr. 43). Nejmenšího počtu nepracovních stavů lze dosáhnout při
použití úsporných způsobů kódování, jako je binární (sekvenční, kompaktní) nebo Grayovo
kódování. V případě binárního čítače (Tab. 4) stavový automat dokonce nepracovní stavy
nemá. Naopak stejný automat, který využívá kódování 1 z N, se může nacházet
v 2N = 216 = 65 536 stavech, z nichž je pouze 16 pracovních a zbývajících 65 520 je
nepracovních.
Za běžného provozu by se stavový automat do nepracovních stavů neměl dostat.
Existují ale vlivy, které mohou takový stav navodit:
 Nekorektní zapnutí, nekorektní napájecí napětí za provozu
 Nekvalitní vstupní signály vedoucí k metastabilitě
 Problémy s časováním, nedodržení mezní pracovní frekvence
 Nadměrné zahřívání
 Radioaktivita
 Nesprávný návrh (přetečení…)
Nepracovní stavy jsou potenciálně nebezpečné, neboť v nich zpravidla není explicitně
definováno chování stavového automatu. Problematiku lze rozdělit do dvojice kategorií:
 Přechod mezi stavy: pokud se automat dostane do nepracovního stavu, není
definováno, jak (nebo zda vůbec) se z něj dostane zpět do pracovního cyklu.
Hrozí tedy, že automat zůstane v nepracovních stavech.
 Výstupní signály: v nepracovních stavech není požadovaný stav výstupních
signálů definován a může tak dojít ke generování konfliktních signálů (např.
současný požadavek zápisu a čtení z paměti, indikace příjmu platného i
neplatného rámce zároveň a podobně).
Z těchto důvodů je především u kritických aplikací nutné zajistit korektní chování
stavových automatů v nepracovních stavech. Mezi kritické aplikace patří například zařízení
pro průmysl (industrial), letectví (aerospace), vesmír (space), automobily (automotive) a
armádu (military).
78
FEKT Vysokého učení technického v Brně
Způsobů ošetření nepracovních stavů je několik, přičemž každý má některé výhodné a
nevýhodné vlastnosti, a lze je navzájem kombinovat.
 Explicitní ošetření nepracovních stavů; vyžaduje specifikovat ve zdrojovém
kódu jak použité kódování stavů (neponechat rozhodnutí na syntetizéru), tak pro
každý stav uvést chování automatu (přechody mezi stavy) a hodnoty výstupních
signálů. Z hlediska implementace jde o hardwarově nejnáročnější variantu,
která je ale nejspolehlivější a pro kritické aplikace preferovaná.
 Automatické ošetření nepracovních stavů; některé syntetizéry umožňují
automaticky ošetřit nepracovní stavy tak, že je garantován návrat automatu do
pracovního cyklu. Návrat je ale proveden do jednoho vybraného stavu, který
může (ale nemusí) být výchozím stavem pracovního cyklu automatu. Tento
způsob ošetření neumožňuje kontrolovat výstupní signály v okamžiku, kdy je
automat v nepracovním stavu.
 Hlídací časovač (Watchdog); způsob, který je běžně používán
u mikroprocesorů, se spoléhá na externí časovač. Ten je inkrementován
nezávisle na běhu kontrolovaného stavového automatu. Automat jej musí vždy
během stanovené doby nulovat (vhodným pracovním nebo dedikovaným
výstupem), jinak dojde k přetečení časovače. Při přetečení typicky vyvolá
časovač reset automatu, nebo přechod do speciálního definovaného stavu
určeného pro ošetření návratu z nepracovního cyklu. Tento způsob
implementace je vhodný pro méně kritické aplikace.
 Redundantní systém; z hlediska nároků na implementaci jde o nejnáročnější
způsob implementace, který je použit tam, kde nelze akceptovat jakýkoliv
výpadek funkce stavového automatu (vesmír, armáda). Obvykle se používá
technika trojité implementace systému a následně proces majoritní volby.
Systém musí být navržen tak, aby bylo vysoce nepravděpodobné, že dva
z trojice implementovaných identických subsystémů budou postiženy náhodnou
chybou (typicky radiace). Chyba jednoho ze systémů je pak snadno
detekovatelná a systém, který je v nekorektním stavu je snadné pomocí dvojice
korektně fungujících systémů uvést do pracovního stavu. Nutno podotknout, že
tento způsob ošetření řeší nejen problém nepracovních stavů, ale také nekorektní
přechody mezi pracovními stavy, což ostatní metody neumožňují.
 Umožnit obsluze uvést automat do výchozího stavu; nejjednodušší způsob
ošetření, který se používá spíše na vyšší úrovni. Obsluha má možnost uvést celý
systém (skládající se z mnoha stavových automatů) do výchozího stavu.
Typickým příkladem jsou osobní počítače vybavené tlačítkem reset. Jde o
nejjednodušší způsob vhodný prakticky jen pro spotřební elektroniku.
4.6 Praktický návrh Mealyho a Moorova automatu ve VHDL
Stavové automaty lze navrhovat různými způsoby a to jak z hlediska jejich struktury,
tak z hlediska použitého stylu popisu. V této kapitole jsou názorně předvedeny nejběžnější
styly popisu SA pomocí VHDL, a naznačeny možné cesty ke zjednodušení samotných SA
rozdělením navrhovaného číslicového bloku na více menších částí (použitím jednoduchých
externích bloků, jako jsou multiplexory, posuvné registry, paměti a podobně). Obvykle totiž
není efektivní považovat celý navrhovaný číslicový systém za jeden velký stavový automat,
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
79
byť jej tak lze chápat. Návrh systému složeného z několika menších kooperujících SA je
podstatně snazší, přehlednější, spolehlivější a proto v praxi preferovaný.
Tx_ Data
Tx_start
Data
8b
8b
CLK
Start bit
...
Tx_ Data
IDLE
Stop bit
1
1 0
data(0) = LSB
Obr. 54
0
1
0
0
1
Start bit
...
IDLE
...
data(7) = MSB
Příklad aplikace stavového automatu jako vysílače dat rozhraní UART.
Vzorové návrhy Moorova i Mealyho stavového automatu s kombinačním i registrovým
výstupem budou demonstrovány na jednoduchém vysílači sériových dat typu UART (Obr.
54). Jde o typickou aplikaci stavového automatu, jehož použití umožní přenášet data po
sériové lince rychlostmi desítek Mb/s, aniž by byl řídicí obvod (obvykle procesor) zatěžován
obsluhou fyzického rozhraní. Pro jednoduchost budeme předpokládat, že frekvence vstupního
hodinového signálu CLK [Hz] odpovídá požadované přenosové rychlosti [Bd]. Vstupem
automatu je signál Data o šířce 8 bitů, který tvoří datové slovo, které má být v sériové podobě
vysláno na linku (výstupní signál Tx_Data) v okamžiku, kdy je aktivován vstupní signál
Tx_start.
Protokol UART je definován takto: pokud je vysílač dat v nečinnosti, je na výstupu
klidová úroveň log. 1 (IDLE). Vysílání datového slova při aktivaci signálu Tx_start začíná
tzv. start bitem, který je definován jako úroveň log. 0 na lince trvající po dobu jednoho
symbolu (TS = 1/f, kde f je přenosová rychlost [Bd], v našem příkladu zároveň i frekvence
hodinového signálu CLK [Hz]). Následuje odvysílání osmi datových bitů ze vstupu Data
v pořadí od LSB po MSB, každý z bitů je na výstup vystaven po dobu TS. Po odvysílání
posledního datového bitu je odvysílán tzv. stop bit, což je symbol log. 1 opět trvající po dobu
TS. Pokud je po skončení stop bitu aktivní požadavek Tx_start, může být zahájeno vysílání
dalšího datového slova a to start bitem. V opačném případě přechází linka do klidové úrovně
log. 1 (IDLE).
Popsanou funkci lze realizovat stavovým automatem, který má dva vstupy (Data a
Tx_start) a jeden výstup (Tx_Data) tak, jak je zobrazen na Obr. 54. Takový
„bezmyšlenkový“ přístup ale vede na poměrně složitou implementaci a nepřehledný kód,
proto je zde uveden pouze jako odstrašující případ.
Popis provedeme nejdříve pro Moorovu verzi automatu (Obr. 55), která je obvykle
jednodušší z hlediska popisu grafického i pomocí HDL kódu. Základem pro tvorbu popisu
stavového automatu je stavový diagram (Obr. 56), což je orientovaný graf, jehož uzly tvoří
FEKT Vysokého učení technického v Brně
80
stavy, hrany pak přechody mezi stavy. V případě Moorova automatu závisí výstupní signály
výhradně na jeho současném stavu. Proto jsou hodnoty výstupních signálů uváděny přímo ve
stavech (uzlech). U přechodů (hran) jsou pak uvedeny hodnoty vstupních signálů, které
podmiňují daný přechod. Pro jednoduchost nejsou v diagramu uvedeny přechody, které
zajišťují setrvání automatu v aktuálním stavu (např. ve stavu Idle automat zůstává, pokud je
signál Tx_start = 0).
pres_state
next_state
Data,
Tx_start
KČ1
clk
Obr. 55
REG
Tx_data
KČ2
Blokový diagram implementace Moorova stavového automatu pro vysílač UART
(verze 1).
Výchozí stav automatu je stav Idle. Pokud je SA v tomto stavu, je na výstupu Tx_Data
signál s log. úrovní 1. Jakmile je aktivován signál Tx_start, dojde k přechodu SA do stavu
Start_b. V tomto stavu je na výstupu log. úroveň 0. Ze stavu Start_b se SA přesouvá do stavu
bit0_0 nebo bit0_1 podle toho, zda je na nejméně významné pozici vstupu Data log. 0 nebo 1.
Podle toho je také na výstupu Tx_Data příslušná logická úroveň. Následuje přechod na bit1_0
nebo bit 1_1 opět podle stavu dalšího z bitů vstupního signálu Data. Takto se postuje až na
stavy bit_7_0/1, po nichž následuje bezpodmínečný přechod do stavu Stop_b. Odtud
přechází automat do výchozího stavu (pokud není aktivní požadavek na vysílání dat Tx_start)
nebo do stavu Start_b (vstup Tx_start je aktivní). Ve stavovém diagramu (ani v následujícím
kódu) pro jednoduchost není zachycena problematika uložení datového slova pro případ, že
by se během vysílání změnilo datové slovo na vstupu Data.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
data(1)=0
Tx_start=1
Idle
1
data(0)=0
Start_b
0
data(0)=1
bit0_0
0
data(7)=0
bit1_0
0
bit7_0
0
...
data(1)=1
Stop_b
1
data(1)=0
bit0_1
1
data(1)=1
81
bit1_1
1
bit7_1
1
data(7)=1
Tx_start=1
Tx_start=0
stav
Tx_data
Obr. 56
stav = uzel
přechody = hrany
stavový diagram = orientovaný graf
Stavový diagram Moorova stavového automatu pro vysílač UART (verze 1).
Kompletní VHDL kód odpovídající stavovému diagramu je postupně rozepsán níže.
Deklarace použitých knihoven a sloh, stejně jako deklarace entity je společná pro všechny
dále uvedené příklady vztahující se ke stavovému automatu vysílače UART.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
-----------------------------------------------------------------ENTITY UART_Tx_Moor_Comb IS
PORT ( CLK
: IN STD_LOGIC;
Data
: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
Tx_start
: IN STD_LOGIC;
Tx_Data
: OUT STD_LOGIC);
END UART_Tx_Moor_Comb;
Následuje deklarativní část architektury, která obsahuje definici uživatelského datového
typu t_stav_UART, který je definován výčtem. Následuje deklarace dvojice signálu
pres_state a next_state, které jsou uvedeného typu. Signál pres_state má definovanou
výchozí hodnotu, což je nezbytné, jelikož je výstupním signálem registru. Tato definice je
podstatná jak pro simulaci, tak v některých návrhových systémech i pro implementaci (viz.
výše). Výčtové datové typy se pro popis stavových automatů ve VHDL doporučuje používat,
neboť to zvyšuje čitelnost kódu, umožňuje syntetizérům efektivně rozpoznat a optimalizovat
SA a zároveň (díky striktní typovosti VHDL) zavádí kontrolní mechanizmus, který eliminuje
některé běžné chyby.
ARCHITECTURE Behavioral OF UART_Tx_Moor_Comb IS
TYPE t_stav_UART IS (st_idle, st_start_b,
st_bit_0_0, st_bit_0_1, st_bit_1_0, st_bit_1_1,
st_bit_2_0, st_bit_2_1, st_bit_3_0, st_bit_3_1,
st_bit_4_0, st_bit_4_1, st_bit_5_0, st_bit_5_1,
st_bit_6_0, st_bit_6_1, st_bit_7_0, st_bit_7_1, st_stop_b);
SIGNAL pres_state
: t_stav_UART := st_idle;
SIGNAL next_state
: t_stav_UART;
-----------------------------------------------------------------BEGIN
FEKT Vysokého učení technického v Brně
82
Samotný popis je tvořen trojicí procesů, z nichž každý odpovídá jednomu bloku z Obr.
55. Jako první je uveden popis první kombinační části (KČ1), tedy tzv. logiky příštího stavu.
Jde o kombinační proces s jediným příkazem CASE, který na základě současného stavu
(pres_state) a vstupních signálů (Tx_start a Data) generuje hodnotu signálu
next_state, která je vstupem stavového registru.
------------------------------------------------------------------- Kombinacni cast 1
PROCESS (pres_state, Tx_start, Data) BEGIN
CASE pres_state IS
WHEN st_idle
=> IF Tx_start = '1' THEN
next_state <= st_start_b;
ELSE
next_state <= st_idle;
END IF;
WHEN st_start_b
=> IF Data(0) = '0' THEN
next_state <= st_bit_0_0;
ELSE
next_state <= st_bit_0_1;
END IF;
WHEN st_bit_0_0 | st_bit_0_1
=> IF Data(1) = '0' THEN
next_state <= st_bit_1_0;
ELSE
next_state <= st_bit_1_1;
END IF;
...
WHEN st_bit_6_0 | st_bit_6_1
=> IF Data(7) = '0' THEN
next_state <= st_bit_7_0;
ELSE
next_state <= st_bit_7_1;
END IF;
WHEN st_bit_7_0 | st_bit_7_1
=> next_state <= st_stop_b;
WHEN st_stop_b
=> IF Tx_start = '1' THEN
next_state <= st_start_b;
ELSE
next_state <= st_idle;
END IF;
END CASE;
END PROCESS;
Popis stavového registru je velmi jednoduchý; s každou aktivní hranou hodinového
signálu je provedena aktualizace současného stavu SA, příští stav se stává stavem současným.
Tento registr zajišťuje kontrolovaný přechod mezi jednotlivými stavy.
-- Stavovy registr
PROCESS (CLK) BEGIN
IF rising_edge(CLK) THEN
pres_state <= next_state;
END IF;
END PROCESS;
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
83
Posledním blokem je výstupní kombinační část (KČ2), která na základě současného
stavu (pres_state) generuje odpovídající výstupní signál Tx_Data.
-- Kombinacni cast 2
PROCESS (pres_state) BEGIN
CASE pres_state IS
WHEN st_idle | st_stop_b |
st_bit_0_1 | st_bit_1_1
st_bit_4_1 | st_bit_5_1
Tx_Data <= '1';
WHEN st_start_b |
st_bit_0_0 | st_bit_1_0
st_bit_4_0 | st_bit_5_0
Tx_Data <= '0';
END CASE;
END PROCESS;
| st_bit_2_1 | st_bit_3_1 |
| st_bit_6_1 | st_bit_7_1
=>
| st_bit_2_0 | st_bit_3_0 |
| st_bit_6_0 | st_bit_7_0
=>
END Behavioral;
Časový průběh signálů, který demonstruje funkci takto zapsaného stavového automatu,
je uveden na Obr. 57. Je na něm úmyslně zvýrazněn důsledek použití kombinačního výstupu
SA (signál Tx_Data). Na něm je patné zpoždění vzhledem k aktivní hraně hodinového
signálu, které je navíc v čase proměnné (nestejná doba odezvy výstupní kombinační části na
vstupní signály). To způsobuje přídavný fázový šum (jitter) přítomný ve výstupním signálu a
projevuje se mj. nestejnou dobou trvání jednotlivých symbolů (na obrázku T1 a T2; ideálně
T1 = T2). Dále se mohou na výstupu Tx_Data objevovat zákmity jako důsledek hazardů
vznikajících ve výstupní kombinační části. Zákmitům na výstupu kombinační části lze obecně
zabránit pouze v případě, že se na jejím vstupu mění vždy pouze jeden ze signálů. V případě
tohoto SA to nelze zajistit ani při použití Grayova kódování, neboť stavový diagram je
rozvětven.
CLK
Data(7 DOWNTO 0) = "01010101"
Tx_start
next_state
pres_state
Idle
Start_b
Idle
bit0_1
Start_b
T1
Tx_Data
Obr. 57
bit1_0
bit0_1
bit2_1
bit1_0
bit3_0
bit2_1
bit4_1
bit3_0
T2
Časový průběh signálů vysílače dat rozhraní UART.
Nejjednodušší metodou pro odstranění zpoždění a hazardů na výstupu kombinační části
Moorova automatu je použití dalšího registru, který oddělí kombinační část od samotného
výstupu. Takový SA se pak označuje jako Moorův SA s registrovým výstupem (pipelined
Moor FSM). Potřebné změny ve výše uvedeném kódu spočívají v nahrazení výstupního
signálu (portu) Tx_Data uvnitř výstupního kombinačního procesu novým vnitřním signálem,
např. Tx_Data_i. Tento nový vnitřní signál je pak vstupem nového procesu realizujícího
výstupní registr.
FEKT Vysokého učení technického v Brně
84
...
SIGNAL Tx_data_i:
STD_LOGIC;
...
-- Kombinacni cast 2
...
WHEN st_idle | st_stop_b |
st_bit_0_1 | st_bit_1_1 |
st_bit_4_1 | st_bit_5_1 |
Tx_data_i <= '1';
WHEN st_start_b |
st_bit_0_0 | st_bit_1_0 |
st_bit_4_0 | st_bit_5_0 |
Tx_data_i <= '0';
...
-- Výstupní registr
PROCESS (CLK) BEGIN
IF rising_edge(CLK) THEN
Tx_data <= Tx_data_i;
END IF;
END PROCESS;
st_bit_2_1 | st_bit_3_1 |
st_bit_6_1 | st_bit_7_1
=>
st_bit_2_0 | st_bit_3_0 |
st_bit_6_0 | st_bit_7_0
=>
Jelikož signál Tx_Data nyní výstupem registru, je nutné mu přiřadit výchozí hodnotu.
To lze provést přímo při deklaraci portu v entitě. Obvykle se ale k tomuto účelu používá další
pomocný vnitřní signál, aby deklarace entity definice výchozích hodnot neobsahovala a byla
tak přehlednější.
Tx_data
: OUT STD_LOGIC := '1');
Důsledkem použití registru je zpoždění výstupního signálu o jeden hodinový takt
vzhledem k původnímu časovému průběhu a zároveň vzhledem k řídicím signálům. Označuje
se jako latence a jde o typický projev chování Moorova SA s registrovým výstupem. V řadě
aplikací lze latenci akceptovat, ale existují číslicové systémy, kde je latence nepřípustná a
problém je třeba řešit jiným způsobem, konkrétně použitím Mealyho automatu s registrovým
výstupem, jak bude ukázáno níže.
CLK
Data(7 DOWNTO 0) = "01010101"
Tx_start
next_state
pres_state
Idle
Idle
Start_b
bit0_1
Start_b
T1
Tx_Data_i
Tx_Data
Obr. 58
Latence
bit1_0
bit0_1
bit2_1
bit1_0
bit3_0
bit2_1
bit4_1
bit3_0
T2
T1
T2
Časový průběh signálů vysílače dat rozhraní UART (Moorův stavový automat
s registrovým výstupem).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
85
Jak je vidět, implementace Moorova automatu, který pracuje se všemi vstupy jako se
vstupy SA, dělá i z jednoduché úlohy poměrně komplikovaný problém. V tomto případě je
vhodnější rozdělit vysílač UART na dva bloky, jak je uvedeno na Obr. 59:
MUX_sel
Tx_start
'1'
Tx_data
Data(7:0)
'0'
CLK
Obr. 59
Blokový diagram alternativní implementace Moorova stavového automatu pro
vysílač UART (verze 2).
Stavový automat je v tomto případě použit pouze pro řízení výstupního multiplexoru.
Má pak pouze jeden řídicí vstup (Tx_start), jeden výstupní signál MUX_sel, který při
vhodném návrhu může být přímo signál stavový. Jeho stavový diagram je výrazně jednodušší
a srozumitelnější (Obr. 60).
Zdrojový kód vysílače UART musí být doplněn o výstupní multiplexor a jednotlivé
kombinační procesy SA patřičně upraveny. Pro jednoznačné oddělení stavového automatu od
multiplexoru je použit pomocný vnitřní signál MUX_sel definovaný výčtem, samotný
multiplexor je pak popsán samostatným kombinačním procesem.
Tx_start=1
Idle,
MUX_1
Start_b
MUX_0
bit0
MUX_d0
bit1
MUX_d1
...
Stop_b
MUX_1
bit7
MUX_d7
Tx_start=1
stav,
vystup
Obr. 60
Tx_start=0
Stavový diagram Moorova SA implementace vysílače UART verze 2.
...
TYPE t_stav_UART IS (st_idle, st_start_b,
st_bit_0, st_bit_1, st_bit_2, st_bit_3,
st_bit_4, st_bit_5, st_bit_6, st_bit_7, st_stop_b);
...
TYPE t_MUX_Sel IS (MUX_0, MUX_1, MUX_d0, MUX_d1, MUX_d2,
MUX_d3, MUX_d4, MUX_d5, MUX_d6, MUX_d7);
SIGNAL MUX_Sel
: t_MUX_Sel;
...
FEKT Vysokého učení technického v Brně
86
-- Kombinacni cast 1
PROCESS (pres_state, Tx_start) BEGIN
CASE pres_state IS
WHEN st_idle
=> IF Tx_start = '1' THEN
next_state <= st_start_b;
ELSE
next_state <= st_idle;
END IF;
WHEN st_start_b
=> next_state <= st_bit_0;
WHEN st_bit_0
=> next_state <= st_bit_1;
WHEN st_bit_1
=> next_state <= st_bit_2;
...
WHEN st_bit_7
=> next_state <= st_stop_b;
WHEN st_stop_b
=> IF Tx_start = '1' THEN
next_state <= st_start_b;
ELSE
next_state <= st_idle;
END IF;
END CASE;
END PROCESS;
-- Kombinacni cast 2
PROCESS (pres_state) BEGIN
CASE pres_state IS
WHEN st_idle
WHEN st_start_b
WHEN st_bit_0
WHEN st_bit_1
...
WHEN st_bit_7
WHEN st_stop_b
END CASE;
END PROCESS;
=>
=>
=>
=>
MUX_sel
MUX_sel
MUX_sel
MUX_sel
<=
<=
<=
<=
MUX_1;
MUX_0;
MUX_d0;
MUX_d1;
=> MUX_sel <= MUX_d7;
=> MUX_sel <= MUX_1;
-- Vystupní multiplexor
PROCESS (MUX_sel, Data) BEGIN
CASE MUX_sel IS
WHEN MUX_1
=> Tx_data
WHEN MUX_0
=> Tx_data
WHEN MUX_d0
=> Tx_data
WHEN MUX_d1
=> Tx_data
...
WHEN MUX_d7
=> Tx_data
END CASE;
END PROCESS;
...
<=
<=
<=
<=
'1';
'0';
Data(0);
Data(1);
<= Data(7);
Pokud budeme výstupní multiplexor považovat za součást stavového automatu
(konkrétně jeho výstupní kombinační části KČ2), zjistíme, že lze výstupy SA přímo
ovlivňovat vstupními signály. Při takovém pohledu na realizovaný systém již nejde o Moorův
SA, ale o SA Mealyho typu (jednu z možných variant), byť nebylo naším záměrem jej
vytvořit. Syntetizér při implementaci uvedeného kódu provede sloučení a optimalizaci
výstupní kombinační části (KČ2) a výstupního multiplexoru, čímž opravdu Mealyho SA
vznikne. Lze jej tedy navrhnout přímo a to tak, že KČ2 nebude ovládat výstupní multiplexor,
ale přímo přiřazovat výstupní hodnoty signálu Tx_data.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
-- Kombinacni cast 2
PROCESS (pres_state, Data) BEGIN
CASE pres_state IS
WHEN st_idle
WHEN st_start_b
WHEN st_bit_0
WHEN st_bit_1
...
WHEN st_bit_7
WHEN st_stop_b
END CASE;
END PROCESS;
=>
=>
=>
=>
Tx_data
Tx_data
Tx_data
Tx_data
<=
<=
<=
<=
87
'1';
'0';
Data(0);
Data(1);
=> Tx_data <= Data(7);
=> Tx_data <= '1';
Odpovídající stavový diagram automatu je pak na Obr. 61. I když se celý navržený
modul chová jako Mealyho automat, z hlediska jeho návrhu a stavového diagramu se stále
jedná o Moorův automat. V praxi je často obtížné (a zbytečné) rozlišovat formálně o typu
automatu, hlavním kritériem je vždy funkčnost návrhu.
Tx_start=1
Idle,
'1'
Start_b
'0'
bit0
Data(0)
bit1
Data(1)
...
bit7
Data(7)
Stop_b
'1'
Tx_start=1
stav,
vystup
Obr. 61
Tx_start=0
Stavový diagram automatu s multiplexorem integrovaným do výstupní
kombinační části.
Uvedený automat má výstup opět kombinačního charakteru. V případě, že na jeho
výstup zařadíme klopný obvod pro odstranění zákmitů a zpoždění vzhledem k hodinovému
signálu, vznikne opět latence vzhledem k signálu Tx_start (což potvrzuje fakt, že se jedná o
Moorův stavový automat). Pokud chceme tuto latenci odstranit, je nutné provést celý návrh
stavového automatu dle obrázku Obr. 59, tedy od počátku jako Mealyho SA.
Mealyho automat vyžaduje poněkud odlišný způsob tvorby stavových diagramů. Na
rozdíl od Moorova typu totiž výstupní signály nezávisí pouze na aktuálním stavu, ale i na
stavu vstupních signálů. Proto se ve stavovém diagramu hodnoty výstupních signálů neuvádí
do stavů (uzlů), ale vždy k příslušným přechodům (hranám), jak je uvedeno na Obr. 62.
Některé přechody ve stavovém diagramu jsou nepodmíněné (probíhají vždy). U takových
přechodů je uvedena hodnota X (don’t care) před lomítkem.
FEKT Vysokého učení technického v Brně
88
Tx_start = 1 /
Tx_data <= 0
Idle
x / Tx_data <= Data(0)
Start_b
bit0
x / Tx_data <= '1'
x / Tx_data <= Data(1)
bit1
...
bit7
Stop_b
Tx_start = 1 /
Tx_data <= 0
stav
Obr. 62
In / Out
Tx_start = 0 /
Tx_data <= 1
Stavový diagram automatu Mealyho automatu dle Obr. 59.
Popis Mealyho automatu ve VHDL je již velmi podobný výše uvedenému popisu
automatu s integrovaným výstupním multiplexorem. Rozdíl je pouze ve výstupní kombinační
části (obsahující multiplexor), do které je kromě vstupního datového signálu přiveden také
signál Tx_start. Vzhledem k charakteru Mealyho automatu jsou navíc hodnoty přiřazované na
výstupy posunuty vzhledem k názvům stavů, což může na první pohled působit matoucím
dojmem. Vzhledem k navrženému stavovému diagramu (Obr. 62) jde ale o korektní zápis.
-- Kombinacni cast 2
PROCESS (pres_state, Data, Tx_start) BEGIN
CASE pres_state IS
WHEN st_idle
=> IF Tx_start = '1' THEN
Tx_data <= '0';
ELSE
Tx_data <= '1';
END IF;
WHEN st_start_b
=> Tx_data <= Data(0);
WHEN st_bit_0
=> Tx_data <= Data(1);
WHEN st_bit_1
=> Tx_data <= Data(2);
...
WHEN st_bit_6
=> Tx_data <= Data(7);
WHEN st_bit_7
=> Tx_data <= '1';
WHEN st_stop_b
=> IF Tx_start = '1' THEN
Tx_data <= '0';
ELSE
Tx_data <= '1';
END IF;
END CASE;
END PROCESS;
Takto vytvořený stavový automat reaguje okamžitě na aktivaci řídicího signálu
Tx_start, tedy ještě před příchodem aktivní hrany hodinového signálu CLK. Jeho výstup má
kombinační charakter, mohou se na něm tedy objevit zákmity způsobené propagací signálu
výstupní kombinační částí a také zpoždění vzhledem k aktivní hraně hodinového signálu.
Tyto projevy lze opět odstranit přidáním výstupního registru, stejně jako v případě
Moorova SA. V tomto případě ale automat nemá na výstupu latenci. Porovnání obou typů
automatů (Moorův a Mealyho) s oběma typy výstupů (kombinační = COMB a
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
89
registrový = REG) je uvedeno na Obr. 63. Z obrázku je zřejmý rozdíl v rychlosti odezvy, tedy
že Moorův SA je o jeden takt hodinového signálu zpožděn ve srovnání s Mealyho SA.
CLK
Data(7 DOWNTO 0) = "01010101"
Tx_start
MOORE
COMB
REG
Start bit
COMB
REG
Obr. 63
MEALY
Porovnání výstupů Moorova a Mealyho automatu s kombinačním a registrovým
výstupem realizujících funkci vysílače dat rozhraní UART.
V řadě aplikací je rozdíl jednoho taktu hodinového signálu zanedbatelný a lze jej
bezpečně akceptovat. Existuje ale mnoho kritických aplikací (např. obsluha pamětí FIFO),
kde je latence nepřípustná a použití automatu Mealyho typu je nezbytné.
Stavové automaty není nutné popisovat pomocí několika samostatných procesů. Takový
způsob popisu sice umožňuje snáze pochopit strukturu automatu, ale z hlediska přehlednosti
nemusí být u malých SA nejvýhodnější. Níže je uveden popis Mealyho automatu
s registrovým výstupem, který je proveden jediným sekvenčním procesem. Výsledný stavový
automat odpovídá Mealyho automatu s registrovým výstupem. Syntetizér je schopen takto
popsaný SA korektně rozpoznat a aplikovat na něj stejné optimalizační metody, jako na
automat popsaný několika procesy. Výsledek implementace je tak stejný nejen z hlediska
funkce, ale i z hlediska využitých strukturních prvků FPGA (klopné obvody a LUT).
Do uvedeného kódu SA byla navíc pro ilustraci zahrnuta funkce uložení datového slova
ze vstupu Data do pomocného registru Data_i v okamžiku zahájení vysílání dat. Toto uložení
je vhodné provést kvůli zajištění konzistence odesílaného slova (změna vstupu Data během
vysílání nemá za následek poškození vysílaného rámce). Pro implementaci tohoto registru je
třeba 8 klopných obvodů.
FEKT Vysokého učení technického v Brně
90
...
SIGNAL Data_i
: STD_LOGIC_VECTOR(7 DOWNTO 0):= X"00";
...
-- Mealyho SA s registrovym vystupem (Pipelined Mealy FSM)
PROCESS (clk) BEGIN
IF rising_edge(CLK) THEN
CASE pres_state IS
WHEN st_idle
=> IF Tx_start = '1' THEN
pres_state <= st_start_b;
Tx_data
<= '0';
Data_i
<= Data;
ELSE
pres_state <= st_idle;
Tx_data
<= '1';
END IF;
WHEN st_start_b => pres_state
<= st_bit_0;
Tx_data
<= Data_i(0);
WHEN st_bit_0
=> pres_state
<= st_bit_1;
Tx_data
<= Data_i(1);
...
WHEN st_bit_6
=> pres_state
<= st_bit_7;
Tx_data
<= Data(7);
WHEN st_bit_7
=> pres_state
<= st_stop_b;
Tx_data
<= '1';
WHEN st_stop_b
=> IF Tx_start = '1' THEN
pres_state <= st_start_b;
Tx_data
<= '0';
ELSE
pres_state <= st_idle;
Tx_data
<= '1';
END IF;
END CASE;
END IF;
END PROCESS;
Kromě výše uvedených variant existují i další možnosti, jak implementovat
požadovanou funkci vysílače UART. Jednou z nejběžnějších variant je využití posuvného
registru, který slouží k uložení datového slova v okamžiku startu vysílání, a zároveň jako
náhrada relativně velkého výstupního multiplexoru. Varianta na Obr. 64 umožňuje vysílač
jako celek realizovat bez latence, stejně jako výše uvedený Mealyho SA.
Tx_start
MUX_sel
2b
'1'
Shift_EN
CLK
Tx_data
Load_data
'0'
Data(7:0)
Obr. 64
Blokový diagram alternativní implementace Moorova stavového automatu pro
vysílač UART (verze 3).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
91
Použití multiplexoru na výstupu posuvného registru vyžaduje dva řídicí signály
stavového automatu. Tomu se lze vyhnout v případě, že zvolíme realizaci dle Obr. 65. V tom
případě automat řídí pouze posuvný registr, k čemuž postačují dva výstupní signálu SA.
Řídicí SA tedy může být velmi jednoduchý a celý blok bude mít velký mezní pracovní
kmitočet. Systém lze v tomto případě realizovat bez latence pouze tak, že samotný stavový
automat bude navržen jako Mealyho SA bez výstupního registru. Výstupní registr signálu
Tx_data je v tomto případě tvořen samotným posuvným registrem.
Tx_start
Shift_EN
CLK
Tx_data
Load_data
'1'
'0'
Data(7:0)
Obr. 65
Blokový diagram alternativní implementace Moorova stavového automatu pro
vysílač UART (verze 4).
4.7 Paměťově realizované stavové automaty
Stavové automaty se v FPGA obvykle realizují pomocí LUT (realizace KČ1 a KČ2) a
klopných obvodů, které přímo sousedí s LUT (realizace registrů). Stavový automat lze ale
také realizovat pomocí dostatečně velké paměti. Takové stavové automaty se nazývají
mikrosekvencery (microsequencer) a tvoří mezistupeň mezi stavovými automaty a
mikroprocesory (ve složitosti, výpočetním výkonu a snadnosti návrhu). V obvodech FPGA
jsou dnes paměti vhodné pro implementaci mikrosekvencerů běžné (BRAM; viz kapitola 6.1).
Na čipu jsou až tisíce takových bloků, přičemž téměř vždy zůstávají některé z nich nevyužité.
I proto je implementace mikrosekvencerů v FPGA velmi efektivní.
FEKT Vysokého učení technického v Brně
92
Pres_state
Tx_start
'1'
Tx_data
Data(7:0)
'0'
CLK
Data
(n-bitů)
Adresa
(m-bitů)
D
MUX_sel
Q
CLK
Tx_start
RAM
CLK
Obr. 66
Vnitřní
registr
(n-bitový)
Princip realizace stavového automatu pamětí.
Samotné paměťové pole slouží jako generátor logické funkce (KČ1 a KČ2), který je
doplněn o stavový (případně i výstupní) registr. Ve většině případů paměti integrované v
FPGA obsahují na svých výstupech registry, což dále zefektivňuje takovou implementaci
stavových automatů. Alternativně lze registry realizovat externě, pomocí běžné
programovatelné struktury, což ale vede k vyšším hardwarovým nárokům a horším
vlastnostem z hlediska spotřeby a mezního kmitočtu.
Příklad realizace stavového automatu jako mikrosekvenceru je uveden na Obr. 67. Jde o
stejný stavový automat, který byl uveden jako příklad v kapitole 4.5.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Vstup RAM:
Adresa (5 bitů)
Tx_start
Výstup paměti =
stavový signál =
(data): 4 bity
D
Q
CLK
MUX_sel
Tx_start
RAM
CLK
Obr. 67
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Stavový registr
(uvnitř RAM)
pres_state
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
(idle)
(start_b)
(bit_0)
(bit_1)
(bit_2)
(bit_3)
(bit_4)
(bit_5)
(bit_6)
(bit_7)
(stop_b)
(idle)
(start_b)
(bit_0)
(bit_1)
(bit_2)
(bit_3)
(bit_4)
(bit_5)
(bit_6)
(bit_7)
(stop_b)
93
Obsah paměti
(data): 4 bity
next_state (data)
0000 (idle)
0010 (bit_0)
0011 (bit_1)
0100 (bit_2)
0101 (bit_3)
0110 (bit_4)
0111 (bit_5)
1000 (bit_6)
1001 (bit_7)
1010 (stop_b)
0000 (idle)
0000
0000
0000
0000
0000
0001 (start_b)
0010 (bit_0)
0011 (bit_1)
0100 (bit_2)
0101 (bit_3)
0110 (bit_4)
0111 (bit_5)
1000 (bit_6)
1001 (bit_7)
1010 (stop_b)
0001 (start_b)
0000
0000
0000
0000
0000
Ukázka paměťově realizovaného stavového automatu (mikrosekvenceru) pro
řízení rozhraní UART.
Podle potřebného počtu vstupů (N), počtu nestavových výstupů (Q) a počtu stavů (S)
automatu lze odvodit parametry paměti nutné pro realizaci obecného stavového automatu
formou mikrosekvenceru:
šířka adresní sběrnice
A = log2(S) + N
šířka datového slova
D = log2(S) + Q
celková velikost paměťového pole
Nb = 2A ∙ D
Z uvedených vztahů je patrné, že velikost potřebné paměti závisí exponenciálně na
počtu vstupů stavového automatu. To je hlavní limitující faktor této realizace, který ji
omezuje pro použití na stavové automaty s malým počtem vstupů.
FEKT Vysokého učení technického v Brně
94
5 Hodinové a globální signály v FPGA
Drtivá většina číslicových obvodů implementovaných v FPGA patří do kategorie
synchronních sekvenčních systémů. Přesněji jde ve většině případů o lokálně synchronní,
globálně asynchronní systémy, neboť různé části systému pracují s různými hodinovými
signály, ale jednotlivé části jsou ryze synchronní. Důvodem použití těchto systémů je
především dobře zvládnutá metodika návrhu a implementace, která zaručuje spolehlivost
procesu implementace i výsledného číslicového systému. Nevýhodou těchto systémů je
poněkud horší efektivita a potenciálně menší výpočetní výkon, ve srovnání s asynchronními
sekvenčními systémy.
S ohledem na tento fakt je struktura FPGA přizpůsobena pro implementaci
synchronních sekvenčních systémů, přičemž se předpokládá, že systém bude využívat několik
vzájemně asynchronních hodinových signálů (půjde tedy o lokálně synchronní, globálně
asynchronní systém). V této kapitole jsou uvedeny hardwarové prostředky, které jsou určeny
pro podporu efektivní implementace takových systémů.
5.1 Distribuce hodinového signálu
Typický synchronní sekvenční číslicový systém je složen z klopných obvodů, mezi
kterými jsou kombinační části. V dalším popisu budeme předpokládat výhradně použití
klopných obvodů (KO) typu D řízených náběžnou hranou hodinového signálu. Pro správnou
funkci KO musíme dodržet požadavky na časování jeho vstupních signálů. Vstupem klopného
obvodu je hodinový a datový signál. Hodinový signál musí splňovat čtyři základní požadavky
(Obr. 68):
 Minimální doba trvání úrovně H (THIGH)
 Minimální doba trvání úrovně L (TLOW)
 Minimální perioda / maximální frekvence (TMIN = 1 / fMAX)
 Maximální doba náběžné a sestupné hrany (TFALL, TRISE)
T
THIGH
TLOW
CLK
TFALL
Obr. 68
TRISE
Požadované časové parametry hodinového signálu na vstupu klopného obvodu.
Datový signál vstupující do klopného obvodu musí splňovat dva základní požadavky,
které se vztahují k aktivní (náběžné) hraně hodinového signálu (Obr. 69). Datový signál na
vstupu klopného obvodu musí být bez změn alespoň po dobu předstihu (Setup time; TSU) před
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
95
aktivní hranou a alespoň po dobu přesahu (Hold time; TH) po aktivní hraně hodinového
signálu. Posledním podstatným parametrem je doba, za kterou se po aktivní hraně hodinového
signálu datový signál ze vstupu klopného obvodu (D) dostane na jeho výstup (Q).
D
TSU TH
CLK
Q
TCKO
TCKO
Obr. 69
Doba předstihu, doba přesahu a doba propagace klopného obvodu typu D
řízeného hranou.
V typickém synchronním sekvenčním systému pak musí být splněny uvedené
požadavky na časové parametry signálů, které jsou ilustrovány na Obr. 70. Signál, který je
s aktivní hranou hodinového signálu vystaven na výstup prvního klopného obvodu, se po
době TCKO dostane na vstup kombinační části (KČ). Ta reprezentuje jak kombinační logické
buňky (vykazující zpoždění TLOG), tak propojovací strukturu (zpoždění TROUTE). Signál musí
projít KČ dostatečně rychle, aby se ustálil na vstupu druhého registru minimálně v době TSU
před další aktivní hranou hodinového signálu. Splnění těchto podmínek je klíčové pro
všechny moderní číslicové systémy.
Data
clk
REG
KČ
clk
REG
CLK
Data
TCKO
Obr. 70
TLOG + TROUTE
TSU
Požadavek na časování v synchronních sekvenčních systémech.
V případě nedodržení těchto podmínek (příliš velká doba šíření signálu TLOG + TROUTE)
může docházet ke vzniku metastability (Obr. 71) nebo až k funkčním chybám posunutím
hodnot v čase o násobky hodinového taktu.
FEKT Vysokého učení technického v Brně
96
CLK
CLK
Data in
Data in
TCKO
TLOG + TROUTE
TCKO
TSU TH
Data out
TCKO
Obr. 71
TLOG + TROUTE
TSU TH
Data out
TCKO
Vznik metastability nedodržením času předstihu (vpravo).
Model systému uvedený na Obr. 70 předpokládá, že hodinový signál je přiveden na
vstupy klopných obvodů tak, že hrana hodinového signálu přichází na jejich vstupy v jeden
okamžik, což je v reálném systému nesplnitelné. Vždy existuje malý rozdíl v času příchodu
hrany na jednotlivé klopné obvody, který se označuje jako posuv. Jelikož tento termín není
v češtině příliš dobře zaveden, bude dále v textu v této souvislosti používán odpovídající
anglický termín skew a příslušný čas bude označen jako TSKEW.
Čas TSKEW je různý pro každou dvojici klopných obvodů připojených na jeden hodinový
signál. Z hlediska návrhu je podstatné znát největší možný čas TSKEW, který v daném systému
existuje. Tento čas je pak nutné připočíst do rovnice uvedené v Obr. 70. Pro výpočet mezního
pracovního kmitočtu synchronního sekvenčního číslicového systému je dále nutné znát
zpoždění nejdelší cesty mezi dvojicí klopných obvodů (součet doby propagace logickými
obvody a propojovací strukturou), které se v systému vyskytuje TLOG  TROUTE max . Na základě
těchto hodnot lze pak pomocí následujícího vztahu mezní kmitočet vypočítat (vztah nebere
v potaz další rušivé vlivy, jako fázový šum hodinového signálu a podobně):
f MAX 
1
TMIN

1
TCKO  TLOG  TROUTE max  TSKEW max  TSU
(5.1)
Ze vztahu je patrné, že čas TSKEW přímo ovlivňuje mezní pracovní kmitočet systému a
jeho příliš velká hodnota by značně omezila fMAX. Proto jsou ve všech obvodech FPGA pro
rozvod hodinového signálu použity dedikované struktury, jejichž úkolem je zajistit minimální
čas TSKEW (Obr. 72). Moderní FPGA mají několik (typicky 8-32) globálních propojovacích
spojů určených pro rozvod rychlých signálů po celém čipu se zajištěním malého TSKEW.
Vzhledem k jejich struktuře a nejčastějšímu použití (rozvod hodinových signálů) se tyto spoje
nazývají clock tree.
Tyto globální spoje jsou u velkých čipů rozděleny na několik menších stromů, které
pokrývají vždy část čipu. Těmto částem se pak říká regiony (clock region). Jeden hodinový
signál tak může být použit v celém čipu, nebo pouze v těch částech, kde se skutečně nachází
cílové klopné obvody.
V případě, že chceme využít tyto dedikované globální spoje, je nutné k tomu použít
speciální strukturální bloky, které k nim zprostředkovávají přístup. V nejjednodušším případě
jde o globální / regionální budiče hodinových signálů (global / regional clock buffer). Jejich
použití je možné explicitně specifikovat buď pomocí schématických editorů, nebo
strukturálním popisem v jazycích HDL. V jednodušších případech, jako je například přímý
vstup hodinového signálu do FPGA, dokáží implementační nástroje tyto bloky použít
automaticky. Obecně je ale vhodnější použití těchto bloků explicitně stanovit.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
běžná propojovací struktura
97
Clock Tree
globální budič
CLK
CLK
Obr. 72
Porovnání běžné propojovací struktury a dedikovaného systému (Clock Tree) pro
distribuci hodinového signálu v FPGA.
5.2 Práce s hodinovými signály v FPGA
Řada systémů potřebuje pro svoji funkci různé hodinové kmitočty. Jedním z důvodů je
fakt, že různá standardní rozhraní pracují na různých přenosových rychlostech, z nichž jsou
pracovní frekvence dovozeny (PCI-Express, SATA, SONET…). Rozhraní s AD a DA
převodníky vyžadují specifické pracovní frekvence závislé na zvolené vzorkovací frekvenci.
Dalším důvodem je potřeba dosažení vhodného kompromisu mezi pracovním kmitočtem,
výpočetním výkonem a spotřebovanými hardwarovými prostředky. Zvýšení pracovního
kmitočtu znamená zvýšení výpočetního výkonu, ale může vést k problémům se splněním
časových požadavků (timing constraints). Z těchto důvodů je často od jednoho již dostupného
hodinového signálu odvodit nové hodinové signály. Existuje několik metod, jak toho docílit.
Pokud potřebujeme snížit pracovní kmitočet systému (nebo jeho části), lze s výhodou
použít techniku povolování hodinového signálu (clock enabling; EN). Ta spočívá
v generování pomocného logického signálu, který řídí chod systému, který má pracovat
s pomalejším hodinovým signálem.
clk
Systémový hodinový signál 125 MHz
clk_EN
1:5 => 1/5 * 125 MHz = 25 MHz
Obr. 73
Princip generování signálu clock enable.
FEKT Vysokého učení technického v Brně
98
Na obrázku Obr. 73 je naznačen princip generování signálu EN o frekvenci 25 MHz ze
základního hodinového signálu o frekvenci 125 MHz. Popis takového systému ve VHDL je
naznačen níže. Proces clk_EN_gen je použit pro generování řídicího signálu clk_EN.
Tento řídicí signál je pak použit ve druhém procesu slow_proc a řídí jeho chod.
clk_EN_gen: PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
IF cnt_div = MAX THEN
cnt_div <= (OTHERS => '0');
clk_EN <= '1';
ELSE
cnt_div <= cnt_div + 1;
clk_EN <= '0';
END IF;
END IF;
END PROCESS clk_EN_gen;
slow_proc: PROCESS (clk) BEGIN
IF rising_edge(clk) THEN
IF clk_EN = '1' THEN
...
END IF;
END IF;
END PROCESS slow_proc;
Klopné obvody v programovatelných buňkách FPGA jsou vybaveny dedikovaným
vstupem pro realizaci funkce povolení hodinového signálu. Pakliže chceme využít této
zabudované funkcionality a zvýšit tak efektivitu implementace, měla by být ve zdrojovém
kódu podmínka reagující na povolovací signál uvedena ihned za podmínkou detekce hrany
hodinového signálu.
Stejný signál (clk_EN) lze teoreticky ve výše uvedeném příkladu ve druhém procesu
použít i přímo v podmínce detekce hrany rising_edge, místo signálu clk (číslicové
obvody obecně nevyžadují hodinový signál se střídou 1:1). Takové použití ale při
implementaci zapříčiní, že rozvod hodinového signálu bude proveden běžnou propojovací
strukturou, jak je uvedeno na Obr. 72 vlevo se všemi nevýhodami, které z toho plynou. Tento
problém lze kompenzovat použitím speciálního bloku, který signál rozvede dedikovanou
strukturou pro rozvod hodinového signálu. Takto generovaný signál ale vykazuje určité (ne
přesně definované) zpoždění vůči původnímu hodinovému signálu clk. Nová hodinová
doména by tak byla vzhledem k původní doméně asynchronní a převod signálů mezi nimi by
vyžadoval použití synchronizačních obvodů. V obvodech FPGA se proto častěji používá
technika clock enabling, která tyto obvody nevyžaduje.
Pomalejší hodinové signály (tedy i technika clock enabling) umožňují použít složitější
kombinační obvody v cestě mezi dvěma po sobě následujícími klopnými obvody (Obr. 70).
Na druhou stranu to umožňuje implementovat jednodušší obvody pro obsluhu pomalejších
rozhraní, jako jsou pomalé sériové sběrnice nebo uživatelská rozhraní (LED, klávesnice…).
Obsluha takových rozhraní by jinak vyžadovala implementovat poměrně velké čítače, které
by zpomalovaly chod každého takového bloku, čímž by klesala efektivita využití FPGA.
Alternativou k technice clock enabling je technika správy hodinových signálů (clock
management). Ta spočívá v syntéze nových hodinových signálů s využitím speciálních bloků
založených typicky na smyčce fázového závěsu (PLL; Phase Locked Loop) nebo závěsu
zpoždění (DLL; Delay Locked Loop). Takové bloky jsou dnes běžně dostupné v obvodech
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
99
FPGA jako tzv. primitivní buňky (primitives). V jednom FPGA bývá k dispozici 4 až 24
takových bloků.
Tyto bloky mají řadu funkcí, které lze často kombinovat, a tím dosáhnout potřebných
vlastností hodinového signálu:
 Statické i dynamické posouvání fáze hodinového signálu vzhledem k původnímu
hodinovému signálu
 Generování několika replik původního hodinového signálu s fixním fázovým
posuvem (například 0°, 90°, 180°, 270°)
 Vyrovnání střídy hodinového signálu
 Redukce fázového šumu hodinového signálu (bloky založené na PLL)
 Celočíselné dělení kmitočtu hodinového signálu
 Celočíselné násobení kmitočtu hodinového signálu
 Syntéza hodinového kmitočtu daná podílem celých čísel M/N
Bloky pro úpravu hodinového signálu lze v některých obvodech FPGA řadit do
kaskády, čímž se možnosti práce s hodinovým signálem dále rozšiřují.
5.3 Nulování a nastavení (reset a set)
Řada číslicových obvodů vyžaduje při zapnutí nebo i během provozu možnost uvést
část systému nebo celý systém do známého výchozího stavu. Tato procedura se nazývá
nulování, případně nastavení, běžněji reset, respektive set. Jelikož se nastavení v dnešní době
používá jen výjimečně a rozdíl mezi nulováním a nastavením je pouze v nastavené logické
hodnotě, bude v dalším textu popis věnován pouze nulování.
U obvodů ASIC je striktně vyžadována přítomnost globálního nulovacího signálu,
kterým je možné po zapnutí (kdy jsou vnitřní registry v náhodném stavu) uvést všechny jeho
vnitřní registry do známého výchozího stavu. Obvody FPGA založené na technologii SRAM
(drtivá většina dnešních obvodů) takový signál nevyžadují, neboť kontrolované uvedení
celého číslicového systému implementovaného v FPGA do výchozího stavu je zajištěno
konfigurací, která probíhá vždy po jeho zapnutí. V případě potřeby je možné kdykoliv za
provozu znovu provést rekonfiguraci celého čipu pomocí dedikovaného řídicího signálu,
kterým jsou vybaveny všechny FPGA.
Rekonfigurace FPGA samozřejmě není ekvivalentem signálu zajišťujícího reset obvodů
ASIC, neboť proces konfigurace obvykle trvá jednotky milisekund až jednotky sekund.
Během konfigurace je obvod navíc zcela izolován od okolních signálů, což může způsobit
problémy s dalšími systémy, které jsou na FPGA navázány. V případě, že je nutné FPGA
uvést do výchozího stavu v krátkém čase, je nutné použít techniky popsané níže.
Pouze některé speciální systémy vyžadují, aby bylo možné veškeré jejich interní
registry uvést signálem reset do výchozího stavu i během normálního provozu (bez
rekonfigurace). Rozvod signálu reset ke všem klopným obvodům klade velké nároky na
propojovací strukturu a může způsobovat problémy se splněním časových požadavků. Většina
běžných systémů reset nevyžaduje vůbec, případně pouze takový, který ovlivní klíčové
registry (například stavové registry stavových automatů).
FEKT Vysokého učení technického v Brně
100
Obecně lze proces nulování provést asynchronně nebo synchronně. Časový průběh,
který demonstruje funkci klopného obvodu se synchronním a asynchronním nulováním je na
Obr. 74. Nulovací signály klopných obvodů jsou na obrázku označeny podle normy
ANSI/IEEE Std 91a-1991. Řada firem ale používá svoje vlastní označování, které s normou
není kompatibilní. Firma Xilinx například označuje vstup pro synchronní jako R a vstup pro
asynchronní nulování jako CLR. Proto je vždy nutné ověřit si v příslušné dokumentaci
skutečné chování těchto vstupů. V dalším textu bude použito označení srst pro synchronní
nulování a arst pro asynchronní nulování.
1D Q
D Q
1D Q
D Q
C1
1R
clk
srst
C1
R
clk
arst
clk
clk
srst
arst
D
D
Q
Q
Obr. 74
Chování klopného obvodu se synchronním nulováním (vlevo) a asynchronním
nulováním (vpravo).
Rozdíl mezi oběma dvěma typy nulování je v sekvenčních systémech zásadní a použití
každého z nich sebou nese výhody i nevýhody:
 Synchronní reset: platí pro něj stejné požadavky na dobu předstihu a přesahu,
jako pro běžné signály (tedy jako pro vstup D) a stejným způsobem probíhá i
jejich kontrola (statická časová analýza; Obr. 71). Pokud jsou tyto podmínky
splněny, nehrozí při jeho aktivaci ani deaktivaci vznik metastabilit. Hlavní
nevýhodou synchronního nulování je fakt, že pro svoji funkci nutně vyžaduje
fungující hodinový signál.
 Asynchronní reset: aby v systému nedošlo ke vzniku metastabilních stavů, je
třeba dodržet minimální dobu trvání pulzu nulovacího signálu (TPULSE) a dobu,
po kterou musí být nulovací signál neaktivní před první aktivní hranou
hodinového signálu (TRR; Reset Recovery Time). Graficky jsou tyto časové
požadavky znázorněny na Obr. 75. včetně ilustrace možných důsledků jejich
nedodržení. Základní výhodou asynchronního nulování je fakt, že je zcela
nezávislý na hodinovém signálu, tudíž nulování obvodu je provedeno i
v případě, že je zdroj hodinového signálu mimo provoz. Nevýhodou je, že lze
jen obtížně (pokud vůbec) zajistit splnění požadavku na čas TRR.
Vzhledem k uvedeným výhodám a nevýhodám obou typů nulovacích signálů se pro
obvody FPGA doporučuje použít metodu tzv. synchronizace asynchronního nulování (Obr.
76), kdy je vstupní signál pro nulování brán jako asynchronní (arst) a upravený nulovací
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
101
signál rozvedený k příslušným klopným obvodům (typicky ke všem v příslušné hodinové
doméně) jako synchronní (srst). Asynchronní nulovací signál arst, který je zdrojem
požadavku na nulování, ihned v okamžiku aktivace způsobí přechod globálního nulovacího
signálu srst do aktivní úrovně. V tento okamžik se může stát, že v systému dojde k porušení
podmínek času předstihu a přesahu a tedy ke vzniku metastabilit. Jelikož je ale systém ve
stavu nulování, nemají tyto metastability vliv na jeho chování, systém zůstává ve stavu
nulování. Po uvolnění signálu arst je s malým zpožděním (1-2 takty hodinového signálu)
synchronně uvolněn i signál srst.
clk
'1'
Q1
D Q
arst
arst
TRR
TPULSE MIN
clk
arst
clk
TRR
arst
TRR violation
Q1
Obr. 75
TPULSE
TPULSE MIN violation
Požadavky na časové parametry signálu asynchronního nulování a ilustrace
důsledků jejich nedodržení.
clk
'1'
arst
Q1
D Q1
D Q2
arst
arst
arst
srst
clk
metastabilita
Q2
srst
Obr. 76
Princip a realizace metody synchronizace asynchronního signálu reset.
Uvedené zapojení zcela eliminuje problém s dodržením času předstihu a přesahu při
uvolnění nulovacího signálu. Zároveň je necitlivé na nedodržení podmínky TRR, jejímž
nedodržením sice může vzniknout krátká metastabilita na výstupu prvního klopného obvodu,
tak ale s velmi vysokou pravděpodobností odezní dříve, než druhý klopný obvod s další
aktivní hranou tento signál navzorkuje. Zdrojový kód procesu VHDL realizující požadovanou
funkci je uveden níže.
FEKT Vysokého učení technického v Brně
102
reset_sync: PROCESS (arst, clk) BEGIN
IF arst = '1' THEN
Q1 <= '0';
Q2 <= '0';
ELSIF rising_edge(clk) THEN
Q1 <= '1';
Q2 <= Q1;
END IF;
END PROCESS reset_sync;
srst <= NOT Q2;
5.4 Převod signálů mezi hodinovými doménami
Ve většině číslicových systémů existuje několik nezávislých zdrojů hodinového signálu,
které řídí vždy část systému (subsystém). Tyto subsystémy si často navzájem musí předávat
řídicí nebo datové signálu. Příklady ilustrující takovou situaci jsou uvedeny na Obr. 77.
25.0000043 MHz
24.999976 MHz
Oscillator
25 MHz
Oscillator
25 MHz
FPGA
ADC
interface
25 MHz
Obr. 77
Software
Defined
Radio
ADC
interface
122.88 MHz
DDS, CIC,
FIR
250 MHz
Ukázka dvojice systémů, v nichž dochází k přenosu signálů mezi vzájemně
asynchronními hodinovými doménami.
Vzhledem k tomu, že hodinové signály těchto subsystémů k sobě navzájem obvykle
nemají definovaný vztah, je nutné je považovat za navzájem asynchronní. Pokud bychom
například přenášeli datový signál z jednoho takového subsystému do druhého, nebylo by
možné zajistit splnění podmínek času předstihu a přesahu, což vede na vznik metastabilit
(nedefinovaných stavů; Obr. 78). Navíc by mohlo docházet ke ztrátám nebo duplicitám dat,
jak ilustruje Obr. 79 a Obr. 80.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
103
clk_A
0
data_A
1
2
3
4
5
6
7
8
clk_B
0
data_B
1
2
3
XX
4
5
6
7
Vznik metastability při nedodržení
požadavků na setup/hold time,
čtení zcela nesprávných hodnot
Vznik metastabilních stavů při přímém přenosu signálu mezi vzájemně
asynchronními hodinovými doménami.
Obr. 78
Přenos signálů mezi doménami je třeba vždy zajistit spolehlivě. Za tímto účelem se
používají obvody, které lze rozdělit na prosté synchronizační obvody na paměti typu FIFO
s asynchronními hodinovými doménami.
clk_A
data_A
0
1
2
3
4
5
6
7
8
9
clk_B
data_B
0
1
2
5
6
7
8
9
Vynechání některých
datových slov
FclkA > FclkB
Obr. 79
3
Vynechání datových slov při přímém přenosu signálu mezi vzájemně
asynchronními hodinovými doménami.
clk_A
data_A
0
1
2
3
4
5
6
7
8
clk_B
data_B
0
1
FclkA < FclkB
Obr. 80
2
3
3
4
5
6
7
Duplicita některých
datových slov
Vznik duplicit datových slov při přímém přenosu signálu mezi vzájemně
asynchronními hodinovými doménami.
Nejjednodušším spolehlivým způsobem přenosu signálu z jedné hodinové domény
(clk_A) do druhé hodinové domény (clk_B) je použití posuvného registru, jak je
FEKT Vysokého učení technického v Brně
104
naznačeno na Obr. 81. Na výstupu prvního klopného obvodu se vlivem nedodržení podmínek
na dobu předstihu a přesahu může objevit metastabilní stav, který ale zpravidla rychle odezní,
takže následující klopný obvod již v době aktivní hrany má na vstupu k dispozici korektní
signál. V případě požadavku na vyšší spolehlivost se používají delší posuvné registru (3-4
klopné obvody). Posuvný registr je schopen přenést pouze signály, které se nemění příliš
často; změna z jednoho stavu do druhého by neměla nastat častěji, než jednou za tolik taktů
hodinového signálu clk_B, kolik je použito registrů.
SIG_A
D Q1
D Q2
SIG_B
clk_B
Obr. 81
Prostý synchronizační obvod založený na posuvném registru pro přenos signálů
mezi navzájem asynchronními hodinovými doménami.
Složitější synchronizační obvod, který je schopen přenést i krátké pulzy, pracuje na
podobném principu, jako obvod pro synchronizaci asynchronního signálu reset (Obr. 76).
Princip funkce takového obvodu je demonstrován na Obr. 82.
XOR1
D Q4
'1'
SIG_A
D Q1
D Q2
D Q3
arst
arst
arst
SIG_B
clk_B
clk_A
SIG_A
clk_B
Q1
Q2
Q3
XOR1
SIG_B
Obr. 82
Synchronizační obvod pro přenos krátkých pulzů mezi navzájem asynchronními
hodinovými doménami.
Pro přenos datových (vícebitových) signálů se používá paměť typu FIFO, jejíž vstupní
port (určený pro zápis) pracuje v jedné hodinové doméně (clk_A), zatímco výstup (určený
pro čtení) ve druhé hodinové doméně (clk_B). Blokové schéma paměti FIFO včetně
základních signálů jejího rozhraní je naznačeno na Obr. 83.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
WR_pointer
DataIn_A
RD_pointer
Dual Port RAM
Write_A
Full_A
Control
Clk_A
Obr. 83
105
DataOut_B
Read_B
Empty_B
Clk_B
Blokové schéma paměti FIFO
Základem paměti je dvouportová paměť RAM (Dual Port RAM), což je paměť, která
má dvě rozhraní umožňující provádět nezávisle (současně) operaci čtení a zápisu, je tedy
vybavena dvojicí adresních vstupů a nezávislým vstupem a výstupem dat. Adresní signály
jsou generovány interně blokem Control, a tvoří dvojici ukazatelů do pole paměti
(WR_pointer a RD_pointer). Pokud je na vstupní straně vznesen požadavek na zápis do
paměti (aktivní úroveň signálu Write_A), dojde s nejbližší aktivní hranou signálu clk_A
k zápisu hodnoty ze vstupu DataIn_A na pozici, na níž právě ukazuje ukazatel
WR_pointer. Zároveň se zápisem je provedena inkrementace ukazatele WR_pointer.
Pokud je na straně čtení vznesen požadavek a čtení aktivací signálu Read_B, dojde
s následující hranou hodinového signálu k inkrementaci ukazatele RD_pointer a tak
k aktualizaci hodnoty na výstupu DataOut_B.
Řídicí blok neustále porovnává hodnoty ukazatelů na straně čtení a zápisu. Podle
výsledku porovnání pak nastavuje hodnoty dvojice signálů (flags) Full_A a Empty_B.
První z nich indikuje na straně zápisu (ne)připravenost paměti k zápisu dalších slov, druhý
naopak na straně čtení přítomnost doposud nevyčtených slov. Pokud je signál Full_A
aktivní, nesmí být provedena operace zápisu, jinak může dojít k poškození obsahu paměti
(ztráta dat). Podobně na straně čtení nesmí být vyžádáno další slovo, pokud je signál
Empty_B aktivní, jelikož v paměti není žádné nové platné slovo (došlo by k opakovanému
vyčtení staršího slova).
Jelikož blok Control pracuje se signály obou hodinových domén, je třeba jej
realizovat s využitím výše zmíněných jednoduchých synchronizačních obvodů. Jelikož je
třeba provádět porovnávání hodnoty navzájem asynchronních ukazatelů, používají se pro
jejich vyjádření kódy s malým počtem změn (například Grayovy kódy), které dále snižují
riziko vzniku metastabilit.
Paměti FIFO jsou na výstupní straně často vybaveny přídavnými klopnými obvody,
které způsobují zpoždění ve vydávání nových platných datových slov na výstup FIFO
(latenci), ale umožňují pamětem pracovat na vyšším pracovním kmitočtu.
Jelikož návrh paměti FIFO není triviální, obsahují moderní návrhové systémy průvodce,
pomocí kterých lze paměť FIFO snadno navrhnout a poté použít v designu. Takto navržené
paměti bývají velmi efektivní, optimalizované pro cílovou architekturu FPGA a zároveň
dobře ověřené. Nevýhodou je především vazba na konkrétní návrhový systém a často i
konkrétní cílový obvod FPGA.
FEKT Vysokého učení technického v Brně
106
5.5 Zvyšování pracovní frekvence
Jak bylo uvedeno v kapitole 5.1, závisí mezní pracovní frekvence synchronního
sekvenčního systému (a tedy i jeho výpočetní výkon) na největším zpoždění mezi dvěma po
sobě následujícími klopnými obvody. Toto zpoždění je tvořeno kombinační částí (LUT) a
propojovací strukturou. V případě obvodů FPGA jsou obě tyto složky z hlediska zpoždění
srovnatelné. Pokud po provedení statické časové analýzy implementovaného designu zjistíme,
že v některých částech je toto zpoždění příliš velké (nesplnění požadavku na mezní pracovní
kmitočet), je třeba provést některou z níže uvedených změn.

Úprava nastavení optimalizačních kritérií implementačních nástrojů. Obecně se
návrhový systém snaží číslicový obvod implementovat tak, aby nejen splnil
uživatelem zadané omezující podmínky (constraints), ale také byl co
nejefektivnější z hlediska potřebných strukturních prvků (zabranou plochu čipu)
a z hlediska spotřeby. V nastavení nástrojů lze jednak snížit prioritu
optimalizace na plochu (area) a spotřebu (power reduction) a zároveň povolit
intenzivnější a vícenásobné provedení optimalizačních procesů, především
Place. Výsledkem může být zvýšení pracovního kmitočtu o 2-20%.

Obvody FPGA se vyrábí v různých stupních rychlosti, tzv. speed grade. Pokud
je na trhu k dispozici cílový obvod s vyšší rychlostí, můžeme jej použít.
Výsledkem může být zvýšení pracovní frekvence cca o 10-20%, ale za cenu
přibližně o 20-40% větší, což pro řadu aplikací není přijatelné.

Použití klasických technik, jako je pipelining, register retiming a register
replication. Tyto techniky umožňují mírnou modifikací stávajícího designu
dosáhnout podstatného (i několikanásobného) zvýšení pracovního kmitočtu a
jsou předmětem této kapitoly.

Pokud všechny výše uvedené metody selžou, nezbývá než provést úpravu celého
návrhu systému (redesign), která se může týkat jak jednotlivých bloků, tak (v
horším případě) celé koncepce.
První z klasických technik používaných pro zvýšení pracovní frekvence (tedy
výpočetního výkonu a propustnosti) číslicových systémů je pipelining. Tato technika spočívá
v rozdělení rozsáhlých kombinačních částí (úloh) na jednodušší. Princip je naznačen na Obr.
84.
V horní části obrázku je část systému před aplikací pipeliningu. Její mezní kmitočet je
dán zpožděním kombinační části (v němž je zahrnuto i zpoždění propojovací struktury), zde
62,5 MHz (zpoždění 16 ns). Rozdělením velké kombinační části na několik menších a
vřazením registrů mezi tyto kombinační části lze dosáhnout při stejné ekvivalentní funkci
vyššího pracovního kmitočtu. Zde byly použity dva stupně registrů (dvojstupňový pipelining).
V ideálním případě by měl být výsledný kmitočet trojnásobný. Prakticky ale nelze
kombinační část rozdělit na přesně stejné části, proto je vždy některá z dílčích KČ největší a
ta pak určuje mezní pracovní kmitočet (zde prostřední KČ se zpožděním 7 ns). V případě, že
by toto zpoždění bylo stále příliš velké, lze přidat další stupně registrů a KČ dále zjednodušit.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
REG
107
REG
Kombinační
část
Zpoždění 16 ns
FMAX = 62.6 MHz
KČ
REG
Zpoždění 5 ns
REG
KČ
REG
Zpoždění 7 ns
KČ
REG
Zpoždění 6 ns
Největší zpoždění 7 ns => FMAX = 143 MHz
(ideálně zpoždění 5.3 ns => FMAX = 187 MHz)
Obr. 84
Princip použití techniky pipelining pro zvýšení pracovního kmitočtu
Cenou za toto zvýšení frekvence je jednak nutnost použít větší množství klopných
obvodů (kterých je ale v FPGA k podstatně více, než je schopna většina designů využít) a
potom latence, tedy zpoždění výstupního signálu o tolik hodinových taktů, kolik stupňů
pipeliningu jsme zavedli.
Další technikou je replikace / balancování registrů (register replication, register
balancing). Její princip je naznačen na Obr. 85 a lze ji aplikovat v případě, že zpracovávaný
signál prochází postupně dvojicí kombinačních částí, jejichž zpoždění (složitost) je výrazně
odlišné. V příkladu na obrázku původní KČ1 příliš velká a omezuje mezní pracovní kmitočet
systému. Naopak KČ2 je velmi jednoduchá, vykazuje jen malé zpoždění. Přesunutím části
složité logické operace z KČ1 do KČ2 umožní do určité míry tato zpoždění vyrovnat a tak
zvýšit pracovní frekvenci. Podobně, jako u techniky pipelining, ani zde nelze předpokládat
dokonalé rozdělení, takže po provedení změny bude mít jedna z KČ zpoždění větší a ta bude
omezovat mezní kmitočet (zde je to i po změně KČ1). Z hlediska výstupu se obvod před i po
změně chová identicky, výstupy registrů mezi KČ1 a KČ2 jsou ale v obou případech zcela
odlišné.
Techniku register retiming (balancing) dokáží dnešní implementační nástroje aplikovat
na navrhované systémy automaticky (pokud je jim to v nastavení dovoleno) a designér tak
nemusí měnit již hotový zdrojový kód. Toho lze využít v případě, že chceme provést zvýšení
frekvence technikou pipelining, aniž bychom ve zdrojových kódech zasahovali do již
hotového popisu kombinační části, kterou chceme rozdělit. Princip této metody je naznačen
na Obr. 86. Spočívá v přidání několika registrů (počet odpovídá počtu stupňů pipeliningu) na
výstup systému, který chceme podrobit pipeliningu. Poté během implementace systém
automaticky použije techniku register retiming (balancing), čímž rozdělí velkou kombinační
část na několik menších a ty přesune mezi jednotlivé klopné obvody.
FEKT Vysokého učení technického v Brně
108
REG
KČ1
REG
KČ2
REG
Zpoždění 2 ns
Zpoždění 12 ns
FMAX = 83 MHz
REG
KČ1
Zpoždění 8 ns
FMAX = 125 MHz
Obr. 85
REG
KČ2
REG
Zpoždění 7 ns
Princip použití techniky register retiming (balancing) pro zvýšení pracovního
kmitočtu
Poslední technikou používanou pro zvýšení mezní pracovní frekvence je replikace
registrů (register replication). Tato optimalizace probíhá na úrovni implementace, uživatel má
zpravidla pouze možnost tuto optimalizaci povolit nebo zakázat. Metodu lze aplikovat
v případě, že v navrženém systému existuje signál, který je přiveden k velkému množství
dalších obvodů (LUT, klopné obvody), které se nacházejí na velké ploše čipu. Rozvedení
jednoho signálu po větší ploše FPGA je problematické a může snadno způsobit velké
zpoždění. Počet vstupů připojených na jeden výstup se označuje jako fanout. Pokud je počet
připojených vstupů příliš velký (large fanout), je dále rychlost šíření změny signálu omezena
vlivem velké kapacitní zátěže. Typickým příkladem takových signálů jsou signály reset a
clock enable.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
REG
REG
KČ1
REG
109
REG
Zpoždění 12 ns
FMAX = 83 MHz
REG
KČ
KČ
REG
Zpoždění 5 ns
KČ
REG
Zpoždění 4 ns
REG
Zpoždění 4 ns
Největší zpoždění 5 ns => FMAX = 200 MHz
(ideálně zpoždění 4 ns => FMAX = 250 MHz)
Obr. 86 Využití techniky register retiming (balancing) povolené v rámci procesu
implementace pro zvýšení pracovního kmitočtu (automatický pipelining)
Replikace registrů spočívá v náhradě jediného registru instanciací více registrů
rozmístěných v místech, kde jsou příslušné cílové obvody (vstupy příslušného signálu).
Velká zátěž => pomalé
Delší spoje => větší zpoždění
LUT
REG
LUT
LUT
REG
LUT
LUT
REG
LUT
LUT
REG
LUT
REG
LUT
LUT
LUT
REG
LUT
LUT
REG
LUT
LUT
REG
LUT
LUT
REG
LUT
REG
LUT
LUT
REG
LUT
Malá zátěž => rychlé
Kratší spoje => menší zpoždění
LUT
REG
REG
LUT
REG
Obr. 87
REG
Princip metody replikace registrů
LUT
FEKT Vysokého učení technického v Brně
110
6 Hard IP makra v obvodech FPGA
V průběhu vývoje obvodů FPGA se ukázalo jako užitečné integrovat přímo na čip
některé funkce (bloky), které se opakovaně používají ve více různých designech. Zprvu šlo o
bloky čistě digitální, jejichž funkční ekvivalenty bylo možné implementovat přímo ve
struktuře programovatelných buněk hradlových polí. Takovými bloky jsou například paměti
RAM/ROM a celočíselné násobičky. Dále výrobci začali implementovat na čip bloky
obsahující i analogové části, které mohly být dříve implementovány pouze s využitím
externích součástek mimo vlastní FPGA. Mezi takové bloky patří bloky pro úpravu
hodinového signálu založené na PLL nebo vysokorychlostní transceivery.
Implementace bloků formou hard IP (hard makro) přinesla několik výhod:

Snížení plochy na čipu, kterou daná funkce zabírá; srovnatelný blok
implementovaný pomocí běžných logických buněk FPGA zabírá typicky 10-50 krát
větší plochu, než dedikovaný hard IP blok

Vyšší mezní pracovní kmitočet takových bloků; jelikož je blok fyzicky menší a
může být optimalizován přímo pro danou funkci, jsou výrazně menší také zpoždění,
která omezují mezní pracovní kmitočet v synchronních systémech

Snížení spotřeby bloku; tento fakt logicky vyplývá z výrazně menší plochy zabrané
na čipu FPGA a vysokého stupně optimalizace

Možnost implementovat i bloky vyžadující analogové prvky, jako jsou fázové
závěsy, ekvalizéry a podobně
Implementace dedikovaných hard IP jader na čip má ale i své nevýhody. Hlavní
nevýhodou je fakt, že pokud v designu tyto buňky nejsou potřeba, zůstávají na čipu nevyužité
a zákazník tak koupí takového obvodu platí za část čipu navíc. Pokud naopak design vyžaduje
více IP jader daného typu, než kolik jich je připraveno na vybraném čipu, nezbývá, než použít
čip větší (je-li k dispozici) nebo část těchto jader realizovat pomocí obecné programovatelné
struktury FPGA. Funkce hard IP jader je navíc pevně dána, lze ji měnit jen do určité míry a
nemusí tedy vyhovět pro každou aplikaci.
Mezi nejdůležitější bloky dnes patří blokové paměti RAM, bloky pro podporu DSP
operací a vysokorychlostní transceivery. Tyto bloky budou dále podrobně popsány. Kromě
nich se lze setkat s řadou dalších bloků, které sice nejsou tak běžné a snad jsou i méně
používané, ale v řadě aplikací mohou výrazně zvýšit užitnou hodnotu FPGA. Formálně se
mezi ně řadí i bloky pro úpravu hodinového signálu popsané v kapitole 5.2.

Procesory: drtivá většina systémů s obvody FPGA obsahuje i procesor. Procesor
lze realizovat v FPGA pomocí programovatelných buněk, ale taková realizace
není vhodná pro aplikace vyžadující použití vyšších operačních systémů (např.
Linux). Proto se do obvodů FPGA začaly implementovat jádra standardních
procesorů. Prvním takovým jádrem byl procesor IBM PowerPC ve vybraných
řadách obvodů Virtex firmy Xilinx. Od této platformy ale bylo upuštěno a dnes
oba výrobci (Xilinx a Altera) nabízejí některé řady svých FPGA vybavené
dvoujádrovými procesory ARM Cortex A9. Tyto obvody již výrobci neoznačují
jako FPGA, ale jako SoC (System on Chip).

Řadiče standardních rozhraní: typicky jde o nižší vrstvy protokolů Ethernet a
PCI-Express, které se často používají pro komunikaci se systémy v FPGA. Tyto
bloky mají úzkou vazbu na vysokorychlostní transceivery.
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
111
 Řadiče pamětí DRAM: obsluha dynamických pamětí RAM (DRAM) je
poměrně komplikovaná, proto se pro jejich obsluhu používají speciální bloky
(řadiče, drivery, kontroléry). Ty lze realizovat v běžné programovatelné
struktuře, ale některé řady FPGA mají takové kontroléry připravené již jako hard
IP bloky.
 JTAG kontrolér: jde o řadič rozhraní JTAG, které se standardně používá pro
testování a konfiguraci FPGA. Tento kontrolér je v novějších obvodech
zpřístupněn uživatelům (designerům) a lze jej využít například pro komunikaci
FPGA s PC prostřednictvím programovacího kabelu.
 Bloky monitorující stav čipu: jde v podstatě o analogově digitální (AD)
převodník doplněný vstupním multiplexorem, který umožňuje monitorovat
vnitřní napětí a teploty na čipu FPGA. Kromě toho má obvykle několik
externích vstupů, které umožňují s použitím jednoduchých senzorů měřit i
veličiny (napětí, teplotu…) mimo FPGA. Takové převodníky mají poměrně
malou rychlost převodu (typicky 200 kSps) a nízké rozlišení (10 bitů), což ale
pro danou aplikaci plně postačuje.
6.1 Blokové paměti RAM
Jako první hard IP makra se na běžné čipy FPGA začaly implementovat dedikované
paměťové struktury. Paměti bylo do té doby možné realizovat přímo v FPGA dvěma způsoby:
využitím klopných obvodů nebo využitím LUT tabulek ve funkci distribuované paměti RAM.
Použitím dedikovaných klopných obvodů nelze efektivně realizovat paměťové struktury
větší než, několik bitů, neboť i malá paměť by zabrala velké množství programovatelných
buněk FPGA. I v největších současných obvodech FPGA (např. Xilinx Virtex UltraScale) je
k dispozici kolem 5 milionů klopných obvodů, což by stačilo na implementaci paměti o
velikosti 5 Mb. Taková paměť by ale zabrala prakticky celý čip, který by tak již nemohl
vykonávat další funkce. Distribuovaná paměť RAM založená na LUT (3.2) kompenzuje
tento nedostatek pro malé paměti (o velikosti řádově desítek až tisíců bitů). Dnešní největší
obvodu FPGA mohou tímto způsobem realizovat přibližně 5-20 krát větší paměti, než
v případě použití klopných obvodů. V současném největším obvodu firmy Xilinx Virtex
UltraScale můžeme potenciálně využít 28 Mb distribuované pamětí RAM, opět ovšem za
cenu značné části strukturních prostředků FPGA. Pro realizaci větších paměťových struktur se
distribuované paměti opět ukazují jako příliš neefektivní. V případě potřeby větší paměti tak
byl návrhář odkázán na externí paměťové čipy, které zvyšovaly cenu zařízení, snižovaly
spolehlivost a především nebyly přímo navázány na jádro obvodu FPGA. Tento posledně
jmenovaný fakt znamenal nenulovou latenci při přístupu do paměti a omezenou propustnost.
Tento problém odstranily blokové paměti RAM (BRAM), implementované v podobě
větších ucelených paměťových bloků s přímou vazbou na programovatelnou strukturu FPGA.
přinesly možnost implementovat přímo na čipu poměrně velké paměťové struktury, které byly
relativně efektivní a zároveň měly velmi dobrou vazbu na další bloky navrhovaného systému.
První paměťové bloky měly velikost několika kilobitů (4096 bitů v obvodech Xilinx Virtex) a
na čipu bylo pouze několik takových bloků (8 až 32). Přesto šlo o významné zlepšení
architektury, které podstatně zvýšilo výpočetní výkon a možnosti FPGA.
Dnešní obvody obsahují paměťové bloky o velikosti typicky 10-36 kb, přičemž na
jednom čipu bývají i tisíce takových bloků. Celkově je tak v jednom obvodu FPGA
FEKT Vysokého učení technického v Brně
112
k dispozici kapacita i přes 100 Mb BRAM, přičemž ta má minimální latenci a obvykle může
pracovat na pracovním kmitočtu jádra hradlového pole.
Různé architektury FPGA dnes mají různě velké elementární buňky blokové paměti
(tab. 6). Důvodem je snaha výrobců optimalizovat strukturu a cenu celého FPGA tak, aby
byly paměti co nejlépe využity a zároveň umožňovaly dostatečnou flexibilitu návrhu.
Společnost Altera například v současné době implementuje do svých obvodů dva typy BRAM
bloků o velikosti 10 kb, respektive 20 kb, zatímco společnost Xilinx implementuje do svých
obvodů bloky o velikosti 18 kb nebo 36 kb. V případě obou firem jsou menší paměti použity
v obvodech optimalizovaných na cenu a spotřebu, zatímco větší bloky nalezneme v obvodech
optimalizovaných na výpočetní výkon. Ve střední řadě obvodů (např. Arria V) lze nalézt oba
typy BRAM. Lze očekávat, že v budoucnu bude velikost elementárních bloků BRAM růst.
Tab. 6
Přehled velikostí, označení a uspořádání blokových pamětí RAM ve vybraných
obvodech FPGA.
výrobce
Xilinx
Altera
řada
Spartan-6
Virtex-5
Virtex-6
Artix-7
Kintex-7
Virtex-7
Cyclone V
Arria V
Stratix V
označení bloku
RAM
BRAM
BRAM
BRAM
BRAM
BRAM
BRAM
M10K
M10K/M20K
M20K
velikost (uspořádání)
18 kb (2 x 9 kb)
36 kb (2 x 18 kb)
36 kb (2 x 18 kb)
36 kb (2 x 18 kb)
36 kb (2 x 18 kb)
36 kb (2 x 18 kb)
10 kb
10 kb / 20 kb
20 kb
A_data_in (35:0)
A_address (15:0)
A_WE(3:0)
A_EN
A_RST
A_data_out (35:0)
A_CLK
B_data_in (35:0)
Memory
Array
36 kb
B_address (15:0)
B_WE(3:0)
B_EN
B_RST
B_data_out (35:0)
B_CLK
Obr. 88
Dvouportová bloková paměť RAM 36 kb
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
113
Zjednodušený symbol jednoho bloku BRAM je pro ilustraci znázorněn na obr. 88. Jeho
jádrem je paměťové pole, v tomto případě o velikosti 36 kb, ke kterému je možné přistupovat
pomocí dvojice plnohodnotných portů A a B. Paměťové pole a přístupové porty lze
nakonfigurovat do několika různých režimů tak, aby co nejlépe vyhovovaly cílové aplikaci.
K poli lze přistupovat s různou šířkou datové sběrnice a tomu pak odpovídá počet slov, která
jsou v paměti přístupná. Módy dostupné v obvodu Virtex-7 jsou pro ilustraci uvedeny Tab. 7.
Mnoho aplikací vyžaduje jiné uspořádání a jiné velikosti paměti, než nabízí základní
konfigurace. V případě, že je potřeba paměť menší (menší hloubka a/nebo šířka datového
portu), nezbývá než část paměti BRAM ponechat nevyužitou. Příkladem může být paměť
1k x 8b nebo 512 x 48b. Naopak pro realizaci větších pamětí je třeba spojit více pamětí
BRAM, které jsou pro tento účel vybaveny dedikovanými porty. Konfiguraci 2k x 64b je
například možné získat použitím čtveřice blokových pamětí BRAM 36k.
Všimněte si, že stejný počet pamětí BRAM (4) lze použít v případě, že potřebná
konfigurace paměti je 2k x 72b (o 1 Byte širší datové slovo při zachování hloubky paměti).
Tohoto faktu („byte zdarma“) lze při návrhu často využít ve prospěch zjednodušení dalších
částí designu. Pro optimální návrh je tedy předem nutné znát architekturu cílového obvodu
FPGA, v tomto případě nativní uspořádání jeho paměťových bloků (Tab. 7).
Tab. 7
Možná uspořádání jedné paměti BRAM 36k v obvodech Virtex-7.
Konfigurace
paměti
32k x 1
16k x 2
8k x 4
4k x 9
4k x 8
2k x 18
2k x 16
1k x 36
1k x 32
512 x 72
512 x 64
počet
slov [-]
32768
16384
8192
4096
4096
2048
2048
1024
1024
512
512
bitová
šířka [b]
1
2
4
9
8
18
16
36
32
72
64
velikost
paměti [b]
32 768
32 768
32 768
36 864
32 768
36 864
32 768
36 864
32 768
36 864
32 768
Z hlediska přístupu k paměťovému poli lze typicky volit z několika možností:

Jedno-/dvouportová paměť ROM

Jednoportová paměť RAM

Zjednodušená dvouportová paměť RAM

Plně dvouportová paměť RAM

Paměť FIFO
Ačkoliv se jako možné využití blokové paměti běžně uvádí funkce FIFO, nelze bloky
BRAM přímo takto použít. Paměť FIFO vyžaduje ke své funkci přídavné logické obvody,
které zajišťují funkci ukazatelů do paměti, předávání informace o stavu ukazatelů a správu
řídicích a stavových signálů. Ve starších obvodech FPGA bylo nutné tento logický obvod
implementovat pomocí běžných programovatelných buněk, které obklopují BRAM. Paměť
FIFO je ale velmi běžný, často používaný blok. Proto je v novějších obvodech FPGA tento
114
FEKT Vysokého učení technického v Brně
logický obvod připraven jako součást bloku BRAM a volitelně jej lze použít právě
v kombinaci s příslušným blokem paměti.
Paměti dnes často podporují kontrolu obsahu (typicky pomocí paritních bitů) nebo i
jejich korekci chyb prostřednictvím vhodného kódování (ECC; Error Correction Code).
Například v obvodech Virtex-7 v módu 512 x 64 b může být zbývající část paměti (512 x 8 b)
využita pro uložení kontrolního součtu Hammingova kódu, který pak slouží k detekci i
korekci chyb. Hammingův kodér i dekodér je u těchto FPGA přímo součástí BRAM, takže
použití kódu nevyžaduje použít běžnou programovatelnou strukturu obvodu a má relativně
malý vliv na mezní pracovní kmitočet paměti.
6.2 Bloky pro podporu DSP operací
Tak, jak se zvyšovaly počty strukturních prvků v obvodech FPGA a zvyšoval se jejich
výkon, zvětšovalo se také množství aplikací, pro které se hradlová pole používaly. Brzy se
ukázaly jako ideální platforma pro implementaci funkcí číslicového zpracování signálu
(Digital Signal Processing; DSP). Postupně FPGA začaly konkurovat signálovým
procesorům (Digital Signal Processor; DSP), které již dnes z hlediska výpočetního výkonu
dalece předčí. Výhodou signálových procesorů vzhledem k FPGA je ale zůstává snazší a
rychlejší proces implementace (popisu funkce) a také efektivnější implementace složitých
algoritmů.
Základní operace, které jsou realizovány při zpracování signálů, jsou sčítání a násobení.
Velmi často, například ve filtrech, jsou tyto operace velmi těsně spjaty a mluvíme o jedné
operaci vynásobení a přičtení (Multiply and Accumulate; MAC). První FPGA musely bloky
realizující sčítání a násobení, tedy sčítačky a násobičky, realizovat v obecné programovatelné
struktuře. Implementace sčítačky je poměrně nenáročná na hardwarové prostředky, na rozdíl
od implementace násobičky. Původní FPGA umožňovaly implementovat jen malý počet
násobiček, což značně omezovalo jejich použití. Proto byly mezi logické buňky FPGA
přidány i dedikované buňky násobiček, které byly přímo určeny pro DSP operace (i když je
samozřejmě šlo využít i jiným způsobem). První takové obvody byly uvedeny na trh kolem
roku 2000 a jeden čip obsahoval až 168 celočíselných násobiček 18x18 bitů (Xilinx Virtex II).
Postupem času se nejen zvětšoval počet těchto bloků implementovaných v jednom
FPGA (dnes i přes 5000), ale především došlo k jejich výraznému rozšíření z hlediska
funkčnosti, jak je vidět na Obr. 89. Postupně byla násobička zvětšována (dnes například
27x18 bitů) a doplněna o další bloky podporující implementaci typických DSP funkcí. Bloky
typicky obsahují několik registrů pro zvýšení propustnosti (podpora pipeliningu), dedikované
sčítačky (pre-adder a akumulátor), které je možné nastavit do režimu odčítání či realizace
logických operací a v některých typech i dedikovaný komparátor. V některých obvodech lze
najít i malé paměti pro uložení často používaných operandů násobičky (tzv. banky
koeficientů; na obrázku označeno RAM).
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
115
RAM
X
+/–
+
–
=
Obr. 89
Vnitřní struktura bloku pro podporu DSP operací.
Veškeré bloky, které jsou implementovány v těchto buňkách, pracují přímo s čísly
vyjádřenými ve formátu pevné desetinné čárky (fixed point). Tento formát umožňuje
realizovat aritmetické bloky jednodušší, než odpovídající bloky pracující s vyjádřením čísel
v plovoucí desetinné čárce (floating point). Jejich výhody tkví právě v jednodušší
implementaci a zpravidla vyšší výpočetní rychlosti. Nevýhodou je pak menší dynamický
rozsah, kterého je možné dosáhnout.
V nejnovějších FPGA (která prozatím nejsou dostupná) budou nově k dispozici i bloky,
které budou podporovat operaci sčítání a násobení čísel s plovoucí desetinnou čárkou
s jednoduchou přesností (Single-Precision Floating Point) dle normy IEEE 754.
Typicky se FPGA používají pro realizaci rychlých, poměrně jednoduchých DSP
subsystémů, jako jsou filtry, softwarově definované přijímače, bloky pro zpracování
zvukových a video signálů (např. segmentace, multiplexace), radarových signálů, atd. Bloky,
které realizují složitější algoritmy, bývá výhodnější implementovat na jiné platformě (obvykle
procesor typu DSP nebo ARM), přičemž FPGA může být použít jako koprocesor nebo blok
pro předzpracování signálu. Mezi základní bloky těchto systémů patří
 Násobičky; reálné i komplexní, celočíselné i ve formátu floating point.
 Filtry s konečnou impulzní odezvou FIR (Finite Impulse Response)
 Filtry typu CIC (Cascaded Integrator-Comb); nevyžadují použití násobiček,
proto mohou pracovat na velmi vysokém pracovním kmitočtu
 Bloky pro realizaci algoritmu CORDIC (Coordinate Rotation Digital Computer)
 Bloky realizující standardní transformace jako FFT (Fast Fourier Transform),
DCT (Discrete Cosine Transform).
 Bloky pro přímou digitální syntézu DDS (Direct Digital Synthesis)
Filtry s nekonečnou impulzní odezvou (IIR; Infinite Impulse Response) sice mívají
podstatně menší nároky na implementaci ve srovnání s odpovídajícími FIR filtry, ale
vzhledem k jejich potenciální nestabilitě se v FPGA (a ani ASIC) téměř nepoužívají.
FEKT Vysokého učení technického v Brně
116
6.3 Vysokorychlostní transceivery
S rostoucími požadavky na propustnost rozhraní byla v 90. letech rozšiřována tehdejší
paralelní rozhraní o další datové vodiče a zároveň byla zvyšována přenosová rychlost na jeden
vodič sběrnice. Brzy se ukázalo, že je velmi obtížné provádět propojení systémů pomocí 32,
64 nebo i více datových vodičů a zároveň dodržet stále přísnější požadavky na časové
parametry a integritu jednotlivých signálů. Proto se od paralelního přenosu dat začalo
upouštět ve prospěch vysokorychlostního sériového přenosu.
Pokud má být například paralelní sběrnice čítající 32 datových vodičů, jejíž každý vodič
přenese 200 Mb/s, nahrazena vysokorychlostní sériovou linkou, musí přenosová rychlost této
sériové linky odpovídat 6,4 Gb/s. Tak vysokou přenosovou rychlost nelze realizovat běžnými
vstupy a výstupy FPGA. Proto se do obvodů FPGA začaly implementovat specializované
bloky, které jsou určeny pro realizaci rychlých sériových rozhraní – transceivery.
Tx path
8b/10b
FIFO
Preemphasis
PISO
Pattern
Generator
Rx path
8b/10b
FIFO
Equalization
CDR
SIPO
Pattern
Detector
PLL
Obr. 90
Zjednodušená struktura vysokorychlostního transceiveru FPGA.
Blokové schéma transceiveru je na Obr. 90. Data určená k vysílání jsou do vysílací části
(Tx path) transceiveru přivedena z programovatelné struktury paralelním rozhraním, které má
šířku 8 až 128 bitů, podle použitého standardu a požadované komunikační rychlosti. Tento
datový signál může být podroben linkovému kódování, které odstraňuje stejnosměrnou složku
signálu a zajišťuje dostatečnou hustotu hran v přenášeném signálu. Kodéry 8b/10b jsou běžně
součástí těchto transceiverů. Kodéry 64b/66b a 128b/130b, jsou dostupné pouze v
nejnovějších transceiverech a pokud chceme tyto kódy použít ve starších FPGA, je třeba je
implementovat v obecné programovatelné struktuře FPGA. Do cesty vysílaného signálu lze
dále volitelně zařadit paměť FIFO, která v řadě případů zjednoduší přístup k transceiveru
z hlediska hodinových signálů. Paralelní datový signál je v bloku PISO (Parallel In Serial
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
117
Out) převeden do sériové podoby a převeden na diferenční signál pomocí výstupního budiče.
Budič je do značné míry nastavitelný a umožňuje snadné přizpůsobení konkrétnímu provedení
fyzického spoje (preemfáze, rozkmit napětí…).
Na straně přijímače je signál nejdříve podroben procesu ekvalizace a poté procesu
obnovy symbolové synchronizace (CDR; Clock and Data Recovery). Sériový signál je pak
převeden blokem SIPO (Serial In Parallel Out) na paralelní s šířkou, která obvykle odpovídá
šířce datového signálu na straně vysílače. Volitelně lze opět provést proces dekódování
(8b/10b…) a použít paměť FIFO.
Transceivery jsou dále vybaveny testovacími prvky, které umožňují automaticky vysílat
a přijímat testovací sekvence, realizovat zpětnou vazbu na různých úrovních a podobně. Vždy
několik transceiverů má společný blok pro generování přesných hodinových signálů, které
vyžadují použití kvalitních externích referenčních oscilátorů. Jejich kmitočet a kvalitu je
nutné vybrat podle komunikačního standardu, který má být transceiverem realizován.
V Tab. 8 je uveden stručný přehled dnes dostupných obvodů FPGA s transceivery a
jejich rychlosti.
Tab. 8
Výrobce
Xilinx
Altera
Přehled vybraných obvodů FPGA s vysokorychlostními transceivery.
Řada
Virtex-5 LXT, SXT
Virtex-5 TXT, FXT
Virtex-6 LXT, SXT
Virtex-6 HXT
Spartan-6
Artix-7
Kintex-7
Virtex-7
Zynq-7000
Kintex-7 U
Virtex-7 U
Stratix IV
Stratix IV GT
Stratix V GX
Stratix V GT
Arria GX
Arria II GX
Arria V
Cyclone V
Podporované přenosové rychlosti [Gb/s]
0,1–3,75
0,15–6,5
0,48–6,6
0,48–6,6 + 9,95–11,18
0.614–0.81 + 1.22–1.62 + 2.45–3.125
0,5–6,6
0,5–12,5
0,5–13,1
0,5–12,5
0,5–16,3
0,5–32,75
0,6–8,5
2,5–6,5 + 9,9–11,3
0,6–14,1
0,6–12,5 + 19,6–28,05
0,6–3,125
0,155–3,75
0,6–12,5
0,6–3,125
FEKT Vysokého učení technického v Brně
118
Seznam použité literatury
[1]
IEEE Std 1076-2008 - IEEE Standard VHDL Language Reference Manual. 2009.
[2]
IEEE Std 1164-1993 - IEEE Standard Multivalue Logic System for VHDL Model
Interoperability (Stdlogic1164). IEEE Standards Association, 1993
[3]
IEEE Std 1076.3-1997 - IEEE Standard VHDL Synthesis Packages. IEEE Standards
Association, 1997
[4]
KOLOUCH, J.: Programovatelné logické obvody – přednášky. [Skriptum FEKT VUT
v Brně.] Brno, 150 s. 2009
[5]
KOLOUCH, J.: Programovatelné logické obvody – jazyk VHDL – počítačové cvičení.
[Skriptum FEKT VUT v Brně.] Brno, 127 s. 2011
[6]
OTT, D. E. – WILDEROTTER, T. J.: A Designer’s Guide to VHDL. Kluwer
Academic Publishers, 1998, 936 s. ISBN 978-0120887859
[7]
PINKER, J., POUPA, M.: Číslicové systémy a jazyk VHDL, BEN - technická
literatura, 2006, 352 s. ISBN 80-7300-198-5
[8]
KRÁL, J.: Řešené příklady ve VHDL, BEN - technická literatura, 2010, 127 s. ISBN
978-80-7300-257-2
[9]
ŠŤASTNÝ, J.: FPGA prakticky, BEN - technická literatura, 2011, 200 s. ISBN 97880-7300-261-9
[10]
JAIN, J., NARAYANA, A., FUJITA, M., SANGIOVANNI, V., A.: A survey of
techniques for formal verification of combinational circuits. Proceedings of the 1997
International Conference on Computer Design (ICCD '97), IEEE, 1997, s 445-454.
ISSN 1063-6404
[11]
MAXFIELD, C. The Design Warrior’s Guide to FPGAs. 1st ed. Newnes – Elsevier,
Burlington, MA, 2004. 542 s. ISBN 0-7506-7604-3
[12]
WAKERLY, J. F. Digital Design Principles and Practices. Prentice Hall, 2001, 928 s.
ISBN 978-0131733497
[13]
GRANBERG, T. Handbook of Digital Techniques for High-Speed Design. Prentice
Hall, 2004, 976 s. ISBN 978-0131422919
[14]
IEEE Std 802.3-2012 - IEEE Standard for Ethernet. IEEE Standards Association, 2012
[15]
Xilinx, Inc., 2100 Logic Drive San Jose, CA 95124-3400, USA. 7 Series FPGAs
Memory Resources User Guide (ug473, v1.10). [online], 2014, cit. [2014-06-04].
Dostupné na WWW:
<http://www.xilinx.com/support/documentation/user_guides/ug473_7Series_Memory_
Resources.pdf>
[16]
Xilinx, Inc., 2100 Logic Drive San Jose, CA 95124-3400, USA. XST User Guide for
Virtex-4, Virtex-5, Spartan-3, and Newer CPLD Devices (ug627, v14.5). [online],
2014, cit. [2014-06-04]. Dostupné na WWW: <
http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_6/xst.pdf >
Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO
Seznam použitých zkratek
AES
ANSI
ASIC
ASSP
BGA
BRAM
BRGC
CAD
CDR
CIC
CML
CMOS
CORDIC
CPLD
CRC
DCI
DCM
DDR
DIL
DLL
DRAM
DSP
ECAD
ECC
EDA
EEPROM
EMC
EPROM
ESR
FCBGA
FIFO
FIR
FPGA
GAL
HDL
HSTL
IEEE
IIR
IP
ISI
JEDEC
JTAG
LLC
LUT
LVDS
LVPECL
Advanced Encryption Standard
American National Standards Institute
Application Specific Integrated Circuit
Application Specific Standard Part
Ball Grid Array
Block RAM
Binary-Reflected Gray Code
Computer‑ Aided Design
Clock and Data Recovery
Cascaded Integrator‑ Comb (filter)
Current Mode Logic
Complementary Metal‑ Oxide Semiconductor
Coordinate Rotation Digital Computer
Complex Programmable Logic Device
Cyclic Redundant Check
Digitally Controlled Impedance
Digital Clock Manager
Dual Data Rate
Dual In‑ Line (package)
Delay‑ Locked Loop
Dynamic Random Access Memory
Digital Signal Processing / Digital Signal Processor
Electronics Computer Aided Design
Error Correction Code
Electronic Design Automation
Electrically Erasable Programmable Read‑ Only Memory
Electromagnetic Compatibility
Erasable Programmable Read‑ Only Memory
Equivalent Series Resistance
Flip‑ Chip Ball Grid Array
First‑ In, First‑ Out
Finite Impulse Response (filter)
Field Programmable Logic Array
Generic Array Logic
Hardware Description Language
High-Speed Transceiver Logic
Institute of Electrical and Electronics Engineers
Infinite Impulse Response (filter)
Intellectual Property
Inter‑ Symbol Interferences
Joint Electron Devices Engineering Council
Joint Test Action Group
Logical Link Control Sub‑ layer
Look‑ Up Table
Low‑ Voltage Differential Signaling
Low‑ Voltage Positive Emitter Coupled Logic
119
120
MAC
NRE
OTP
PAL
PCI
PCS
PECL
PHY
PISO
PLA
PLCC
PLD
PLL
PMA
PMD
POS
PROM
QDR
QFN
QFP
RAM
ROM
RTL
SDH
SDR
SDRAM
SIPO
SMPS
SONET
SOP
SPLD
SRAM
SSO
SSTL
TQFP
USB
UV
VHDL
VHSIC
VQFP
FEKT Vysokého učení technického v Brně
Media Access Controller / Multiply and Accumulate
Non‑ Recurring Engineering (costs)
One-Time Programmable
Programmable Array Logic
Peripheral Component Interconnect
Physical Coding Sub‑ layer
Positive Emitter Coupled Logic
Physical Layer (chip)
Parallel In Serial Out
Programmable Logic Array
Plastic Leaded Chip Carrier
Programmable Logic Device
Phase‑ Locked Loop
Physical Medium Attachment Sub‑ layer
Physical Medium Dependent Sub‑ layer
Product of Sums
Programmable Read‑ Only Memory
Quad Data Rate
Quad Flat No-leads (package)
Quad Flat Package
Random Access Memory
Read‑ Only Memory
Register Transfer Logic
Synchronous Digital Hierarchy
Single Data Rate
Synchronous Dynamic Random Access Memory
Serial In Parallel Out
Switched‑ Mode Power Supply
Synchronous Optical Networking
Sum of Products
Simple Programmable Logic Device
Static Random Access Memory
Simultaneously Switching Outputs
Stub Series Terminated Logic
Thin Quad Flat Package
Universal Serial Bus
Ultra Violet
VHSIC Hardware Description Language
Very High Speed Integrated Circuit
Very Thin Quad Flat Package

Podobné dokumenty

Ovlivněte své barvy

Ovlivněte své barvy také omezený. Nejen, že nejsme schopni, na  rozdíl od některých živočichů, pojmout vlnové délky mimo viditelnou oblast spektra (UV, IR záření), ale rovněž naše schopnost zachytit velmi malé množstv...

Více

Trendy a Tradice 2009 - SBORNÍK - Biosférická rezervace Dolní

Trendy a Tradice 2009 - SBORNÍK - Biosférická rezervace Dolní 01. Raneš, V.: Digitalizace archivních pramenů ve Státním oblastním archivu v Třeboni. Abstrakt: Autor objasňuje počátky digitalizace v SOA Třeboň a vysoce hodnotí spolupráci s bývalým oddělením Hi...

Více

CX1000

CX1000 dle volby (společné pro všechny kanály a úrovně alarmu) Zobrazení: V případě výskytu alarmu je stav alarmu (typ) zobrazený v části číselných hodnot displeje. Je rovněž zobrazená často se opakující ...

Více

Precizní analogové rozhraní pro zpracování zvuku

Precizní analogové rozhraní pro zpracování zvuku avšak existence těchto formátů a jejich stoupající četnost výskytu opodstatňuje potřebu hardware, který je schopen tyto formáty přehrát. Většina uživatelů bez vyšších nároků na kvalitu reprodukce p...

Více

Programování dle normy IEC 61 131

Programování dle normy IEC 61 131 Obrázek 5 Ukázka programu v jazyku ST Deklarační část POU Deklarační část POU obsahuje definice proměnných potřebných pro činnost POU. Proměnné jsou používány pro ukládání a zpracování informací. K...

Více

Spolehlivost, diagnostika a kódování pro integrovanou výuku

Spolehlivost, diagnostika a kódování pro integrovanou výuku Vznik těchto skript byl podpořen projektem č. CZ.1.07/2.2.00/28.0062 Evropského sociálního fondu a státním rozpočtem České republiky.

Více

2005 / 3 únor

2005 / 3 únor Macworld Expo 2005 – pro všechny fanoušky a uživatele počítačů značky Apple nejdůležitější událost roku. Pravidelně jsou zde představovány nové zajímavé produkty a poodkrývány plány do budoucna. Ja...

Více

zde

zde Tímto je spojovaní hotovo. Ověřte, že program lze přeložit a funguje. Nyní proveďte uložení spojené verze do repository pomocí: “SVN Commit“, protože doposud jsou všechny změny uloženy pouze v loká...

Více

Atmel CPLD

Atmel CPLD je výhodne hlavně pro pouzdra TQFP, SOxx, TSSOP. Všechny PLD podporují JTAG – Joint Test Action Group. AT750 mají garanci uchování dat 20let ATF1500 také 20let, 10000x přepsatelné AT2500 garance uc...

Více