WebElektronika

Filekezelés alapjai a VHDL nyelvben

person access_time 2018.07.03.
A VHDL hardverleíró nyelvet a digitális áramkörök leírására, szimulációjára, implementálására hozták létre. De alkalmazhatjuk ezt a nyelvet egyéb párhuzamos folyamatok leírására is. Noha a hardvertervezésnél a file kezelés nem jelenik meg, a VHDL nyelv használható itt is. Ennek a lehetőségét, alkalmazását tekintjük most át ebben a cikkben. Beolvasunk értékeket egy text file-ból, amelyeken néhány műveletet végzünk, majd kiírjuk az eredményeket egy új file-ba.


Áttekintjük most, hogy hogyan lehet file-okat írni, olvasni a VHDL nyelvben. Hozzunk létre egy új projektet a VHDL szimulátorunkban (1. ábra).

kep
1. ábra   A "filekezel" projekt létrehozása
 

Ezután készítsük el azt a file-t, amelyet beolvasunk majd a VHDL alkalmazásunkból. Hozzuk létre a "bemenet.txt" file-t, amelynek a tartalmát itt láthatjuk:

0 0
0 1
1 0
1 1

 

Soronként felírjuk ebben a file-ban binárisan a számokat 0-tól 3-ig. Ezeket fogjuk beolvasni, végzünk a beolvasott adatokon különböző műveleteket, majd ezeknek az eredményeit kiírjuk egy másik file-ba (kimenet.txt).

A VHDL file neve file1.vhd, az entitás neve megegyezik a file nevével.
Nem csak a "szokásos" IEEE könyvtárat adjuk hozzá a file-unkhoz, hanem az STD-t is, és a különböző írás/olvasás műveletek miatt az std_logic_1164 csomag mellett még két csomagot is alkalmazni fogunk.
Tekintettel arra, hogy egy VHDL leírásban kötelező az entitás (illetve az architektúrális leírás is), viszont ebben a példában nincsenek bemenetek és kimenetek, ezért az entitásunk a file-ban üres.

Az architektúrális leírásunk is viszonylag egyszerű, csak egy process-t tartalmaz. A soros végrehajtású blokkban szerepel a wait, ezért a szenzitív lista nem tehető a processhez.

library IEEE, STD;
use ieee.std_logic_1164.all;
use ieee.std_logic_textio.all;
use std.textio.all;
 
entity file1 is
end file1;
 
architecture BEH of file1 is
begin
     process
    file in_file : text open read_mode is "bemenet.txt";
     file out_file : text open write_mode is "kimenet.txt";
     variable in_line, out_line : line;
     variable a, b, c, d : std_logic;
     begin
         write(out_line, "xor");
          write(out_line, " - ");
          write(out_line, "nxor");
          writeline(out_file, out_line);
          while not endfile(in_file) loop
               readline(in_file, in_line); 
               read(in_line, a);
               read(in_line, b);
               c := a xor b;
               d := not(a xor b);
               write(out_line, c);
               write(out_line, "   -   ");
               write(out_line, d);
               writeline(out_file, out_line);
          end loop;
          assert FALSE report "OKE, rendben" severity warning;
          wait;
     end process;
end BEH;

 

Még a while ciklus előtt kiírjuk a kimenetre a "xor - nxor" sort. Ezután a processben találjuk a while ciklust, amely addig fut, amíg a beolvasott file (bemenet.txt) végére nem érünk. Ebben a ciklusban soronként olvassuk be a bemeneti file tartalmát, amelyet az in_line nevű, line típusú változóban tárolunk el. Ez két számot (0 vagy 1) tartalmazhat, ezért a read(in_line, XXX) függvény segítségével a soronként beolvasott számokat elmentjük 1-1 változóba (a, b).
Ezt követően végrehajtunk egy xor, illetve egy nxor műveletet, amelyeknek az eredményeit "c" és "d" változókban tároljuk el.
Feladatunk ezután már az, hogy ezeknek a változóknak az értékeit kiírjuk a "kimenet.txt" file-ba. Fontos, hogy ezeket az értékeket ne egymás mellé írjuk, hanem tegyünk közéjük kötőjelet is, ezáltal kényelmesebben tudjuk megnézni majd a logikai műveletek eredményét. Ezért összesen három write() függvényre lesz szükségünk.

Az első függvénnyel kiírjuk a "c" értékét, ezután kiírunk egy kötőjelet is, végül pedig a "d" változó tartalmát írjuk be az out_line nevű változóba.
A writeline() függvény segítségével az out_line tartalmát kiírjuk a kimenet.txt file-ba. Ezeket a (rész)műveleteket addig ismételjük, amíg a bemenet.txt file végére nem érünk.

Ha ezek a műveletek sikeresen végrehajtásra kerültek, akkor kiírjuk a VHDL szimulátor konzolablakába az "OKÉ, rendben" tájékoztatást (2. ábra), majd a process működését a wait-tel felfüggesztjük.

kep
2. ábra   Sikeres a kimeneti file létrehozása
 

A kimenet.txt file tartalma:

xor - nxor
0   -   1
1   -   0
1   -   0
0   -   1