ПредишенСледващото

В тази глава ще разгледаме средства, за да VHDL за файла I \ О. Файловете се използват за различни цели, една от които е да се гарантира дългосрочното съхранение на информация. В този контекст "дългосрочната информация" означава информация, е живота на един цикъл на симулация. Файловете могат да се използват за съхранение на данни, които да бъдат заредени в модела в началото или за съхраняване на резултатите, получени чрез симулация. VHDL също така предоставя специализирани версии на файлови операции за работа с текстови файлове. Ние показваме как за въвеждане на текст и на изхода може да се използва за разширяване на симулатор на потребителския интерфейс с конкретни модели за операции.

16.1 файлове

Ние започваме нашата дискусия чрез разглеждане на файлове, с общо предназначение на механизмите, предвидени в VHDL файла I \ О. VHDL осигурява последователен достъп до файлове с помощта на операции като "отворен", "близо", "чете" и "пиша", които са познати на потребителите на традиционните езици за програмиране.

VHDL файл е клас от обекти, използвани за съхранение на данни. По този начин, както с други класове обекти, ние трябва да добавите файл определение в този модел. Синтаксисът за определен тип файл е както следва:

file_type_definition. файл на type_mark

въведете integer_file е файл на цяло число;

определя integer_file за вида файл, който може да съхраняват само числа. Файлът може да съдържа само един тип обект, но този тип може да бъде почти всякакъв вид VHDL, включително на видовете документи и скаларни едномерни. Единствените видове, които не могат да бъдат запазени във файл, са многоизмерни масиви, видове достъп, вида защита и други файлове.

След като сме идентифицирали вида на файла, можем да декларираме файл обект. Ние правим това с помощта на декларацията за обект, описана както следва:

идентификатор на файла. subtype_indication

[[Open file_open_kind_expr] е string_expression];

дефиниция на файла създава една или повече обекти на този тип файлове. Можем да добавим декларацията на файла в който и да е съображение, в което можем да създадем обекти, като архитектура, блокове, процеси, опаковки и подпрограми.

подаде lookup_table_file. integer_file е "търсене-стойности";

симулатор работещ под UNIX операционна система, може да се свърже обект файла на физически файл с име "търсене-стойности" в текущата работна директория. Друг симулатор, който работи под операционната система Windows, можете да свържете файл обект по различни начини, като имената на файловете, като правило, включва разширението на файла в операционната система. Така че, това е възможно да се сдружават обект с физическа файл, наречен "справка-values.dat" в текущата работна директория.

По желание израз след отваряне дума ни позволява да се идентифицира физическото файла, свързани с да бъдат отворени обект на файловата система. Този израз трябва да бъде установена на предварително определен тип file_open_kind, посочено в стандартния пакет. Определение е:

тип file_open_kind е (read_mode, write_mode, append_mode);

Ако пропуснете в декларацията на файла информация за дефиниране, но добавянето на логическо име на файла, физическото Файлът се отваря в режим само за четене. Останалата част от този раздел, ние гледаме на всеки един от тези режими, и да видим как данните се четат и записват с помощта на файл отвори във всеки режим.

VHDL-87. файл Синтаксис определение за VHDL-87:
file_declaration.
идентификатор на файла. subtype_indication е
[В или извън] string_expression;

16.1.2 четене от файл

endfile и чете операции са описани, както следва:

процедура чете (файл е FILE_TYPE.. стойност от ELEMENT_TYPE);
функция endfile (файл е FILE_TYPE.) връща булева;

По-късно в тази глава ще разгледаме всички опции файлове.

Пример 16.1 Initialize съдържанието на ROM файл

Можем да използваме операцията на файл, за да се инициализира на съдържанието на диска (ROM) на файла. По-долу е определението на обекта за ROM, който съдържа обща константа, посочване на името на файла, от който съдържанието на диска трябва да се стартират.
библиотека IEEE; използва ieee.std_logic_1164.all;
лице ROM е
генерични (load_file_name низ.);
порт (SEL в std_ulogic .;
адрес. в std_ulogic_vector;
данни. INOUT std_ulogic_vector);
края субект ROM;

Прочети (load_file, съхранение (индекс));
индекс: = индекс + 1;
края контур;
-- отговори на ROM достъпи
контур
.
края контур;
поведение край процес;
край архитектура в поведението;

В горния пример, всеки елемент е файл стандартна логика вектор фиксирана дължина определя ширината на порт ROM данни. Въпреки това, ние не се ограничават до масив от елементи с фиксирана дължина, както и файлове. Можем да обяви тип файл, без ограничение или частично ограничават до вида на тип масив елемент, при условие, че типът на масив елемент е скаларен тип или напълно ограничен композитен подтип, като например:
тип bit_vector_file е файл на bit_vector;

Данните във файла от този тип са поредица от битови вектори, всеки от които може да бъдат с различни дължини. За този файл, операция за четене има малко по-различна форма, защото ние не знаем дължината на следващия елемент, докато не го намери. Операция негласно обявен за
. Процедура чете (файл е FILE_TYPE;
стойност. от ELEMENT_TYPE; дължина. от природен);

ние може да предизвика прочетете операцията, както следва:
Прочети (вектори, next_vector, actual_len);

Това ни дава възможност да се помисли малко вектор с дължина до 64 бита. Ако следващата стойност във файла е по-малък или равен на 64 бита, тази стойност ще бъдат поставени в най-лявата част next_vector, а останалите битове са непроменени. Ако стойността на файла е по-дълъг от 64 бита, първите 64-битови стойности са поставени в next_vector, а останалите битове се изхвърлят. И в двата случая actual_len настроен на действителната дължина на файла, независимо дали то е по-кратък или по-дълъг от дължината на втория аргумент, за да бъде прочетена. Това ни дава възможност да се провери дали информацията е била изгубена. Ако изразът
actual_len> next_vector'length

вярно, тогава вектора не е достатъчно дълъг, за да държи всички битове.

Пример 16.2 за четене от файл

Да предположим, че ние сме разработили модел за приемник мрежа и искате да го тестваме. Ние може да генерира пакети мрежови модел за стимулиране чрез четене на пакетите с различна дължина от файл. Схемата за този процес е както следва:


stimulate_network. процес е
тип packet_file е файл на bit_vector;
подаде stimulus_file. packet_file
отворено read_mode е "тестови пакети";
променлива пакет. bit_vector (1-2048);
променлива packet_length. естествен;
започвам
докато не endfile (stimulus_file) контур
Прочети (stimulus_file, пакети, packet_length);
ако packet_length> packet'length след това
доклад "стимул пакет твърде дълго - игнорира"
тежестта предупреждение;
още
за bit_index в 1 до packet_length линия
изчакайте, докато stimulus_clock;
stimulus_network 0);
.
започвам
. -- инициализира интерпретатора набор инструкции
instruction_loop. контур
. -- донесе следващата инструкция в IR
-- декодиране на инструкцията
opcode_number: = convert_to_natural (Кодът);
броячи (opcode_number): = броячи (opcode_number) 1;
.
-- изпълни декодира инструкцията
Кодът случай е
.
когато halt_opcode => изход instruction_loop;
.
края случай;
края контур instruction_loop;
за индекс в counters'range линия
напиши (instruction_counts, броячи (индекс));
края контур;
изчакайте; - програма приключи, чакаме вечно
край процес интерпретатор;
край архитектура на апаратурата;

Ако даден файл със същото име вече съществува във файловата система и да бъде достъпен за писане, последователни елементите на данните, се добавят към края на файла с помощта на операция за запис. Ако няма файл с това име, тя създава нов файл с режима за протокола, както и елементите на данните се записват от самото начало. добавете режим се използва за файлове, които съхраняват информация или резултатите от симулацията за редица симулации. Всяка серия добавите данните си до края вече съхранени данни във файл.

Подкрепете проекта - споделете линка, благодаря!