Peter j

Ebben a fejezetben az I / O fájlhoz tartozó VHDL eszközökkel foglalkozunk. A fájlok számos célt szolgálnak, amelyek közül az egyik a hosszú távú információk tárolásának biztosítása. Ebben az összefüggésben a "hosszú távú információ" a szimulációs futás életén kívül eső információkat jelent. A fájlok felhasználhatók a modellbe betöltendő adatok tárolásakor vagy a modellezés során kapott eredmények tárolásában. A VHDL a fájlműveletek speciális verzióit is biztosítja a szöveges fájlok kezeléséhez. Megmutatjuk, hogyan használható a szövegbevitel és a kimenet a szimulátor felhasználói felületének kiterjesztésére a modell-specifikus műveletekkel.

16.1 Fájlok

Elkezdtük a fájlok feldolgozását, figyelembe véve a VHDL-ben az I / O fájlhoz rendelt általános célú mechanizmusokat. A VHDL folyamatosan hozzáférést biztosít a fájlokhoz olyan műveletekkel, mint például a "nyitott", "közel", "olvasott" és "írható", amelyek ismerik a hagyományos programozási nyelvek felhasználóit.

A VHDL fájl az adatok tárolására használt objektumok egy osztálya. Így, mint a többi objektumosztályhoz, hozzá kell adnunk a fájl definíciót a modellhez. A fájltípus szintaxisa:

file_type_definition. a type_mark fájl

a type integer_file az egész szám fájl;

megad egy integer_file-t, amely jelzi a fájl típusát, amely csak egész számokat tárolhat. A fájl csak egy típusú objektumot tartalmazhat, de ez a típus lehet szinte bármilyen típusú VHDL, beleértve a skaláris rekordok és az egydimenziós tömbök típusát. Az egyetlen típus, amely nem menthető fájlba, többdimenziós tömbök, hozzáférési típusok, biztonsági típusok és más fájlok.

Miután meghatároztuk a fájltípust, kijelölhetünk egy fájlobjektumot. Ezt egy objektumnyilatkozat használatával végezzük el, az alábbiak szerint:

fájlazonosító. subtype_indication

[[open file_open_kind_expr] a string_expression];

A fájl definíciója egy vagy több ilyen típusú fájlt hoz létre. Fájlnyilatkozatot adhatunk minden olyan deklaratív részhez, amelyben objektumokat hozhatunk létre, például: architektúra leírása, blokkok, folyamatok, csomagok és szubrutinok.

fájl lookup_table_file. integer_file a "lookup-values";

A UNIX operációs rendszer alatt futó szimulátor egy fájlobjektumot társíthat egy "lookup-values" nevű fizikai fájlhoz az aktuális munkakönyvtárban. A Windows operációs rendszer alatt futó másik szimulátor különböző módon társíthat fájlobjektumot, mivel a fájlnevek általában tartalmaznak egy fájlkiterjesztést ebben az operációs rendszerben. Tehát egy objektumot társíthat egy "lookup-values.dat" nevű fizikai fájlhoz az aktuális munkakönyvtárban.

Az opcionális kifejezés a kulcsszavak megnyitása után lehetővé teszi számunkra, hogy meghatározzuk a fájlrendszer objektumhoz társított fizikai fájl megnyitását. Ennek a kifejezésnek a szabványos csomagban megadott előre definiált file_open_kind típusnak kell lennie. A definíciónak az a formája:

típus file_open_kind (read_mode, write_mode, append_mode);

Ha a definícióban elhagyja a fájlbejelentéssel kapcsolatos információkat, de logikai fájlnevet ad hozzá, a fizikai fájl megnyílik olvasási üzemmódban. A szakasz többi részében megnézzük mindegyik módot, és megnézzük, hogyan kell az adatokat olvasni és írni az egyes üzemmódokban megnyitott fájlok használatával.

VHDL-87. A VHDL-87 fájlmeghatározásának szintaxisa:
file_declaration.
fájlazonosító. subtype_indication is
[be vagy ki] string_expression;

16.1.2 Olvasás fájlból

Az olvasási és végfájl műveletek leírása a következő:

az eljárás olvasható (file: file.type; value.out element_type);
függvény végfájl (fájl f. file_type) return boolean;

Később ebben a fejezetben megnézzük az összes fájlt.

Példa 16.1 ROM tartalmának inicializálása fájlból

Fájlműveleteket használhatunk a ROM tartalmának fájlból történő inicializálására. A következő egy olyan objektumdefiníció, amely olyan ROM-ot tartalmaz, amely egy közös állandó értéket tartalmaz, jelezve annak a fájlnak a nevét, amelyről a ROM tartalmát be kell tölteni.
könyvtár ieee; használjon ieee.std_logic_1164.all;
entitás ROM
generikus (load_file_name. string);
port (sel in std_ulogic;
címet. a std_ulogic_vectorben;
adatokat. inout std_ulogic_vector);
end entity ROM;

olvasható (load_file, storage (index));
index: = index + 1;
véghurok;
-- válaszoljon a ROM hozzáférésekre
hurok
.
véghurok;
végső folyamat viselkedése;
end architektúra viselkedése;

A fenti példában minden egyes fájlelem rögzített hosszúságú szabvány-logikai vektor, amelyet a ROM-adatport szélessége határoz meg. Azonban nem korlátozódunk a rögzített hosszúságú tömbökre fájl elemekként. Egy fájltípust deklarálhatunk minden korlátozás vagy részlegesen korlátozott tömbtípus esetén egy elemtípus esetében, feltéve, hogy a tömbelem típusa egy típus skalár vagy teljesen egy összetett altípusra korlátozódik, például:
a type bit_vector_file a bit_vector fájl;

Az ilyen típusú fájlban lévő adatok egy bitvektorok sorozata, amelyek mindegyike különböző hosszúságú lehet. Egy ilyen fájl esetében az olvasási művelet valamivel eltérő formát ölt, mivel nem ismeri a következő elem hossza, amíg nem számoljuk. A műveletet implicit módon kijelentik
az eljárás olvasható (file f. file_type;
értéket. out elem_type; hosszát. természetes);

az olvasási műveletet az alábbiak szerint hívhatjuk:
olvas (vektorok, next_vector, actual_len);

Ez lehetővé teszi számunkra, hogy 64 bitre bontsuk a bitvektort. Ha a fájl következő értéke kisebb vagy egyenlő 64 bites értékkel, akkor ez az érték a next_vector szélső bal partján lesz elhelyezve, és a többi béta változatlan marad. Ha a fájlban lévő érték 64 bitesnél hosszabb, akkor az érték első 64 bitje a következő_vektorba kerül, és a maradék biteket elvetik. Mindkét esetben a tényleges_len a tényleges fájlhosszra van állítva, legyen az rövidebb vagy hosszabb, mint az olvasandó második argumentum hossza. Ez lehetővé teszi számunkra, hogy ellenőrizzük, elveszett-e az információ. Ha a kifejezés
actual_len> next_vector'length

Igaz, a vektor nem elég hosszú ahhoz, hogy befogadja az összes bitet.

Példa 16.2 Olvasási értékek egy fájlból

Tegyük fel, hogy kidolgoztunk egy modellt egy hálózati vevőhöz, és tesztelni akarjuk. Hálózati csomagokat hozhatunk létre, hogy a modell változó hosszúságú csomagok olvasásával stimuláljuk a modellt. Ennek folyamata a következő:


stimulate_network. a folyamat
type packet_file a bit_vector fájl;
fájl stimulus_file. packet_file
a nyitott read_mode a "tesztcsomagok";
változó csomag. bit_vektor (1-2048);
változó csomaghossz. természetes;
kezdődik
míg nem endfile (stimulus_file) hurok
olvasható (stimulus_file, packet, packet_length);
ha packet_length> packet'length akkor
"túl hosszú ösztönző csomag" figyelmen kívül hagyása "
súlyossági figyelmeztetés;
más
a bit_index 1-től a csomaghossz-hurokig
várjon, amíg stimulus_clock;
stimulus_network 0);
.
kezdődik
. -- inicializálja az utasításkészlet-tolmácsot
instruction_loop. hurok
. -- a következõ utasítást IR-ba vigye
-- dekódolja az utasítást
opcode_number: = áttérés természetesre (opcode);
számlálók (opcode_number): = számlálók (opcode_number) +1;
.
-- hajtsa végre a dekódolt utasításokat
eset opcode van
.
amikor halt_opcode => exit instruction_loop;
.
véges eset;
end loop instruction_loop;
indexben a számlálók körhuroján
írj (instruction_counts, counters (index));
véghurok;
várjon; - befejezte a programot, várjon örökké
végi folyamat tolmács;
végű architektúra műszeres;

Ha egy fájl ezzel a névvel már létezik a fájlrendszerben, és nyitva van az íráshoz, akkor az írási művelet segítségével a fájl végére további adattételek kerülnek hozzáadásra. Ha nincs ilyen nevű fájl a rendszerben, létrehoz egy új felvételt egy felvételi móddal, és az adatelemek a kezdetektől fogva íródnak. A Hozzáadás módot olyan fájloknál használják, amelyek több szimulációhoz információkat vagy szimulációs eredményeket gyűjtenek össze. Minden futás a korábban összegyűjtött adatok végén adatait adja hozzá a fájlhoz.