Zdroj: http://prochazka.clanweb.eu/index.php?a=knihovnicka/prikazy_vhdl  •  Vydáno: 12.1.2008 13:11  •  Autor: hacesoft

Příkazy jazyka VHDL

Popis příkazu jazyka VHDL v češtině s příkladem použití konkrétního klíčového slova.
Ty příkazy na které jde kliknout jsou už hotové(možná u některých přibude doplňující obrázek ), další budou postupně doplňovány podle časové možnosti. Odkazy "viz také" také nejsou hotové, tam bude postupně doplňován popis jazyka VHDL. Zkratka LRM je Language Reference Manual který naleznete: zde.

ABS ACCESS AFTER ALIAS ALL AND ARCHITECTURE ARRAY ASSERT ATTRIBUTE
BEGIN BLOCK BODY BUFFER BUS     
CASE COMPONENT CONFIGURATION CONSTANT      
DISCONNENT DOWNTO         
ELSE ELSIF END END BLOCK END CASE END COMPONENT     
END FOR END GENERATE END IF END LOOP END PROCESS END RECORD END UNITS ENTITY EXIT 
FILE FOR FUNCTION       
GENERATE GENERIC GENERICMAP GROUP GUARDED     
IF IMPURE IN INERTIAL INOUT IS    
LABEL LIBRARY LINKAGE LITERAL LOOP     
MAP MOD         
NAND NEW NEXT NOR NULL     
OF ON OPEN OR OTHERS OUT    
PACKAGE PACKAGEBODY PORT PORTMAP POSTPONED PROCEDURE PROCESS PURE  
RANGE RECORD REGISTER REJECT REM REPORT RETURN ROL ROR  
SELECT SEVERITY SIGNAL SLA SLL SRA SRL SUBTYPE  
THEN TO TRANSPORT TYPE      
UNAFFECTED UNITS UNTIL USE      
VARIABLE          
WAIT WHEN WHILE WITH      
XNOR XOR        

Klíčové slovo: ABS


   Klíčové slovo abs je absolutní hodnota, která se aplikuje na nějaký numerický výraz.

Příklad:
   A_OUT <= abs(A-B)

LRM: 7.2.

Viz také:

Klíčové slovo: ACCESS


   Klíčové slovo access deklaruje objekt ke kterému se přiřazují různé další objekty, skupiny hodnot nebo jednoduché proměnné. Deklarace zahrnuje vyhrazené slovo access, následován zástupným typem.

Příklad:
   type Adresa is access RAM;
   type Data is access RAM;
   type zapis is access RAM;
   type cteni is access RAM;

Vysvětlení:
   Do objektu RAM patři sběrnice: Adresa, Data, jednoduché signály zápis a čteni.

LRM: 3.3.

Viz také:

Klíčové slovo: AFTER


   Klíčové slovo after se používá pro přesně definované zpoždění v přiřazovacích výrazech. Přiřazovací výraz obsahující klíčové slovo after, je standartní, jen je na konci doplněn o nepovinné klíčové slovo transport, inertial nebo reject a příkaz after se specifikaci zpoždění a jednotkou času.
Výraz muže obsahovat ještě nepovinná klíčová slova:

  • transport: signál A_IN se přenese na A_OUT se zpožděným 1ns.
  • inertial: signál B_IN se přenese na A_OUT se zpožděním 1ns, a impulsy menší než 1ns se nepřenesou.
  • reject: signál B_IN se přenese na A_OUT se zpožděním 1ns, ale délku impulsu, který nebude přenesen se specifikuje nepovinným klíčovým slovem reject. V tomto případe se nepřenesou signály které jsou kratší než 500ps (0.5ns).
Příklady:
   Clk <= not Clk after 50 ns;
   A_OUT <= transport A_IN after 1 ns;
   B_OUT <= inertial B_IN after 1 ns;
   C_OUT <= reject 500 ps inertial C_IN after 1 ns;
   D_OUT <= transport '1' after 1 ns;

LRM: 8.4.

Viz také:

Klíčové slovo: ALIAS


   Klíčové slovo alias deklaruje alternativní jméno pro nějaký existující objekt: signál, proměnná, konstanta nebo soubor. Může také být použité pro "ne objekty" prakticky pro všechno, co bylo předtím deklarováno. Příkaz alias nedefinuje nový objekt. Je jen specifické jméno přiřazené k nějakému existujícímu objektu.

Poznámka: Klíčové slovo alias nemůže být použito pro vícerozměrná pole.

příklady:
   signal stavovy_registr : Bit_Vector(7 downto 0);
   alias Carry : std_logic is stavovy_registr(0 downto 0);
   alias Digit_Carry : std_logic is stavovy_registr(1 downto 1);
   alias Zero : std_logic is stavovy_registr(2 downto 2);
   alias Power_down : std_logic is stavovy_registr(3 downto 3);
   alias Time_out : std_logic is stavovy_registr(4 downto 4);
   alias PA : Bit_Vector(2 downto 0) is stavovy_registr(7 downto 5);
Toto je příklad definovaní aliasu stavového registru (SWR) mikrořadiče PIC16C5X.

LRM: 4.3.

Viz také:

Klíčové slovo: AND


   Klíčové slovo AND je operací logického součinu, který může být použitý ve výrazu. Výsledek logického součinu je 1 v případě, že je 1 v obou odpovídajících bitech. V ostatnívh případech je výsledek 0.

Přiklad:
-- V proměnné A je desítková hodnota 15. Ve dvojkové soustavě je to:                00001111
-- V proměnné B je desítková hodnota 170. Ve dvojkové soustavě je to:               10101010
-- Vysledek v A_OUT je potom v desítkové soustavě 10. A ve dvojkové soustavě je to: 00001010
   A_OUT <= A and B;

LRM: 7.2.

Viz také:

Klíčové slovo: ARCHITECTURE


   Klíčové slovo ARCHITECTURE definuje detaily příkazu ENTITY.

   Tělo příkazu ARCHITECTURE definuje vztahy mezi vstupními a výstupními prvky příkazu ENTITY. Tělo ARCHITECTURE je sestaveno z jednoduchých operací. Jako: inicializace proměnných, přesouvání hodnot, podmínky, cykli a další... Příkaz ARCHITECTURE lze použít pro vytvoření procesu, funkce a procedury. Může být spojena jen s jednou definicí příkazu ENTITY. Nicméně příkaz ENTITY může mít víc než jedno tělo ARCHITECTURE.

   Příkaz ARCHITECTURE se zapisuje v tomto pořadí:

1. vyhrazené slovo “ARCHITECTURE”, následováno
   a - jménem architektury,
   b - vyhrazené slovo OF,
   c - jméno entity a
   d - vyhrazené slovo IS,
2. část deklarací vnitřních prvků,
3. vyhrazené slovo BEGIN,
4. samotný kód programu,
5. vyhrazené slovo END, následován volitelně jménem architektury (bod 1a).

Příklad:
 architecture Název_architektury of Jméno_entity_ke_které_patří is
 begin
   --- Kód programu
 end Název_architektury;
Příklad 1:
entity dekoder_1_11 is
 port (puls : in std_logic;
   q_out : out std_logic_vector(10 downto 0));
end dekoder_1_11;

architecture dekoder_BCD of dekoder_1_11 is
signal scitac : std_logic_vector(3 downto 0);
begin
   process (puls)
      --variable scitac : std_logic_vector(3 downto 0);
   begin
      if puls = '1' and puls'event then
      scitac <= scitac + 1;
      if (scitac = 12) then
         scitac <= "0000";
      end if;

      case scitac is -- dekodér BCD kódu na 1 z 11.
         when "0000" => q_out <= "10000000000"; --0
         when "0001" => q_out <= "01000000000"; --1
         when "0010" => q_out <= "00100000000"; --2
         when "0011" => q_out <= "00010000000"; --3
         when "0100" => q_out <= "00001000000"; --4
         when "0101" => q_out <= "00000100000"; --5
         when "0110" => q_out <= "00000010000"; --6
         when "0111" => q_out <= "00000001000"; --7
         when "1000" => q_out <= "00000000100"; --8
         when "1001" => q_out <= "00000000010"; --9
         when "1010" => q_out <= "00000000001"; --10

         when others => NULL;
      end case;

   end if;
   end process;

end dekoder_BCD;

   Program ve VHDL z pohledu IO (integrovaného obvodu).

package

   Struktura programu ve VHDL. Zde je vidět jak je možné jednotlivé části (ENTITY) spojovat. Ulpně nejvyšší entita zapouzdřuje celý program do IO (viz obrázek nahoře).

entity_mapa

Historie:
Modrá okénka jsou příkazy VHDL.
Žlutá okénka jsou další možné rozšíření.
Zelené šipky jsou nepovinné neboli volitelné rozšíření programu.
Červené šipky jsou povinné příkazy vyplývající z hierarchie programu.
Šipky ukazuji možný tok dat.

LRM 1.2.

Viz také:

Klíčové slovo: DOWNTO


   Klíčové slovo downto je sestupná deklarace rozsahu. Nejprve se definuje horní mez, nesledován příkazem downto a nakonec se definuje dolní mez. U klíčového slova to je tomu přesně naopak!

Příklad:
   signal A0,A1: std_logic_vector(15 downto 0);

LRM 6.5.

Viz také:

Klíčové slovo: ELSE


   Klíčové slovo else je nepovinný parametr příkazu if. Dá se přeložit jako slovo „jinak“. To znamená, že pokud nebude splněna podmínka v příkazu if, tak se provede to co je za příkazem else.

Příklad:
   IF (výraz) THEN příkaz_1; -- středník je nutný
   ELSE příkaz_2; -- středník je nutný
   END IF; -- středník je nutný

-- Příklad jde krasně přepsat i do srozumitelné šestiny:
-- Když platí (výraz) tak udělej příkaz_1;
-- Jinak proveď příkaz_2;
-- Konec podmínky;

Viz také:

Klíčové slovo: ELSIF


   Klíčové slovo elsif je nepovinný parametr příkazu if. Je to složenina příkazu else a if. Dá se přeložit jako slovo „jinak, když platí“.

Příklad:
   IF (výraz) THEN příkaz_1; -- středník je nutný
   ELSIF (výraz) THEN příkaz_2; -- středník je nutný
   ELSE příkaz_3; -- středník je nutný
   END IF; -- středník je nutný

--Příklad jde krasně přepsat i do srozumitelné šestiny:
--Když platí (výraz_1) tak udělej příkaz_1;
--Jinak, když platí (výraz_2) tak udělej příkaz_2;
--Jinak proveď příkaz_3;
--Konec podmínky;

Viz také:

Klíčové slovo: END


   Klíčové slovo end specifikuje konec definice Architecture, Configuration, Entity, Package a Package body.

Viz také:

Klíčové slovo: END BLOCK


   Klíčové slovo end block je ukončení definice, která započala příkazem block.

Viz také:

Klíčové slovo: END CASE


   Klíčové slovo end case je ukončení definice přepínače, který započal příkazem case.

Viz také:

Klíčové slovo: END COMPONENT


   Klíčové slovo end component je ukončení definice komponentu, který započal příkazem component.

Viz také:

Klíčové slovo: END FOR


   Klíčové slovo end for je ukončení cyklu, který započal příkazem for.

Viz také:

Klíčové slovo: END GENERATE


   Klíčové slovo end generate je ukončení definice, který započal příkazem generate.

Viz také:

Klíčové slovo: END IF


   Klíčové slovo end if je ukončení definice podmínky, který započal příkazem if.

Viz také:

Klíčové slovo: END LOOP


   Klíčové slovo end loop je ukončení definice smyčky, který započal příkazem loop.

Viz také:

Klíčové slovo: END PROCESS


   Klíčové slovo end process je ukončení definice procesu, který započal příkazem process.

Viz také:

Klíčové slovo: END RECORD


   Klíčové slovo end record je ukončení definice, který započal příkazem record.

Viz také:

Klíčové slovo: END UNITS


   Klíčové slovo end unist je ukončení definice, který započal příkazem unist.

Viz také:

Klíčové slovo: ENTITY


   Klíčové slovo ENTITY je deklarace rozhraní návrhu. Návrh ENTITY je abstraktní model číslicového systému.

   Příkaz ENTITY obsahuje:

1. definici entity, ta obsahuje jméno entity a deklaraci portu rozhraní,
2. přinejmenším jedno tělo definované příkazem ARCHITECTURE.

   Příkaz ENTITY se zapisuje v tomto pořadí:

1. vyhrazené slovo ENTITY, následováno
   a - jménem entity,
   b - vyhrazené slovo IS,
2.1. nepovinný příkaz GENERIC následovaný seznamem deklarací,
2.2. nepovinný příkaz PORT následovaný seznamem deklarací,
2.4. nepovinný příkaz BEGIN následovaný vhodnýmy deklaracemi a
3. povinným příkazem END následován volitelním jménem (bod 1a).

    Porty definovane uvnitř entity jsou viditelné pouze v tělech definovaném příkazem ARCHITECTURE a odkazu napojeném na definici ENTITY. Pokud je definován nějaky signal nebo skupina signálu v těle příkazu ARCHITECTURE, tak jsou viditelné jen směrem dolů.

Příklad:
entity Mux is
  generic(RISE, FALL: time := 0 ns);
    port(A,B: in std_ulogic;
      Sel: in std_ulogic;
      Y: out std_ulogic);
end Mux;

LRM 1.1.

Viz také:

Klíčové slovo: GENERIC


   Klíčové slovo GENERIC se používá ve spojení s příkazem ENTITY. Deklarace pomocí příkazu GENERIC specifikuje statické hodnoty pro všechny těla definované příkazem ARCHITECTURE směrem dolů. Jako například různé nastavení, doby zpoždění a jiné parametry.

Příklad:
  generic(RISE, FALL: time := 0 ns);

LRM 1.1.

Viz také:

Klíčové slovo: MOD


   Klíčové slovo MOD je zbytek po dělení celých čísel.
Například: chceme zjistit jaky zbytek zůstane po dělení čísla 88 číslem 16.
Zápis provedeme takto:

-- Vstup = 88
Vystup <= Vstup mod 16;
--Vysledek je 8

   Přibližná náhrada příkazu MOD:

>

Vystup = Vstup – INT(Vstup/16)*16

Funkce INT je zahození desetinné části výsledku.

Příklad 1:
--hacesoft 31.7.2005
--prochazka.zde.cz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity demo is
   Port(clk : in bit;
      Vstup : in integer ;
      Vystup : out integer );
end demo;

architecture telo of demo is
begin
process (clk)
begin
   if clk='1' and clk'event then
      Vystup <= Vstup mod 16;
   end if;
end process;
end telo;

LRM 7.2.

Viz také:

Klíčové slovo: PORT


   Klíčové slovo PORT se používá ve spojením s příkazem ENTITY. PORTuž jak vyplývá ze samotného slova je jakýsi pomyslný „konektor“ pomocí něho se spojují proudící data.

   Příkaz PORT se zapisuje v tomto pořadí:

1. vyhrazené slovo PORT, následováno
  a – seznamem deklarací signálu,
  b – typem signálů.

Seznam signálů stejného významu i stejného typu se může zapisovat na jeden řádek ale pro větší přehlednost zápasu se provádí zápis na jeden řádek jen signálů které logicky patří k sobě. V Příkladu 1 jsou vstupy A a B na jednom řádku ale vstup Select už k ním nepatří. I když se jedná také o vstup. V tomto případě vstupy A a B si místo jednotlivých vstupů spíš zasloužili definovaní jako skupina signálů (Příklad 2). Ale někdy se muže jevit jako výhodnější definování podle příkladu 1.

   Typ signálu:

  • při použití příkazu IN jsou data přivedená na port pouze ke čtení. S informacemi v těle definované příkazem ARCHITECTURE se může jakkoliv nakládat ale nejdou měnit. Ale na vstupu definovaný příkazem ENTITY se tyto data zapisují.
  • při použití příkazu OUT jsou data na portu pouze pro čtení. S informacemi v těle definované příkazem ARCHITECTURE se mohou do takto definovaně proměnné pouze zapisovat. Ale na výstupu z ENTITY jsou tato data pouze pro čtení.
  • při použití příkazu INOUT se jedná o kombinací příkazu IN a OUT. To znamená že takto definovaná proměnná je určena jak pro čtení kdekoliv tak i pro zápis kdekoliv. Typickým příkladem takové proměnné je datová sběrnice (Příklad 3).
  • při použití příkazu BUFFER je to podobné jako u příkazu INOUT s tím rozdílem že disponuje na výstupu záchytným registrem (Příklad 4).

Nasledován posledním parametrem který určuje zda se jedna o jeden „drát“ to se specifikuje pomocí slova BIT a nebo o skupinu signálů., to se specifikuje pomocí slova STD_LOGIC_VECTOR a následován definicí rozsahu vzestupnou (příkaz TO) nebo sestupnou. (příkaz DOWNTO).

Příklad 1:
entity Mux is
   port(Vstup_A, Vstup_B: in bit;
      Select: in bit;
      Vystup: out bit);
end Mux;
Příklad 2:
entity Mux_1 is
   port(Vstup: in std_logic_vector(1 downto 0);
      Select: in bit;
      Vystup: out bit);
end Mux_1;
Příklad 3:
entity Transport is
   port(data: inout std_logic_vector(7 downto 0);
      data1: inout std_logic_vector(7 downto 0);
      Dir: in bit);
end Transport;

Příklad 4:
Obousměrný komunikační port

LRM 1.1.

Viz také:

Klíčové slovo: RANGE


   Klíčové slovo RANGE určuje velikost proměnné. V příkladu je datový typ integer omezen na hodnoty 0 až 8. To znamená že proměnná má čtyři bity. Příkaz RANGE muže obsahovat vzestupnou i sestupnou deklaraci (RANGE 0 to 8; nebo RANGE 8 downto 0;).

Příklad:
--hacesoft 7.10.2005
--prochazka.zde.cz
--Ukázka příkazu RANGE.
--Ten způsobí že v proměnné typu range jsou přípustné hodnoty pouze 0 až 8!!!
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity demo is
   Port ( clk : in bit;
      VstupA : in integer range 0 to 8;
      VstupB : in integer range 0 to 8;
      Vystup : out integer range 0 to 24);
end demo;

architecture telo of demo is
begin
process (clk)
variable c : integer range 0 to 9 :=2;
--promena C je inicializovana na hodnotu 2.

begin
   if clk='1' and clk'event then

      c := c + 1;
      if c=9 then c := 0; end if;
      Vystup <= VstupA + VstupB - c;
   end if;
end process;
end telo;

LRM 3.1.

Viz také:

Klíčové slovo: ROL


   Klíčové slovo ROL je operace bitového posunu doleva. Bit který vypadne z levé části slova se objeví na pravé straně. Pokud nechcete rotovat se slovem dokola a zajímá vás jen posun doleva, co vypadne vlevo se ztratí použijte instrukci SLL.

Příklad 1:
--hacesoft 30.7.2005
--prochazka.zde.cz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port (Vstup : in unsigned(7 downto 0);
         Vystup : out unsigned(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
   Vystup <= Vstup AND Vstup ROL 1;
end behavioral;

Příklad 2:
Posuvné matematické operace

LRM 7.2.3.

Viz také:

Klíčové slovo: ROR


   Klíčové slovo ROR je operace bitového posunu doprava. Bit který vypadne z pravé části slova se objeví na levé straně. Pokud nechcete rotovat se slovem dokola a zajímá vás jen posun doprava, co vypadne vpravo se ztratí použijte instrukci SRL.

Příklad 1:
--hacesoft 30.7.2005
--prochazka.zde.cz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port (Vstup : in unsigned(7 downto 0);
         Vystup : out unsigned(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
   Vystup <= Vstup AND Vstup ROR 1;
end behavioral;

Příklad 2:
Posuvné matematické operace

LRM 7.2.3.

Viz také:

Klíčové slovo: SIGNAL


   Klíčové slovo SIGNAL deklaruje konkretní signál (jeden drát (signál) nebo skupinu stejných vodičů (sběrnice)) specifikovaného druhu. Deklarace signálu obsahuje vyhrazené slovo SIGNAL, jméno signálu, typ signálu, nepovinnou informaci druhu signálu (REGISTER nebo BUS) a poslední specifikace která rovněž není povinná a to je počáteční hodnota signálu. Signály deklarované uvnitř entity jsou viditelné pouze v korespondenční architektuře.

   Poznámka: Signál nemůže být deklarován uvnitř procesu, procedury nebo funkce.

Příklad:
architecture ukazka of vzorek is
   signal data: std_logic_vector(15 downto 0);
   signal data1 : std_logic_vector(3 downto 0) REGISTER;
   signal data2 : std_logic REGISTER ;
   signal data3 : INOUT std_logic BUS;
   signal data4 : IN std_logic;
   signal prepinac : boolean := TRUE;
   signal data5 : std_logic_vector(4 downto 0) := "11111";
   signal data6 : std_logic_vector(63 downto 0):= x"0000000000000000";
   signal data7 : std_logic := '1';
begin
   ---...
end ukazka;

LRM 4.3.

Viz také:

Klíčové slovo: SLA


   Klíčové slovo SLA je operace aritmetického posunu doleva.

Příklad:
--hacesoft 30.7.2005
--prochazka.zde.cz
--demonstrace rozdilu instrukci SLA, SLL a ROL. Pro posuny doprava je všechno obraceně.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port(clk : in bit;
        Zapis : in bit;
        Vstup : in BIT_VECTOR(7 downto 0);
        VystupSLA : out BIT_VECTOR(7 downto 0);
        VystupSLL : out BIT_VECTOR(7 downto 0);
        VystupROL : out BIT_VECTOR(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
process (clk)
   variable promennaSLA : BIT_VECTOR (7 downto 0);
   variable promennaSLL : BIT_VECTOR (7 downto 0);
   variable promennaROL : BIT_VECTOR (7 downto 0);
begin
   if clk='1' and clk'event then
   if Zapis='1' then
      promennaSLA := vstup;
      promennaSLL := vstup;
      promennaROL := vstup;
   end if;
   promennaSLA := promennaSLA SLA 1;
   promennaSLL := promennaSLL SLL 1;
   promennaROL := promennaROL ROL 1;

   VystupSLA <= promennaSLA;
   VystupSLL <= promennaSLL;
   VystupROL <= promennaROL;
   end if;
end process;
end behavioral;

Následující obrázek ukazuje činnost kódu v příkladu 1. Kde jsou dobře patrny rozdíly instrukcí SLA, SLL a ROL.

rotace_doleva

LRM 7.2.3.

Viz také:

Klíčové slovo: SLL


   Klíčové slovo SLL je operace logického posunu doleva. Bit který vypadne z levé části slova se už neobjeví na pravé straně. Pokud chcete rotovat slovo dokola použijte instrukci ROL.

Příklad 1:
--hacesoft 30.7.2005
--prochazka.zde.cz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port (Vstup : in unsigned(7 downto 0);
         Vystup : out unsigned(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
   Vystup <= Vstup AND Vstup SLL 1;
end behavioral;

Příklad 2:
Posuvné matematické operace

LRM 7.2.3.

Viz také:

Klíčové slovo: SRA


   Klíčové slovo SRA je operace aritmetického posunu doprava.

Příklad:
--hacesoft 30.7.2005
--prochazka.zde.cz
--demonstrace rozdilu instrukci SRA, SRL a ROR. Pro posuny doprava je všechno obraceně.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port(clk : in bit;
        Zapis : in bit;
        Vstup : in BIT_VECTOR(7 downto 0);
        VystupSRA : out BIT_VECTOR(7 downto 0);
        VystupSRL : out BIT_VECTOR(7 downto 0);
        VystupROR : out BIT_VECTOR(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
process (clk)
   variable promennaSRA : BIT_VECTOR (7 downto 0);
   variable promennaSRL : BIT_VECTOR (7 downto 0);
   variable promennaROR : BIT_VECTOR (7 downto 0);
begin
   if clk='1' and clk'event then
   if Zapis='1' then
      promennaSRA := vstup;
      promennaSRL := vstup;
      promennaROR := vstup;
   end if;
   promennaSRA := promennaSRA SRA 1;
   promennaSRL := promennaSRL SRL 1;
   promennaROR := promennaROR ROR 1;

   VystupSRA <= promennaSRA;
   VystupSRL <= promennaSRL;
   VystupROR <= promennaROR;
   end if;
end process;
end behavioral;

Následující obrázek ukazuje činnost kódu v příkladu 1. Kde jsou dobře patrny rozdíly instrukcí SRA, SRL a ROR.

rotace_doprava

LRM 7.2.3.

Viz také:

Klíčové slovo: SRL


   Klíčové slovo SRL je operace logického posunu doprava. Bit který vypadne z pravé části slova se už neobjeví na levé straně. Pokud chcete rotovat slovo dokola použijte instrukci ROR.

Příklad 1:
--hacesoft 30.7.2005
--prochazka.zde.cz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity posuny is
   Port (Vstup : in unsigned(7 downto 0);
         Vystup : out unsigned(7 downto 0));
end posuny;

architecture behavioral of posuny is
begin
   Vystup <= Vstup AND Vstup SRL 1;
end behavioral;

Příklad 2:
Posuvné matematické operace

LRM 7.2.3.

Viz také:

Klíčové slovo: THEN


   Klíčové slovo THEN je nedílnou součásti příkazu IF.

Příklad:
--hacesoft 8.10.2005
--prochazka.zde.cz
--Ukázka příkazu THEN.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity demo is
   Port ( clk : in bit;
      Vystup : out integer range 0 to 8);
end demo;

architecture telo of demo is
begin
process (clk)
variable c : integer range 9 downto 0 :=3;
--promena C je inicializovana na hodnotu 3.

begin
   if clk='1' and clk'event then
      c := c + 1;
      if c=9 then c := 0; end if;
      Vystup <= c;
   end if;
end process;
end telo;

Viz také:

Klíčové slovo: TO


   Klíčové slovo to je vzestupná deklarace rozsahu. Nejprve se definuje dolní mez, nesledován příkazem to a nakonec se definuje horní mez. U klíčového slova downto je tomu přesně naopak!

LRM 6.5.

Viz také:

Klíčové slovo: TRANSPORT


   Klíčové slovo TRANSPORT je deklarace zpoždění, kde se přenesou všechny data s definovaným zpoždění.

Příklad:
--hacesoft 7.10.2005
--prochazka.zde.cz
--Ukázka příkazu TRANSPORT.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity demo is
   Port ( clk : in bit;
      Vystup : out integer range 0 to 8);
end demo;

architecture telo of demo is
begin
process (clk)
variable c : integer range 0 to 9 :=0;
begin
   if clk='1' and clk'event then
      c := c + 1;
      if c = 9 then c := 0; end if;
      Vystup <= transport c after 10 ps;
   end if;
end process;
end telo;

Následující obrázek ukazuje učinnost prikazu TRANSPORT.

transport

LRM 8.4.

Viz také:

Klíčové slovo: VARIABLE


   Klíčové slovo VARIABLE deklaruje proměnnou specifikovaného typu.
Syntax: Klíčove slovo VARIABLE nasleduje název proměnné, typ proměnné a velikost proměnné a volitelní parametr určující počáteční stav proměnné.

Příklad:
VARIABLE A : INTEGER RANGE 0 TO 1024 : = 0;

Proměnné A, typu integer s rozsahem 1024 (velikost je 9. bitu) a počáteční hodnotou 0.

Proměnná může být deklarovaná uvnitř procesu, procedury a nebo funkce.
Proměnná nemůže být typu soubor. Proměnné deklarované uvnitř procesu si zachovávají svoji hodnotu při dalším průchodu procesem. Opačně tomu je u proměnných deklarovaných uvnitř funkce a procedury. Ty jsou vždy inicializovány při jejich volaní.

Příklad1:
--hacesoft 9.10.2005
--prochazka.zde.cz
--Ukázka příkazu VARIABLE.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity demo is
   Port ( clk : in bit;
      Vystup : out integer range 0 to 7);
end demo;

architecture telo of demo is
begin
process (clk)
variable a : integer range 0 to 8 :=0;
begin
   if clk='1' and clk'event then
      a := a + 1;
      if a = 8 then a := 0; end if;
      Vystup <= a;
   end if;
end process;
end telo;

LRM 4.3.

Viz také:

Klíčové slovo: WAIT

   Klíčové slovo WAIT dočasně pozastaví proces do doby:

  • WAIT FOR: čekat dokud neuplyne požadovaný čas.
  • WAIT UNTIL: nasledován Booleovským výrazem. Čekat dokud výraz není pravda (true);
  • WAIT ON: nasledován citlivostním seznamem. Čekat dokud nenastane událost uvedena v citlivostním seznamu.

Pokud je příkaz WAIT použit uvnitř procesu, tak ten už nesmí obsahovat citlivostní seznam.

Viz také: