<?php echo _title;?> www.prochazka.zde.cz
www.ccsinfo.com/CEH
Server si právě čte 197 lidí, dnes je čtvrtek, 13. Březen 2025   
Kategorie: Knihovnička, Xilinx, VHDL

Popis jazyka VHDL část 1 - Malý VHDL Manuál

Stručný popis jazyka VHDL...

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.

VHDL code
entity latch is
  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.

VHDL code
architecture dataflow of latch is
 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ů.

VHDL code
entity latch is
   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.

VHDL code
entity latch is
   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.

VHDL code
   q<= r nor nq after 1ns;
-- 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.

VHDL code
   q <= transport r nor nq after 1ns;
-- 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.

VHDL code
entity demux is
   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).

VHDL code
d<= "1100";
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).

VHDL code
signal a: bit_vector (1 to 4);
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.

VHDL code
compute_xor: process (b,c)
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ě.

VHDL code
a:=b;

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.

VHDL code
a <= b;

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!

VHDL code
count: process (x)
   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.

VHDL code
count: process (x)
   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.

VHDL code
if x = '1' and y = '1' then
 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.

VHDL code
Signal Kod_Operace : Bit_Vector(1 downto 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.

VHDL code
signal x : bit_vector (7 downto 0);
...
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!

VHDL code
...
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ě.

VHDL code
process (y)
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.

VHDL code
use std.textio.all;

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.

VHDL code
use std.textio.all;
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:

VHDL code
-- By HaCeSOFT
-- 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!

VHDL code
-- By HaCeSOFT
-- 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í:

VHDL code
 IF CLK='1' and CLK'event THEN

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.

print Formát pro tisk

Komentáře rss

Přidat komentář >

icon , zajimavy clanek odpovědět
avatar
http://chiptron.petus.cz/articles.php?article_id=44
, Pravopis odpovědět
avatar
Dobrý den,
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.
odpověděl(a)
avatar
Naprosto souhlasím, článek je moc pěkně a srozumitelně napsaný...až na ty pravopisné chyby. :)

Všechny informace jsou zahrnuty pod GPL licenci, pokud není explicitně uveden jiný typ licence.
Používání těchto stránek ke komerčním účelům lze jen se souhlasem autora.
Všechna práva vyhrazena (c) 1997 - 2025 hacesoft.
Jste návštevník číslo: 458333
Celkem zobrazeno stránek: 21100721
Přihlásit do administrace