Digitální technika Jazyk VHDL, základy návrhu Ing. Jakub Št astný, Ph.D. 1 1 stastnj1@seznam.cz FPGA laboratory Department of Circuit Theory, FEE CTU Prague Technická 2, Praha 6, 166 27 http://amber.feld.cvut.cz/fpga Přednášky - DIT
1 První kroky Proč HDL? Úrovně abstrakce Typická podoba návrhu Základy jazyka První návrh 2 Základní číslicové struktury Kombinační obvody Základní aritmetické operace Jednoduché sekvenční obvody 3 Slídy kuchařka na později
http://amber.feld.cvut.cz/fpga Doporučená literatura
Před HDL jazyky schéma Použití schématických editorů pro přímé kreslení schématu bylo sice jednoduché na implementaci a velký pokrok proti kreslení na papír, ale přinášelo řadu problémů: potřebujeme proprietární editor ukládáme v proprietárním formátu kreslení je časově náročné ve schématu je obížné se vyznat návrh je prováděn na příliš nízké úrovni abstrakce schéma i jednoduchých obvodů je veliké a trvá dlouho, než se v něm zorientujete obtížná tvorba parametrizovatelných konstrukcí schéma není přenositelné mezi technologiemi (FPGA, ASIC,...) malá produktivita práce. Proto se dnes zejména používá pro prohlížení obvodů vytvořených z HDL popisu (pro review) a při opravách.
Hardware Description Languages Hlavní proud implementace číslisových obvodů je dnes pomocí HDL jazyků, které odstraňují většinu nevýhod schematického zápisu: místo schematu použijeme speciální programovací návrhový jazyk zápis běžným textovým editorem, univerzální formát vyšší produktivita práce jednoduché sdílení jednodušší opětovné použití přenositelnost nástroje,techlib VHDL, Verilog, SystemVerilog, System-C (běžně kombinujeme) popis na různých úrovních abstrakce Ale pozor: stále se jedná o návrh, nikoliv programování, jak zjistíte brzy sami.
Jazyky HDL k čemu použít? Specifikace Takže co s tím lze dělat? systémový návrh volba FPGA hotové RTL constraints netlist constraints konfigurace FPGA Návrh systému Kódování návrhu (Design Capture) Syntéza Rozmístění+propojení (Place & Route) RTL simulace Gate level simulace Statická časová analýza Nakonfigurovaný obvod Změna specifikace simulovat pomocí číslicového simulátoru vytvořit vlastní obvod pomocí nástrojů pro implementaci použít speciální nástroje pro formální analýzu obvodu (linting, propojení, formální verifikace,...) Validace
Úvod úrovně abstrakce Abstraktni popis Vetsi "rezervy" Vice detailu Konkretni popis behavioural level RTL level mnozstvi detailu Gate level Transistor level Physical level nejrychlejsi implementace nejrychlejsi odladeni nejlevnejsi nejmene presne odhady nejpresnejsi odhady nejpomalejsi implementace nejpomalejsi odladeni nejdrazsi
Úrovně abstrakce proces návrhu neustále se zpřesňující model převádíme popis (model) návrhu mezi úrovněmi abstrakce čím vyšší úroveň abstrakce, tím potřeba větší rezervy a méně detailů přechod na nižší úroveň abstrakce detaily přidává, zvyšuje složitost modelu modely na vyšší úrovni abstrakce se snáze implementují, simulace na vyšší úrovni abstrakce běží rychleji, rychlejší odladění chyb v návrhu. abstraktnější model nezachycuje detaily, některé typy chyb nelze na vyšších úrovních abstrakce ani detekovat
Behaviorální úroveň Příklad: popis obvodu pro sečtení čtyř čísel: e = a + b + c + d Je to jeden řádek kódu. popis chováním, algoritmus v programovacím jayzce, programujeme př. dělička implementována operátorem dělení jeden řádek kódu = i tisíce hradel obvykle nepracujeme s hodinami, neužíváme stavové automaty, volně nakládáme s pamětí. lze odladit správnou funkci algoritmů obvykle C++, Matlab, SystemVerilog nebo VHDL logické úrovně modelovány jako true/false/1/0, časté použití složitých datových typů
RTL úroveň, příklad 4 bity a b c d a_in b_in c_in d_in 5 bitu a_b c_d 6 bitu e_in 6 bitu e clk res a : SIGNAL unsinged (3 DOWNTO 0);... add : PROCESS (clk, res) BEGIN IF (res= 1 ) THEN a_in <= 0; b_in <= 0; c_in <= 0; d_in <= 0; a_b <= 0; c_d <= 0; ELSIF (rising_edge(clk)) THEN a_in <= a; b_in <= b; c_in <= c; d_in <= d; a_b <= a+b; c_d <= c+d; e <= a_b+c_d; END IF; END PROCESS add; Jedno sčítání čtyř čísel ted zaplní celý slajd :-).
Register Transfer Level RTL úroveň sada registrů propojených pomocí kombinačních bloků modelujeme mikroarchitekturu navrhovaného systému simulace nerespektuje reálná zpoždění na jednotlivých prvcích logiky, ale velmi rychlá př. dělička implementována jako sekvenční obvod realizující dělení jeden řádek kódu = desítky-stovky hradel lze odladit implementaci mikroarchitektury systému; ověříme, zda je kód funkčně správně a obvod reaguje jak jsme si přáli, nejsme schopni ověřit korektnost interního časování (zpoždění na kombinačních prvcích, apod.). obvykle Verilog, SystemVerilog nebo VHDL logické úrovně modelovány jako 1,0; možnost použití složitějších typů
Hradlová úroveň Jednoduchý obvod, který realizuje y = x(0) OR x(1) OR x(2) OR x(3) zaplní hravě několik slajdů.
Hradlová úroveň netlist
Hradlová úroveň anotace zpoždění (SDF)
Hradlová úroveň back-annotated gate level simulation, timing simulation simulujeme finální podobu obvodu implementovaného ve zvolené technologii návrh je popsán ve formě schematu obvodu vyjádřeného ve zdrojovém kódu (netlist) a před simulací anotován informacemi o zpoždění na obvodových prvcích a spojích (back annotation). modelujeme reálná zpoždění na prvcích, detailní simulace př. dělička implementována jako sekvenční obvod realizující dělení několik řádků kódu = i jen jedno hradlo lze odladit detailní časování obvodu obvykle Verilog nebo VHDL
Tranzistorová úroveň
transistor level Tranzistorová úroveň schéma obvodu sestavené z elementárních obvodových prvků, tranzistorů (realizovaných příslušnými modely) a zdrojů simulátor pracuje s obvodovými veličinami (proud a napětí), řeší soustavy diferenciálních rovnic vyšší přesnost simulace, ale také významné zpomalení jejího běhu jsou potřeba analogové simulátory, obvykle SPICE a odvozené lze odladit např. chyby v rozhraních mezi analogovými a číslicovými bloky v systému a chování za číslicovou abstrakcí" logická nula/jednička celá škála analogových hodnot
Fyzická úroveň
Typická podoba návrhu tb_top clk_gen clk stop_clk reset_gen res vstupy DUT výstupy stimuli_gen = OK/FAIL DUT model
Typická podoba návrhu tb_top testbench top strukturní popis, integruje všechny bloky clk_gen behaviorální popis, generátor hodin reset_gen behaviorální popis, generátor resetu stimuli_gen behaviorální popis, generátor stimulů pro návrh, často generuje náhodné stimuly DUT Design Under Test verifikovaný návrh, na RTL/hradlové/tranzistorové úrovni DUT model model návrhu na behaviorální úrovni, prediktor, předvídá reakce DUT na stimuly komparátor srovnává reakce DUT a modelu
Jazyky HDL Hardware Description Language Jak si hrát doma Xilinx ISE WebPack (syntéza, rozmístění a propojení... a simulátor) ModelSim PE Student Edition vyplňování formulářů po pravdě :-)
Jazyk VHDL VHSIC Hardware Description Language (Very High Speed Integrated Circuit) U.S. Deparment of Defense: jazyk pro dokumentaci chování integrovaných obvodů alternativa k tlustým příručkám :-) std. IEEE 1076, první použitelný je IEEE1076-1993 základ je jazyk ADA, striktní typová kontrola později syntéza z RTL fa. Synopsys velmi košatý jazyk demonstrujeme na příkladech
Hello world! První výtvor entita a architektura, 1:N jméno souboru=jméno entity architektury:rtl, struct, behav ASSERT-REPORT- SEVERITY: NOTE, ERROR, WARNING, FAILURE
Odmocnina: technika líného muže PROCESS základní blok, WAIT CONSTANT/VARIABLE proměnné užitečné typy: natural, integer, boolean, real, time FOR LOOP END LOOP EXIT, NEXT, IF END IF atribut IMAGE
Odmocnina: technika bisekce WHILE LOOP END LOOP FPGA prakticky, kapitola 6 další techniky, ruční výpočet a VHDL kód reálného obvodu :-)
Generování průběhů blok s výstupem std_logic typ logický signál WAIT FOR nesyntetizovatelné
Sekvenční a paralelní prostředí
Sekvenční a paralelní prostředí paralelní prostředí BEGIN END ARCHITECTURE paralelně spouštěné činnosti hardware je z principu paralelní paralelismus je ovšem simulovaný sekvenční prostředí BEGIN END PROCESS sekvenční běh jako v Javě, C++, atd. delta-čas nekonečně rychlé vykonání citlivostní seznam sekvenční prostředí je vložené do paralelního prostředí sekvenční popis PROCESS se spouští, bud vždy, nebo podle citlivostního seznamu
Dekodér pro sedmisegm. displej první syntetizovatelný kód proces s citlivostním seznamem CASE WHEN WHEN OTHERS
Chování procesu VHDL kód 1 log: PROCESS (a,b,c) 2 BEGIN 3 d<= a AND b; 4 y<= d OR c; 5 END PROCESS log; b a c a1 a2 b g5 andor1d1 zn y
Chování procesu VHDL kód 1 log: PROCESS (a t,b t,c t ) 2 BEGIN 3 d t+1 <= a t AND b t ; 4 y t+1 <= d t OR c t ; 5 END PROCESS log; b a c a1 a2 b g5 andor1d1 zn y
Chování procesu VHDL kód 1 log: PROCESS (a t,b t,c t,d t ) 2 BEGIN 3 d t+1 <= a t AND b t ; 4 y t+1 <= d t OR c t ; 5 END PROCESS log; b a c a1 a2 b g5 andor1d1 zn y
Chování procesu Proměnná vs signál? log: PROCESS (a,b,c) VARIABLE d: std_logic; BEGIN d := a AND b; y <= d OR c; END PROCESS log; b a c a1 a2 b g5 andor1d1 zn y
Událostmi řízená simulace event-driven simulation rychlá, simulátor počítá jen to, co se mění jádro simulátoru je tzv. fronta událostí událost = (uzel, čas kdy se má měnit, hodnota na kterou se má měnit)
Událostmi řízená simulace zjednodušený simulační algoritmus 1 elaborace návrhu: kompletace hierarchie, expanze generických konstrukcí, kontrola 2 start simulace: uzlům v obvodu přiřazeny a dopočteny počáteční stavy, naplánovány události 3 t c = t n 4 Každý aktivní signál v modelu je aktualizován; každý proces, který má ve svém citlivostním seznamu signál na kterém se vyskytla událost, je vykonán. Vzniknou další události a jsou vloženy do fronty událostí. 5 Čas příštího simulačního cyklu t n se nastaví na nejbližší z TIME HIGH kdy je další budič ve frontě událostí je aktivní čas ve kterém se probudí nějaký proces v návrhu (uspaný např. pomocí příkazu WAIT). Pokud t n = t c, pak je další simulační cyklus tzv. delta cyklus. 6 Simulátor pokračuje krokem 4.
Implikace pro praxi Doba běhu simulátoru roste s velikostí návrhu, s počtem hodinových cyklů, které synchronní číslicový obvod zpracovává a s počtem událostí, které jsou modelovány. Simulace se zpomaluje směrem k nižším úrovním abstrakce, kde je třeba modelovat více prvků detailněji. Simulace je ukončena, když je fronta událostí prázdná. Simulaci lze ukončit například pomocí příkazu jazyka VHDL ASSERT (false) REPORT konec simulace SEVERITY FAILURE; Snažší je přestat generovat hodiny pro obvod a přestat stimulovat jeho vstupy. Události lze ukládat a zkoumat zpětně (pomocí wave file).
Několik nudných poznámek komentáře zapisujeme za zápisy čísel: 112, 11e5 v jiných číselných soustavách: 2#1010#, 2#1000_0010#, 16#97#, 16#2A#E4 řetězec "mrkev", znak c
Dotazy?
Kombinační obvody změny na vstupu se prošíří na výstup jen se zpožděním logických členů žádný vnitřní stav obvodu
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Rozhraní bloku x INVERTOR y
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Implementace bloku x INVERTOR Architektury: rtl, behav, struct, gate y
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Simulace logických úrovní extrémy: dvoustavová logika vs. analogové kontinuum 9-ti stavová logika 10XHLUZW- aproximace reálného analogového světa std_logic std_logic_vector
Příklad AND v 9 stavové logice x y z x/y 0 1 0 0 0 1 0 1
Příklad AND v 9 stavové logice x/y U X 0 1 Z W L H U U U 0 U U U 0 U U X U X 0 X X X 0 X X 0 0 0 0 0 0 0 0 0 0 1 U X 0 1 X X 0 1 X Z U X 0 X X X 0 X X W U X 0 X X X 0 X X L 0 0 0 0 0 0 0 0 0 H U X 0 1 X X 0 1 X U X 0 X X X 0 X X
std_logic Rezoluční funkce Simulace zkratu jeden signál buzený z více míst modelování reálného chování funkce v knihovně definuje výsledek praktické pro 3-stavové sběrnice, atd. více procesů paralelně!
Parametrizace bloků a opětovné použití Moorův zákon návrhy obvodů se stále víc a víc komplikují ačkoliv velikost návrhu roste exponenciálně, čas na návrh se spíše zkracuje a tak je třeba zvyšovat produktivitu práce vyšší produktivity se dá dosáhnout pomocí opětovného použití částí návrhu příklad mohou být čítač/časovač: šířka čítače, jak dlouho má běžet pamět ové bloky (ROM, RAM, registrová pole) velikost paměti, obsah pro ROM komunikační bloky (SPI, I2C) adresa slav standardizace rozhraní standardizace formátů podpora pro opětovné použití v HDL jazycích
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Rozhraní bloku n x(0) AND x(1) x(n 1) y
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Implementace bloku n x(0) AND x(1) x(n 1) y
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Sekvenční prostředí 1 sekvenční výpočet 2 delta-čas 3 nekonečně rychlé vykonání 4 citlivostní seznam
Strukturní popis Strukturní popis jednotlivé bloky potřebujeme propojit dohromady porty propojit na signály, nakonfigurovat generické parametry ruční kód nejvyšší úroveň bloku v procesu návrhu netlist
Invertor budeme ho potřebovat 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Rozhraní bloku x INVERTOR y
Invertor budeme ho potřebovat 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Implementace bloku x INVERTOR Architektury: rtl, behav, struct, gate y
NOR instance bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 COMPONENT invertor IS 17 PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 x => or_result, 29 y => y 30 ); 31 32 END ARCHITECTURE rtl; Rozhraní bloku nor_gate a b or_result INVERTOR x y y
NOR instance bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 COMPONENT invertor IS 17 PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 x => or_result, 29 y => y 30 ); 31 32 END ARCHITECTURE rtl; Komponenty nor_gate a b or_result INVERTOR x y y
NOR instance bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 COMPONENT invertor IS 17 PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 x => or_result, 29 y => y 30 ); 31 32 END ARCHITECTURE rtl; Implementace bloku nor_gate a INVERTOR b or_result x y y
NOR instance bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 COMPONENT invertor IS 17 PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 x => or_result, 29 y => y 30 ); 31 32 END ARCHITECTURE rtl; Paralelní prostředí a b simulace HW paralelismus! event-driven sim. nor_gate INVERTOR or_result x y y
Dotazy?
Návrh sčítačky v hradlech a b 1 2 Σ s a a cy b b cy_in s a s 1 2 Σ 1 cy b 2 Σ cy s cy_out
Syntetizovatelné aritmetické obvody HDL jazyky jsou tu kvůli produktivitě booleovskou algebru budete v životě potřebovat v řadě situací, ale... v HDL jazyce se ale pro aritmetické operátory nepoužívá př.: sčítačku vyrobíte pomocí operátoru + produktivita práce jeden řádek kódu řádově desítky hradel syntetizovatelné jsou aritmetické operátory +, -, * syntetizovatelné jsou relační operátory operátory <, >, = a jejich kombinace... a ještě pár dalších co nás ted tolik nezajímá
Datové typy a sčítání Základní kouzlo: LIBRARY IEEE; USE IEEE.numeric_std.ALL; SIGNAL a : unsigned (7 DOWNTO 0); SIGNAL b : unsigned (7 DOWNTO 0); SIGNAL c : unsigned (8 DOWNTO 0); Datové typy signed, unsigned sběrnice o daném počtu bitů pozor na rozšíření výsledku c <= 0 &a + 0 &b;
Násobení SIGNAL a: unsigned (7 DOWNTO 0); SIGNAL b: unsigned (7 DOWNTO 0); SIGNAL c: unsigned (15 DOWNTO 0); Násobení paralelní násobička podle typu vstupů se použije správná struktura více v knize FPGA prakticky, kapitola 6 c <= a * b;
Složitější obvod minimum a maximum komparace_cisel x>y min_sel x y 0 1 min_xy 1 0 max_xy
Dotazy?
Sekvenční obvody výstup obvodu závisí na vstupu a vnitřním stavu
P Jednoduchý registr res d D Q q clk
Čítač
ROM pamět
Dotazy?
Děkuji za pozornost!
Konverzní funkce v návrhu vše typu std_logic, std_logic_vector aritmetické operátory ale pracují s typy signed a unsigned jak to převést? SIGNAL a: std_logic_vector (7 DOWNTO 0); SIGNAL b: std_logic_vector (7 DOWNTO 0); SIGNAL c: std_logic_vector (7 DOWNTO 0); c <= std_logic_vector (unsigned(a) + unsigned(b));
Jednoduchý registr s write enable res q 0 D Q 1 q clk ce
Registr se sync. setem a resetem ares d 0 10, 11 01 1 00 D Q q clk res set bit 1 bit 0
Posuvný registr konfigurovatelná šířka vnitřní registr o N bitech operace skládání vektoru
Stavový automat 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY automat IS 5 PORT ( 6 clk : IN std_logic; 7 res : IN std_logic; 8 9 sc : OUT std_logic; 10 rdy : IN std_logic; 11 12 we1 : OUT std_logic; 13 we2 : OUT std_logic 14 ); 15 END ENTITY automat; 16 17 ARCHITECTURE rtl OF automat IS 18 19 TYPE t_state IS (gen_sc, rdy_wait, we1_gen, we2_gen); 20 SIGNAL current_s : t_state; 21 SIGNAL next_s : t_state; 22 23 24 BEGIN Příklad stavového automatu vlastní automat je realizován pomocí tří procesů registr na současný stav proces pro generování příštího stavu proces pro generování výstupů automatu
state_reg : PROCESS (clk, res) BEGIN IF res= 1 THEN current_s <= gen_sc; ELSIF clk EVENT AND clk= 1 THEN current_s <= next_s; END IF; END PROCESS state_reg; Stavový automat 2
next state next_state_gen : PROCESS (current_s, rdy_sc2) BEGIN CASE current_s IS WHEN gen_sc => next_s <= rdy_wait; WHEN rdy_wait => IF rdy_sc2= 1 THEN next_s <= we1_gen; ELSE next_s <= rdy_wait; END IF; WHEN we1_gen => next_s <= we2_gen; WHEN we2_gen => next_s <= gen_sc; WHEN OTHERS => next_s <= gen_sc; END CASE; END PROCESS next_state_gen; Stavový automat 3
1 output signals 2 outputs : PROCESS (current_s) 3 BEGIN 4 CASE current_s IS 5 WHEN gen_sc => 6 we1 <= 0 ; 7 we2 <= 0 ; 8 sc <= 1 ; 9 WHEN rdy_wait => 10 we1 <= 0 ; 11 we2 <= 0 ; 12 sc <= 0 ; 13 WHEN we1_gen => 14 we1 <= 1 ; 15 we2 <= 0 ; 16 sc <= 0 ; 17 WHEN we2_gen => 18 we1 <= 0 ; 19 we2 <= 1 ; 20 sc <= 0 ; 21 WHEN OTHERS => 22 we1 <= 0 ; 23 we2 <= 0 ; 24 sc <= 0 ; 25 END CASE; 26 END PROCESS outputs; 27 28 END ARCHITECTURE rtl; Stavový automat 4