Právě získané zkušenosti můžete zúročit ve vývojové desce PIC + XILINX s obvody PIC16F877A a XC9572XL nebo XC95144XL.
Úvod
VHDL může být použit pro dokumentaci, ověření a syntézu velkých digitálních projektů. Toto je jeden z klíčových rysů VHDL. VHDL můžete použít k popisování hardwaru třemi způsoby, od popisů struktury, přes definici datových proudů až po deklaraci chování součástky. Kompletní návrh modelu (součástky) bude mít několik částí vyjádřených různými způsoby. Jazyk schopný takových různorodých aplikací má mnoho klíčových slov (příkazů) a typický uživatel používá jen malou podmnožinu z rozmanité palety příkazů. To znamená, že je často více způsobů, jak napsat požadovaný model ve VHDL. Složité softwarové nástroje, které kompilují a simulují VHDL modely, budou pracovat s celým jazykem, jak je definován v oficiální Referenční Příručce (LRM). Existují speciální nástroje, vyžadující určitou metodiku návrhu pro automatickou přeměnu diagramu, pravdivostní tabulky, schéma zapojení atd., na popis struktury součástky. Implementované nástroje, které jsou zaměřeny na konkrétní druh hardwaru, např. PLD, nemusí obsahovat některé příkazy, vyskytující se ve VHDL jazyku.
Strukturální Popis
První Kroky
Přehledný návrh je typicky rozdělený do několika bloků. Tyto bloky jsou pak připojeny dohromady a tvoří kompletní návrh. VHDL model může být kompletně popsán v jediném bloku, nebo rozložen do několika menších celků. Každý blok ve VHDL je reprezentován příkazem ENTITY. Blok popisuje rozhraní vstupních a výstupních signálů. Hlavní kód kompletního programu může obsahovat mnoho bloků, které jsou jednotlivě mezi sebou různě propojeny.
Následující příklad ukazuje deklaraci bloku.
port (s,r: in bit;
q,nq: out bit);
end latch;
Na prvním řádku je definice nové ENTITY, její jméno je LATCH. Jedná se o párový příkaz, takže její ukončení se provede pomocí příkazu END LATCH. Následuje definice rozhraní se jménem PORT, který obsahuje seznam IN/OUT signálu. Každá deklarace rozhraní definuje jeden nebo více signálu, které jsou vstupný nebo výstupný. Tyto signály reprezentují propojovací bity jednotlivých částí bloků. Každá deklarace rozhraní obsahuje jmenný seznam, režim a typ. V prvním rozhraní deklarace našeho příkladu, jsou dva vstupní signály (S a R), nesledován popisem režimu a druhu signálů. Režim specifikuje, zda bit je vstupní (IN), výstupní (OUT), obojetný (INOUT) nebo registrový výstup (BUFFER). Typ specifikuje, jaký druh hodnoty signál může nabývat. Signály S a R jsou vstupní (IN) a typu binární. Další signály Q a NQ jsou definovaní jako výstupní (OUT) a typu binární. Středník se používá pro ukončení řádku, příkazu, pokud je rozepsán na několik řádků. Užívání středníku je stejné jako v Jazyku C. Každý signál stejného režimu jsou na konci ukončeny středníkem až na poslední definici, za kterou následuje ukončovací závorka. Jen na doplnění: případné proměnné ve VHDL se definují uvnitř procesu, procedury nebo funkce.
Všechny signály v příkladu jsou definované jako binární typ. Binární typ může nabývat jen dvě hodnoty reprezentované jako ' 0' a ' 1'. Toto je nejjednodušší realizace hodnoty, kterou lze použít. Jazyk VHDL používá širokou paletu datových typů jako STD_LOGIC, VL_BIT a mnoho dalších.
Tento opravdu letmý popis jazyka VHDL nemá žádné ambice dokonale popsat všechny rozmanitosti tohoto jazyka. Pro hlubší studium doporučuji se podívat na internetu. Na českém internetu toho moc v češtině nenajdete, zato a zahraničních Webů v anglickém jazyce toho bude spousta, včetně ohromného množství příkladu. Pokud se s angličtinou moc nekamarádíte, tak se podívejte do nakladatelství BEN.CZ kde vyšla v roce 2006 kniha Číslicové systémy a jazyk VHDL od autorů: Jiří Pinker a Martin Poupa.
Takže už máme definovaný blok kde je seznam použitých signálů, včetně jejích typů. Pomocí klíčového slova ARCHITECTURE se popisují algoritmy, výkonné časti definovaného bloku.
begin
q<= r nor nq;
nq<= s nor q;
end dataflow;
Na prvním řádku příkazu ARCHITECTURE je název algoritmu. Nejsou žádná pravidla jak psát názvy bloku, algoritmu atd., jediná podmínka je, aby neobsahovali mezery a nezačínaly číslicí, také doporučuji se vyhnout různým symbolům a diakritiky.
Za klíčovým slovem OF je název bloku. Takto jednoduše se propojí definice bloku s definicí algoritmu. Příkaz ARCHITECTURE je třeba ukončit pomocí slova END s názvem algoritmu. Samotný algoritmus se potom zapisuje mezi příkazy BEGIN a END.
Propojení Bloků
Pravě jsme si definovali základní stavební kameny našeho návrhu, který používá příkazy ENTITY a ARCHITECTURE. V dalším příkladu je spojíme dohromady a vytvoříme podobný návrh, na základě předchozích dvou příkladů.
port (s,r: in bit;
q,nq: out bit);
end latch;
architecture structure of latch is
component nor_gate -- definice nor_gate
port (a,b: in bit;
c: out bit); -- poznámka: pořadí pinu:- IN, IN, OUT.
end component;
begin -- napodobení NETLISTu.
n1: nor_gate
port map (r,nq,q); -- Používané součásti mapujeme na PINy
n2: nor_gate -- k signálům návrhu
port map (s,q,nq);
end structure;
Když srovnáte předchozí dva příklady, tak zjistíte, že až po pátý řádek je tento třetí složitější příklad stejný. S tím rozdílem že název algoritmu je odlišný. Ale to nehraje žádnou roly.
V tomto příkladu je definice komponenty, která se provádí pomoci příkazu COMPONENT. V jazyce VHDL lze jednotlivé entity (bloky) použít jako komponenty v dalších entitách a tak vytvářet hierarchické struktury. Komponentu lze použít pomocí příkazu PORT MAP.
Rozdíl mezi příkazy ENTITY a COMPONENT je že ENTITY popisuje rozhraní vašeho návrhu, kdežto COMPONENT popisuje rozhraní entity. V tomto příkladu COMPONENT nor_gate má dva vstupy A, B a výstup C. První řádek za klíčovým slovem BEGIN, v tomto případě jedenáctý řádek, sděluje jméno součásti N1 a říká, že patří Komponentě NOR_GATE. Dvanáctý řádek, popisuje jak NOR_GATE je propojena se zbytkem návrhu. Příkaz PORT MAP propojí deklaraci NOR_GATE a bloku LATCH ve stejném pořadí. Rozhraní je specifikované v pořadí A, B a pak C, tak tento příkaz spojí R s A, NQ s B a Q s C. Druhá deklarace pojmenovaná N2 se propojí S a A, Q s B, a NQ s C se stejnou deklaraci NOR_GATE.
Strukturální popis návrhu je prostý textový popis elektrického schémata zapojení obvodu. Seznam komponentu a jejich spojení je obvykle napodobení NETLISTu.
Popisy Datového Toku - Dataflow Architektura (Datové Toky)
Datové proudy popisují cestu informaci přes VHDL model.
port (s,r : in bit;
q,nq : out bit);
end latch;
architecture dataflow of latch is
begin
q<= r nor nq;
nq<= s nor q;
end dataflow;
Dále se budeme zabývat jen tím, co je pro vás nové. V bloku entity jsou definovány čtyři signály S, R, Q a NQ.
Na řádku sedm, vpravo od operátorů <= je výstupní proměnná a na levé straně je popis co se má provést.
Nezapomeňte, že na konci musí být středník. V tomto konkrétním příkladu se provede mezi vstupními proměnnými
R a NQ funkce NOR (negovaný logický součet). A výsledek je bezprostředně uložen proměnné Q. To samé se stane
na následujícím řádku.
Pouze upozorním že NQ a Q jsou definovány jako výstupní ale můžeme se k těmto signálům chovat
jako by byly definovány jako vstupní. Podívejte se ještě jednou na definici komponenty, konkrétně na signály Q a NQ.
Zpožďovací Modely
Klíčové slovo AFTER způsobí syntetické zpoždění, doba a jednotka času je uvedena za tímto příkazem. DATA na vstup přicházejí v čase T < 0ns. Na výstupu se objeví v čase T < 1ns. Všechny zpožďovací funkce jsou syntetické příkazy, to znamená, že se vám nikdy nepodaří je implementovat do fyzické součástky.
-- kratší impulsy než 1ns budou odstraněny.
nq<= s nor q after 1ns;
Pokud se na vstupu objeví kratší signál než je definované zpoždění příkazem AFTER na výstupu se nic nestane! Nejčastěji se tento příkaz používá na odstranění parazitních signálů. Občas je potřeba přenést všechny změny v požadovaném zpoždění. V takovém případe, použijeme příkaz TRANSPORT s kombinací příkazu AFTER. V tomto případe VHDL model zajistí zpoždění a přepravu všech vstupních impulsu, i ty co jsou kratší než definované zpoždění příkazem AFTER.
-- všechny impulsy budou přepraveny se zpožděním 1ns.
nq <= transport s nor q after 1ns;
Jiné Typy
Doposud jsme pracovaly jen jednotlivýma bity. Často se používá skupina signálů. Má to tu výhodu že při návrhu modelu se pracuje, se skupinou bitu naraz. V takovém případe použijeme klíčové slovo BIT_VECTOR, který se použije při definování druhu signálu. V závorce za ním následuje specifikace velikosti sběrnice. Začíná se vždy od nuly. Takže například (3 downto 0) znamená že sběrnice je široká čtyři bity.
Následující příklad demonstruje jak typ BIT_VECTOR definuje demultiplexr 1 ze 4.
Vstupní proměnná E má čtyři bity. Na ní přivedeme data a pomocí dvou bitu proměnné S, vybíráme, který bit z proměnné E se propojí s výstupní proměnnou D, která má také čtyři bity. Např. Na bitech S, je binární hodnota 00, tak je propojen bit 0 vstupní proměnné E s bitem 0 výstupní
proměnné D. Na bitech S, je binární hodnota 11, a je propojen bit 3 vstupní proměnné E s bitem 3 výstupní proměnné D.
port (e: in bit_vector (3 downto 0); -- Vstupní signály
s: in bit_vector (1 downto 0); -- Selektor
d: out bit_vector (3 downto 0)); -- Čtyři výstupní signály
end demux;
architecture rtl of demux is
signal t : bit_vector(3 downto 0); -- vnitřní proměnné
begin
t(3)<= s(1) and s(0); -- decoder 1 ze 4
t(2)<= s(1) and not s(0);
t(1)<= not s(1) and s(0);
t(0)<= not s(1) and not s(0);
d<= e and t;
-- Provede logický součin mezi E a pomocnou proměnnou T
end rtl;
Když za proměnnou definovanou jako sběrnice je v závorce uvedeno číslo, tak
to znamená, že pracujeme s jedním bitem a to ještě s tím, jehož číslo je v závorce. Např. T(3),
pracujeme s proměnnou T s bitem 3. Ale pokud udáme jako proměnnou T, tak pracujeme se všemi bity
naráz. Pokud byste zapsali funkci např. takto D<= E AND S, překladač ohlásí chybu. Protože nelze
pracovat s proměnnýma které mají jiný počet bitu. V našem uvedeném příkladu D mé čtyři, E má
čtyři a S má dva.
Ještě si musíme vysvětlit jak se propojuje sběrnicovou proměnná s druhou
sběrnicovou proměnnou. Vždy bit číslo 0 první proměnné s bitem číslo 0 druhé proměnné, atd.
Nijak jinak!
Ted je vám jasný že D <= E AND S je nesmysl.
Logické Funkce
Následující logické funkce NOT, AND, OR, NAND, NOR, a XOR můžeme použít na propojení bitu s bitem nebo skupinou bitu se skupinou bitu (BIT_VECTOR). Když použijeme logickou funkci na propojení bitu s bitem, jejich význam je obvyklý. Pokud použijeme skupinu bitu se
skupinou bitu (BIT_VECTOR) za předpokladu že musí mít stejné množství bitu. Nelze aplikovat např.
funkci AND na spojení "00110011" s "1111"! Propojení je vykonáno po jednotlivých bitech.
Velmi často se bude hodit přiřazení konstanty k proměnné. První řádek ukazuje binární zápis a
druhý hexadecimální zápis (odlišeno předponou X).
d<= X"C"; -- má stejný účinek jako řadek nahoře!
Standardní operátoři jsou dostupné pro celá čísla (+, -, * a / ). Ačkoli tyto operace nejsou použitelné pro BIT_VECTOR, vyskytují se často v knihovnách. Jsou použity s BIT_VECTOR tak, že je interpretují jako binární reprezentaci celých čísel, které můžou být sečteny, odečtený, znásobený, nebo vyděleny.
Následující znaky jsou normální příbuzní operátoři, kteří jsou
=, /=,<, <= , > a >= a jejich významy je obvyklí. Např. /= je nerovnat se. Výsledek z všech
těchto operátoru je booleovská hodnota TRUE nebo FALSE. Argumenty = a /= mohou být jakéhokoliv
typu. Argumenty <, <= , > a >= mohou být jako celé číslo, skutečné číslo a fyzický typ (integer,
real, physical types) nebo BIT_VECTOR. Jestliže proměnné jsou typu BIT_VECTOR pak musí být
stejná délka bitu (sběrnice) na obou stranách rovnice a výsledek je TRUE jen když vztah je
pravdivý pro každý korespondenční prvek sběrnicových argumentů.
Operátor < je vestavěný VHDL operátor, který vykonává zřetězení BIT_VECTOR.
V následujícím přikladu, se do proměnné B (8 bitu) uloží hodnota, která je složena z proměnné A
(4 bity) a konstanty.Proměnná A se uloží do pravé poloviny a na levou polovinu se připojí konstanta "0000" (4 bity).
signal b: bit_vector (1 to 8);
b<= "0000" < a;
Popis Chování Součástky
Popis chování součástky, nebo-li krabicový přístup přesně popisuje, co se stane na vstupech a následně na výstupech ale jak to pracuje uvnitř to je vedlejší. Tohle je dobré pokud navrhujete např. mikroprocesor. Přesně znáte jak se chová ale jak přesně pracuje uvnitř to už není důležité.
První příklad je velice jednoduchý. Compute_xor je název procesu. Proces se definuje klíčovým slovem PROCESS, následován použitýma proměnné událostí, tzv. citlivostní seznam. Proces se provede jen tehdy, když se stane událost na signálech, které jsou uvedeny v citlivostním seznamu, bez ohledu na tom zda událost nastala v našem případě na proměnné první nebo druhé. V případě že citlivostní seznam procesu obsahuje jen jeden parametr, obvykle CLK (hodinový impulzy) proces se provede vždy, když je vyraz vyhodnocen jako TRUE. Proces je vykonán od začátku do konce, na konci je proces ukončen. Když opět událost v citlivostním seznamu nastane proces je obnoven a vykonán od začátku do konce. Každý proces je spuštěn jednou během začátku simulace, aby se nastavili počáteční hodnoty.
begin
a<= b xor c;
end process;
Tento výraz přiřadí proměnnou B k A, hodnota je kopírována okamžitě.
Proměnné jsou v procesu nebo podprogramu lokální a jejich přidělování má okamžitý účinek, tj. přidělení se uskuteční ihned. Proměnná drží svou přidělenou hodnotu až do dalšího přidělení.
Následující řádek přiřadí signál B k A, hodnota je kopírována na konci procesu.
Signály v procesu nebo podprogramu jsou globální a jejich přidělování má účinek na konci procesu. Jestliže je k danému signálu v jednom procesu přiděleno několik hodnot, pouze poslední přidělení je úspěšné. Pokud při běhu procesu se provede čtení hodnoty signálu, je jedno zda se čtení provádí uvnitř nebo vně procesu, hodnota signálu je poslední přiřazena hodnota. Na tohle myslete když budete vyvářet složitější návrhy, aby nedocházelo k hazardním stavům. Signály jsou jediné prostředky komunikace mezi procesy.
Následující demonstrační program funguje takto. Pokud nastane událost na signálu X, který je uveden citlivostním seznamu, přičte se do proměnné CNT hodnota 1 a výsledek se opět uloží do proměnné CNT. Hodnota CNT se bude pokaždé zvyšovat při každém spuštění procesu. Na druhém řádku je definovaná nepovinná část, která specifikuje počáteční hodnotu proměnné CNT, než začne simulace. Protože každý proces je jednou spuštěn před simulací, z toho důvodu je hodnota inicializována na -1 (všechny bity mají hodnotu 1) a provede se celí proces od začátku do konce, potom hodnota v CNT bude 0!
variable cnt : integer := -1;
begin
cnt:=cnt+1;
end process;
Podmínky
Pokud už jste už někdy něco programovaly, tak příkaz IF funguje úplně stejně jako v ostatních programovacích jazykách. Řádek s direktivou IF se dá interpretovat následovně:
Když (IF), nějaký výraz, tak (THEN), udělej.
Příkaz END IF ukončuje podmínku.
V tomto příkladu je docela složitý výraz. Podmínka bude naplněna když hodnota X bude jen rostoucí
(změna z 0 na 1), obvod reaguje na vzestupnou hranu.
variable cnt : integer :=0 ;
begin
if (x='1' and x'last_value='0') then
cnt:=cnt+1;
end if;
end process;
Následující příklad se dá přečíst takto: pokud X a Y vstupní proměnné budou mít hodnotu 1 tak výstupní proměnná Z bude také 1, jinak (příkaz ELSE) Z bude 0.
z:='1';
else z:='0';
end if;
Další příklad použití větvení programu: příkaz ELSIF se používá na upřednostňování signálů.
Když KOD_OPERACE bit 1 = 1 tak HODNOTA_1 a 2 se sečtou a výsledek je uložen v proměnné VYSLEDEK.
Pokud KOD_OPERACE bit 0 = 1 tak HODNOTA_1 a 2 se odečtou a výsledek je uložen v proměnné VYSLEDEK.
Pokud ani jeden z bitu proměnné KOD_OPERACE není 1 tak proměnná VYSLEDEK je 0.
if Kod_Operace(1) = '1' then
Vysledek := Hodnota_1 + Hodnota_2;
elsif Kod_Operace(0) = '1'
then Vysledek := Hodnota_1 - Hodnota_2;
else Vysledek := "00000000";
end if;
V dalším příkladu je smyčka (cyklus), který se definuje direktivou FOR. Okamžitě následuje proměnná, v našem případě se jedna o proměnnou I. To je následováno direktivou IN a dále jak dlouho opakovat, v našem příkladu to je 8x, a to od 7 do 0. Tu samou hodnotu bude obsahovat i proměnná I (od 7 do 0). Za LOOP následuje samotná funkce. I příkaz FOR má svůj párový příkaz END LOOP. Všimněte si nulování proměnné P vždy před začátkem cyklu, definovaným příkazem FOR. Následující příklad počítá sudou paritu proměnné X.
...
process (x)
variable p : bit;
begin
p:='0'
for i in 7 downto 0 loop
p:=p xor x(i);
end loop;
end process;
Signály a Procesy
Tato část je sice krátká ale obsahuje důležitou informaci o použití signálů
v procesovém sdělení.
Pamatujte si jestliže proces je obnoven, tak se vykonává od začátku do konce a další události
muže zpracovat až poté co předchozí proces je kompletní. Proto opatrně, pokud používáte víc než
jeden signál v procesu!
signal x,y,z : bit;
...
process (y) -- Proces se spustí na základě změny Y.
begin
x<= y; -- Signálová změna, co má nastat při aktivaci procesu.
z<= not x;
end process;
-- obvykle je lepší přidat explicitní 1ns zpoždění na všechny signály.
Tady bych poukázal na to že proměnné X a Y operují rozdílně.
variable x,z : bit;
begin
x:=y; -- Y se překopíruje okamžitě do X
z:=not x; -- Z bude vždy opačný než X
end process;
Výstup Programu
Poznámka: v programu WebPack do verze 3.2WP3.x (zatím není k dispozice vyšší verze) výstup programu nefunguje. Chyba nebí v programu ale chybí patřičné knihovny!
V různých programovacích jazycích existuje mechanismus pro tisk textu na monitoru a dostávají vstupní informace od uživatele přes klávesnici, to je sice hezký při simulaci, ale VHDL tohle neumí. Tohle je přístupné přes knihovnu, která je součástí každého VHDL systému. Aby návrh používal knihovnu pro vstup a výstup musíte použít následující direktivu.
Umístit ji okamžitě před každou architekturou, která používá vstup a výstup. Název knihovny je TEXTIO. Pro vstupní a výstupní text se použije typová proměnná, LINE. Procedura nejprve formuje text do typové proměnné LINE a pak poslat proměnnou LINE na výstup. Toto je ukázané v následujícím příkladu.
Poznámka: ačkoli není součást jazyka tato knihovna je standardní a bude stejná bez ohledu na VHDL nástroje které používáte.
architecture behavior of check is
begin
process (x)
variable s : line;
variable cnt : integer:=0;
begin
if (x='1' and x'last_value='0') then
cnt:=cnt+1;
if (cnt > MAX_COUNT) then
write(s,"Pocet preteceni - ");
write(s,cnt);
writeline(output,s); -- Tisk textu a proměnné CNT
end if;
end if;
end process;
end behavior;
Jestliže MAX_COUNT konstanta je menší než proměnná CNT, tak se na obrazovce objeví nápis:
Počet přetečeni - a skutečná hodnota proměnné CNT.
Příklady
Na závěr dva kompletní funkční příklady:
-- Scitac
-- 6.2.2001 ve 17:36
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity scitac IS
port (clk: in std_logic;
data: inout std_logic_vector(7 downto 0));
end scitac;
architecture scitac1 of scitac is
begin
process (clk)
variable temp : std_logic_vector (7 downto 0);
begin
if (data="11111111")then temp:=data; end if;
temp:=temp+1;
if (temp>17) then temp:="00000000"; end if;
data <= temp AFTER 1 ns;
end process;
end scitac1;
Tento příklad má jeden vstup, který se jmenuje CLK. Na tento vstup přivádíme hodinový nebo jiný periodický nebo nějaký jiný signál u kterého chceme zjistit počet impulsu nebo je počítat. Výstup 8-mi bitová sběrnice, jmenuje se DATA. Na které je počet načítaných impulsu, které se ukázali na vstupu CLK. To je základní popis tohoto příkladu. Výpis obsahuje dvě podmínky, první testuje sběrnici DATA, jestli je na ní hodnota -1 (binárním kódu 11111111). Pokud budete tento příklad realizovat, musíte na sběrnici připojit 8x odpor proti kladnému napájecímu napětí. Bez těchto odporů se nebude moci sčítač inicializovat! To samé musíte učinit i při simulaci. Samozřejmě že nelze v simulátoru připojit odpory, to provedete tak, že na sběrnici DATA nastavíte hodnotu -1, potom provedete jeden hodinový impuls na vstupu CLK a následně zrušíte na datové sběrnici hodnotu -1. Tady se sluší podotknout, že skutečný počet přičtených impulsů je ve skutečnosti o jeden min. Sami si můžete upravit program, aby se kompenzoval tento nežádoucí jev. Inicializace se dá provést několika způsoby. Za prvé signálem RESET, další způsob inicializace je použit v tomto příkladu. Druhá podmínka je spíše na hraní než z praktického hlediska. Jedná se o testování proměnné TEMP. Až vnitřní proměnná TEMP má hodnotu, v našem případe 17, tak se vynuluje proměnná TEMP na hodnotu 0. Čili, až se načte 17 impulsu na vstupu CLK, tak se vynuluje proměnná TEMP a její hodnota se zkopíruje i na výstupní sběrnici DATA. Sběrnici DATA může nabývat hodnotu od 0 do 17. Podotýkám ještě jednou, že tato podmínka je tam jen na pokusy při ladění, simulaci!
-- Scitac
-- 11.2.2001 ve 9:11
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY scitac IS
PORT (CLK, RESET: IN std_logic;
CE, LOAD, DIR: IN std_logic;
data: INOUT std_logic_vector(3 DOWNTO 0);
dovnitr: IN std_logic_vector(3 DOWNTO 0));
END scitac;
ARCHITECTURE scitac1 OF scitac IS
BEGIN
process (CLK, RESET)
begin
if RESET='1' then
data <= "0000";
elsif CLK='1' and CLK'event then
if LOAD='1' then
data <= dovnitr;
else
if CE='1' then
if DIR='1' then
data <= data + 1;
else
data <= data - 1;
end if;
end if;
end if;
end if;
end process;
END scitac1;
Poslední příklad, používá pro inicializaci signál RESET. Hodinový signál se přivádí na vstup označený CLK.
Vstup CE je vybavení výstupních dat na výstupu. Data se na výstupu
objeví když signál CE má úroveň LOG. 1. Vstupní signál DIR určuje zda na výstupu data budou
vzestupní (DIR= LOG. 1) či sestupní (DIR= LOG. 0).
Vstupní signál LOAD, při úrovni LOG. 1 se zkopírují vstupní informace ze sběrnice DOVNITŘ na výstupní sběrnici DATA a při signálu CLK jsou
DATA přičítána (vzestupní) nebo odečítána (sestupní) od hodnoty která byla zkopírována ze sběrnice DOVNITŘ.
Ještě pár slov k následujícímu spojení:
Tento výraz bude pravdivý jen tehdy když nastane na signálu CLK událost (změna) na vyšší hodnotu. To znamená, když se mění hodinový signál z 0 na 1. Tímto můžeme zajistit, aby obvod reagoval na vzestupnou či sestupnou hranu. V tomto příkladu obvod bude reagovat na vzestupnou hranu.
Komentáře
excelentní článek, velmi srozumitelný a čtivý. Měl bych však jednu výtku a to pravopisné chyby ... Není jich moc, ale jsou tam.
Jinak opravdu výborná práce.