WebElektronika

Std Logic típus használata a VHDL hardverleíró nyelvben

person access_time 2015.04.06.
A beágyazott rendszerek világában kulcsszerepet kaphatnak a programozható logikai áramkörök, az FPGA-k és/vagy a CPLD-k is. Tekintettel arra, hogy az FPGA-k akár több millió logikai kaput is tartalmazhatnak, ezért szinte ezeket csak különböző harverleíró nyelvek segítségével programozhatjuk, például a VHDL-lel.


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).

kep
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).

kep
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).

kep
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;