WebElektronika
Std Logic típus használata a VHDL hardverleíró nyelvben
A VHDL nyelvben a leggyakrabban használt típus az std_logic. Ezt ajánlja például a Xilinx cég is, amely FPGA-kat (is) gyárt.
Viszont hogyan tudjuk használni ezt az (alap)típust, amely a következő értékeket veheti fel : ‘X’,’U’,’1’,’0’,’Z’,’W’,’L’,’H’,’-’ ?
Ahhoz, hogy az std_logic típus alkalmazható legyen, az std_logic_1164-es csomagot meg kell hivatkoznunk minden VHDL file elején. Ehhez meg kell adni az IEEE könyvtárt is.
Elmélet
Library IEEE;
use Könyvtárnév.Csomagnév.All;
std_logic_1164 csomag használata
Library IEEE;
use ieee.std_logic_1164.all
std_logic_1164 csomag "tartalma"
Az "std_logic_1164 csomg típusdefinciókat és függvényeket tartalmaz. Ezek a következők :
- típusok
- std_logic
- std_ulogic
- std_logic_vector
- std_ulogic_vector
- függvények
- to_bit függvény
- to_stdulogic fgv
- to_bitvector fgv
- to_stdlogicvector fgv
- rising_edge
- falling_edge
- is_x fgv
Látjuk, hogy nem csak skalár, hanem vektor is alkalmazható a fejlesztéseink során.
Az std_logic_1164-es csomagban megadott std_ulogic a következő értékeket veheti fel :
- U : nincs kezdőérték
- 0 : 0 (kényszerített)
- 1 : 1 (kényszerített)
- Z : nagyimpedanciás
- X : ismeretlen (kényszerített)
- W : gyenge ismeretlen
- L : 0 (gyenge)
- H : 1 (gyenge)
- - : lényegtelen
példa : if SQ = "1X1XX0" then <--> if SQ(5) = '1' and SQ(3) = '1' and SQ(0) = '0' then
Látjuk, hogy ebben a csomagban viszonylag kevés függvény található. Készíthetünk az std_logic-ból bit típust, vagy akár bit-ből std_ulogic-ot is. Használhatjuk skalárra, de akár vektort is át tudunk konvertálni.
Konverziók
Készítsük el a következő VHDL kódot, amely a konverziókra mutat egy példát (1. ábra).
1. ábra Példa a konverziókra
Láthatjuk, hogy az entitás üres, azaz a megvalósítandó alkalmazásunknak nincsenek bemenetei, kimenetei. A felépítményben deklarált jelek írhatók és olvashatók.
is_x() függvény alkalmazása
Érdekes ez a függvény, logikai igazat ad vissza, amikor nem logikai 1-et vagy 0-t adunk meg a függvény paraméterlistájában.
- is_x() függvény
- function is_x (s : std_ulogic) return boolean
- function is_x (s : std_ulogic_vector) return boolean
- function is_x (s : std_logic_vector) return boolean
- true-t ad vissza akkor, ha
- 'U', 'X', 'Z', 'W', '-'
- false-t ad vissza akkor, ha
- egyéb eset
Szimuláljuk ennek a függvénynek a működését, írjuk meg a következő programot (2. ábra).
2. ábra is_x() függvény használata
Nézzük meg ennek a VHDL file-nak a szimulációs eredményét (3. ábra).
3. ábra A szimulációs eredmény
Egyéb függvények
A következő két függvényt az állapotváltások detektálására tudjuk használni.
- rising_edge
- true-t ad vissza, amikor „s” 0->1 –be megy
- function rising_edge ( signal s : std_ulogic ) return boolean
- falling_edge
- true-t ad vissza, amikor „s” 1->0 –ba megy
- function falling_edge ( signal s : std_ulogic ) return boolean
Ezek kiválthatók az event használatával is:
rising_edge(CLK) <--> CLK'event and CLK = '1'
Nézzük meg ezeknek a függvényeknek a használatát egy szekvenciális blokkban. Az első esetben a CLK jel felfutó élét vizsgáljuk, a rising_edge() akkor ad vissza logikai 1-et, amikor a CLK logikai nullából egybe megy.
signal CLK: std_logic;
...
process(CLK)
begin
if rising_edge(CLK) then
...
end if;
end process;
A következő esetben a CLK lefutó élét vizsgáljuk.
signal CLK: std_logic;
...
process(CLK)
begin
if falling_edge(CLK) then
...
end if;
end process;