SlideShare a Scribd company logo
Куланов В.А.
[v.kulanov@csn.khai.edu]
Файлы.
Файловый ввод/вывод в
языке VHDL
«Технологии проектирования
компьютерных систем»
Файловый ввод/вывод в VHDL
 Используется на этапе моделирования/тестирования/отладки
проектных решений (чаще всего в составе testbench-модулей):
• работа с большим объемом (набором) входных/выходных
данных
• инициализация памяти (RAM, ROM) в составе тестируемого
устройства
• возможность «структуризации» обрабатываемых данных
 разные форматы файлов: JSON, XML, CSV, YAML
 множество «источников/приемников»
• необходимость вести «логирование» процесса
моделирования/тестирования/отладки
• возможность накопления статистики
• "Run and Fun"
 Не входит в «синтезируемое» подмножество языка:
• только для моделирования
Файловый ввод/вывод в VHDL
Декларация файлового типа
Декларация объекта
файлового типа
(файлового дескриптора)
Операции чтения/записи
Закрытие файла
Данные какого типа
будем хранить?
Тот кто будет
«посредником» между
файловой системой и
проектным описаниемОткрытие файла
Режимы открытия:
«Автоматический»
«Ручной» (явное)
Декларация файлового типа
 Объект типа FILE – специальный тип, который служит
«интерфейсом» между VHDL описанием и хост-окружением
 Определение типа файла указывает тип объекта, который
может храниться в файле данного типа
 Файлы могут хранить объекты только одного типа
 Декларация файлового типа:
TYPE type_name IS FILE OF type_mark;
Файловый тип
Тип данных
 Предопределенный
 Пользовательский
 Скалярные (простые)
 Записи (RECORD)
 Одномерные массивы
 Многомерные массивы
 Указательные
 Файловые
 Защищенные
-- хранит данные типа INTEGER
TYPE int_file IS FILE OF INTEGER;
-- хранит данные в виде символов
-- таблицы ASCII
TYPE TEXT IS FILE OF STRING;
TYPE state_file IS FILE OF state;
FILE file_id: type_name
[[OPEN open_mode] IS file_logical_name];
Декларация объекта файлового типа
TYPE type_name IS FILE OF type_mark;
Режимы открытия файла:
READ_MODE – режим чтения (по
умолчанию)
WRITE_MODE – режим записи
APPEND_MODE – режим добавления
Файловый дескриптор
FILE_OPEN_KIND IS (READ_MODE,
WRITE_MODE,
APPEND_MODE)
Имя (путь) файла
(строковое выражение)
Если секция присутствует,
тогда файл автоматически
открывается/закрывается:
 в начале/конце моделирования
(если объявлен в пакете,
архитектурном теле)
 при вызове подпрограммы и
выходе из нее (если объявлен в
подпрограмме)
Примеры
TYPE int_file IS FILE OF INTEGER;
-- автоматический режим открытия/закрытия файла,
-- файл "in.dat" находится в текущей директории
FILE integer_file: int_file OPEN READ_MODE IS "in.dat";
-- объявление файлового дескриптора, предполагается, что
-- связывание между файловым дескриптором и физическим
-- файлом будет производиться позже (см. далее)
FILE data_file: int_file;
-- автоматическое открытие файла в режиме чтения
FILE stimulus: int_file IS "vector.dat";
-- пользовательский тип данных
TYPE states IS (IDLE, ERROR, SLEEP, RUNNING);
TYPE states_file IS FILE OF states;
-- *nix ОС хост система. Если файл не существует, то он
-- будет создан (если это возможно)
FILE states_log: states_file OPEN WRITE_MODE IS
"/home/user/project/logs/states.log";
Работа с файлом. Чтение/Запись
 При открытии файла работа с ним выполняется последовательно,
начиная с первого элемента
 Для чтения данных из файла используется процедура READ
 Для записи данных в файл используется процедура WRITE
 Для определения конца файла используется функция ENDFILE
 В языке VHDL определены процедуры чтения и записи только для
предопределенных типов данных
• для пользовательских типов данных необходимо писать
собственные процедуры, основанные на базовых
PROCEDURE READ(FILE f: FILE_TYPE; value: OUT type);
PROCEDURE READ(FILE f: FILE_TYPE; value: OUT type;
length: OUT: NATURAL);
PROCEDURE WRITE(FILE f: FILE_TYPE; value: IN type);
FUNCTION ENDFILE(FILE f: FILE_TYPE) RETURN BOOLEAN;
Пример чтения из файла
GENERIC(load_file_name: STRING := "/tmp/rom.dat");
...
behavior: PROCESS IS
SUBTYPE word IS STD_ULOGIC_VECTOR(0 to DATA_WIDTH - 1);
TYPE storage_array IS ARRAY (NATURAL RANGE <>) OF word;
VARIABLE storage: storage_array(0 TO 2**ADDRESS_WIDTH – 1);
VARIABLE index: NATURAL;
TYPE load_file_type IS FILE OF word;
FILE load_file: load_file_type OPEN READ_MODE IS load_file_name;
begin
-- инициализируем ROM содержимым из файла load_file_name
index := 0;
WHILE NOT ENDFILE(load_file) LOOP
read(load_file, storage(index));
index := index + 1;
END LOOP;
-- работа с ROM
...
END PROCESS behavior;
...
word_0
word_1
word_2
...
word_n
storage
2**ADDRESS_WIDTH
Пример чтения из файла
TYPE integer_vector IS ARRAY (INTEGER RANGE < >) OF INTEGER;
IMPURE FUNCTION read_array (file_name: STRING;
array_length: NATURAL)
RETURN integer_vector IS
TYPE integer_file IS FILE OF INTEGER;
FILE data_file: integer_file OPEN READ_MODE IS file_name;
VARIABLE result: integer_vector(1 TO array_length)
:= (OTHERS => 0);
VARIABLE index: integer := 1;
BEGIN
WHILE NOT ENDFILE(data_file) AND index <= array_length LOOP
READ(data_file, result(index));
index := index + 1;
END LOOP;
RETURN result;
END FUNCTION read_array;
-- инициализация константы списка коэффициентов
CONSTANT coeffs : integer_vector := read_array("coeff.dat", 16);
PROCESS IS
CONSTANT MAX_COUNT: NATURAL := 5;
VARIABLE count: INTEGER := 1000;
TYPE int_file IS FILE OF INTEGER;
FILE data: int_file OPEN WRITE_MODE IS "file_demo.dat";
BEGIN
FOR i IN 1 TO MAX_COUNT LOOP
IF i >= MAX_COUNT THEN
EXIT;
END IF;
WRITE(data, count);
count := count + 1;
END LOOP;
WAIT;
END PROCESS;
Пример записи в файл
View in HEX
100010
0x000003e8
4 + 4 + 4 + 4 = 16 байт
100110
0x000003e9
100210
0x000003ea
100310
0x000003eb
Открытие и закрытие файлов
явным образом
 Допустима декларация файлового дескриптора (объекта) без явного
связывания его с физическим файлом
FILE lut_file, result_file: int_file;
 Для открытия/закрытия файловых объектов (заданных в таком стиле)
используются процедуры FILE_OPEN() и FILE_CLOSE():
TYPE file_type IS FILE OF element_type;
TYPE FILE_OPEN_STATUS IS (OPEN_OK, STATUS_ERROR,
NAME_ERROR, MODE_ERROR);
PROCEDURE FILE_OPEN(status: OUT FILE_OPEN_STATUS;
FILE f: file_type;
external_name: IN STRING;
open_kind: IN FILE_OPEN_KIND := READ_MODE);
PROCEDURE FILE_CLOSE(FILE f: file_type);
OPEN_OK –успешноеоткрытиефайла
STATUS_ERROR –файловыйобъектоткрытисвязанужесдругимфизическимобъектом
NAME_ERROR -причтении:файластакимименемнесуществует;призаписиили
добавлении:файлстакимименемнесуществуетинеможетбытьсоздан
MODE_ERROR –файлсуществует,нонеможетбытьоткрытвуказываемомрежиме
Открытие и закрытие файлов
явным образом
PROCESS IS
CONSTANT MAX_COUNT: NATURAL := 10;
VARIABLE count: INTEGER := 0;
TYPE int_file IS FILE OF INTEGER;
FILE data: int_file;
VARIABLE f_status: FILE_OPEN_STATUS;
BEGIN
FILE_OPEN(f_stat, data, "file.dat", WRITE_MODE);
REPORT "Got status: "&FILE_OPEN_STATUS'image(f_stat);
IF f_stat = OPEN_OK THEN
FOR i IN 1 TO MAX_COUNT LOOP
IF i >= MAX_COUNT THEN
EXIT;
END IF;
WRITE(data, count);
count := count + 2;
END LOOP;
FILE_CLOSE(data);
END IF;
WAIT;
END PROCESS;
Пакет TEXTIO. Предпосылки
 Рассматриваемые ранее (выше) типы файлов хранят данные
в некотором двоичном представлении
• формат определяется хостовой ОС, а также системой
моделирования (симулятором)
 Возникает проблема переносимости файлов между разными
ОС и системами моделирования
 Формирование файлов с наборами тестовых воздействий, а
также чтение результатов моделирования требует
дополнительных усилий, с учетом особенностей хранения
двоичных данных
• невозможно представить входные/выходные файлы в
«читабельной» (для человека) форме
Нельзя просто так
взять и просмотреть
двоичный файл
Пакет TEXTIO
 Предопределенный пакет TEXTIO библиотеки STD
предлагает ряд «полезных» типов данных и операций для
чтения/записи текстовых файлов, т.е. файлов, в которых
данные представлены в текстовом виде:
• стандартные файловые типы
• процедуры для чтения и записи текстового представления
предопределенных типов данных языка VHDL
 Читаемые и записываемые текстовые файлы являются ASCII-
файлами
 Пакет TEXTIO поддерживается всеми симуляторами
 При использовании пакета TEXTIO требуется явное его
включение в проект:
USE std.textio.ALL;
Пакет TEXTIO. Составляющие
 Операции ввода/вывода, используемые пакетом TEXTIO
основаны на динамических строках, доступ к которым
осуществляется через указатели
 Тип TEXT является файловым типом, представляющим файл
из текстовых строк (ASCII-символов) переменной длины
 Процедуры чтения/записи файла
TYPE LINE IS ACCESS STRING; -- указатель на строку
TYPE TEXT IS FILE OF STRING;
PROCEDURE READLINE(FILE F: TEXT; L: OUT LINE);
PROCEDURE READ(L: INOUT LINE; value: OUT BIT);
PROCEDURE WRITE(L: INOUT LINE; value: OUT BIT);
PROCEDURE WRITELINE(FILE F: TEXT; L: INOUT LINE);
Пакет TEXTIO
 Тип LINE выступает в роли «буфера» для операций чтения и записи:
• READ()и WRITE()- получают доступ и работают с этим «буфером»
• READLINE()и WRITELINE()- перемещают содержимое этого
«буфера» в/из файл(а)
 Чтение из файла:
1. READLINE()читает целую строку из входного файла, создает
строковый объект в памяти и возвращает на него указатель
2. READ()извлекает из строки значения разных типов (BOOLEAN,
BIT, BIT_VECTOR, INTEGER, REAL, TIME, CHARACTER,
STRING)
 Запись в файл:
1. WRITE()преобразует данные в строковое отображение и
возвращает указатель на полученный объект строкового типа
2. WRITELINE()передает указатель на созданный в памяти
строковый объект (если значение указателя NULL, тогда в
выходной файл записывается пустая строка)
В пакете TEXTIO процедура
WRITE()перегружена для типов
STRING и BIT_VECTOR , поэтому
необходимо явно указывать тип
передаваемого параметра:
WRITE(L, STRING'("hello"));
WRITE(L, BIT_VECTOR'("010111"));
Пакет TEXTIO
PROCESS IS
VARIABLE count: INTEGER := 0;
VARIABLE buf_in, buf_out: LINE;
FILE infile, outfile: TEXT;
BEGIN
FILE_OPEN(f_stat, outfile, "myfile1.txt", WRITE_MODE);
FILE_OPEN(f_stat, infile, "myfile2.txt", READ_MODE);
READLINE(infile, buf_in);
READ(buf_in, count);
count := count + 1;
WRITE(buf_out, STRING'("New count value is: "));
WRITE(buf_out, count);
WRITELINE(outfile, buf);
FILE_CLOSE(infile);
FILE_CLOSE(outfile);
WAIT;
END PROCESS;
TEXTIO: INPUT и OUTPUT
 В пакете TEXTIO предопределены два файловых дескриптора:
• INPUT
• OUTPUT
 Дескрипторы соответствуют стандартному вводу STD_INPUT
и стандартному выводу STD_OUTPUT хостовой ОС
(клавиатура и консоль VHDL симулятора соответсвенно)
FILE INPUT: TEXT OPEN READ_MODE IS "STD_INPUT";
FILE OUTPUT: TEXT OPEN WRITE_MODE IS "STD_OUTPUT"
TEXTIO: INPUT и OUTPUT
PROCESS IS
FILE thefile: TEXT;
VARIABLE buf_out, buf_in: LINE;
VARIABLE fname: STRING(1 TO 10);
VARIABLE f_status: FILE_OPEN_STATUS;
BEGIN
WRITE(buf_out, STRING'("Enter file name:"));
-- OUTPUT – файловый дескриптор стандартного вывода
WRITELINE(OUTPUT, buf_out);
-- INPUT – файловый дескриптор стандартного ввода
READLINE(INPUT, buf_in);
READ(buf_in, fname);
FILE_OPEN(f_status, thefile, fname, READ_MODE);
READLINE(thefile, buf_in);
WRITELINE(OUTPUT, buf_in);
WAIT;
END PROCESS;
File input/output in VHDL

More Related Content

What's hot

2th year iv sem de lab manual
2th year iv sem de lab manual2th year iv sem de lab manual
2th year iv sem de lab manual
HARISH KUMAR MAHESHWARI
 
Constructors and destructors
Constructors and destructorsConstructors and destructors
Constructors and destructors
Vineeta Garg
 
Don't care conditions
Don't care conditionsDon't care conditions
Don't care conditions
Grishma Maravia
 
Control Statements in Java
Control Statements in JavaControl Statements in Java
Control Statements in Java
Niloy Saha
 
04. Console Input Output
04. Console Input Output 04. Console Input Output
04. Console Input Output
Intro C# Book
 
Rethrowing exception- JAVA
Rethrowing exception- JAVARethrowing exception- JAVA
Rethrowing exception- JAVA
Rajan Shah
 
JK flip flops
JK flip flopsJK flip flops
JK flip flops
Zakariae EL IDRISSI
 
Mastering the MongoDB Shell
Mastering the MongoDB ShellMastering the MongoDB Shell
Mastering the MongoDB Shell
MongoDB
 
Applet life cycle
Applet life cycleApplet life cycle
Applet life cyclemyrajendra
 
D flip Flop
D flip FlopD flip Flop
D flip Flop
Talha Mudassar
 
Oracle Index
Oracle IndexOracle Index
Oracle Index
Madhavendra Dutt
 
Presentation on nesting of loops
Presentation on nesting of loopsPresentation on nesting of loops
Presentation on nesting of loopsbsdeol28
 
Function in PL/SQL
Function in PL/SQLFunction in PL/SQL
Function in PL/SQL
Pooja Dixit
 
Java 9/10/11 - What's new and why you should upgrade
Java 9/10/11 - What's new and why you should upgradeJava 9/10/11 - What's new and why you should upgrade
Java 9/10/11 - What's new and why you should upgrade
Simone Bordet
 
Logic gates and logic circuits
Logic gates and logic circuitsLogic gates and logic circuits
Logic gates and logic circuits
jyoti_lakhani
 
Multiplexers
MultiplexersMultiplexers
Multiplexers
Saloni Jain
 
Dynamic Polymorphism in C++
Dynamic Polymorphism in C++Dynamic Polymorphism in C++
Dynamic Polymorphism in C++
Dharmisha Sharma
 

What's hot (20)

2th year iv sem de lab manual
2th year iv sem de lab manual2th year iv sem de lab manual
2th year iv sem de lab manual
 
Constructors and destructors
Constructors and destructorsConstructors and destructors
Constructors and destructors
 
Don't care conditions
Don't care conditionsDon't care conditions
Don't care conditions
 
Core java slides
Core java slidesCore java slides
Core java slides
 
Control Statements in Java
Control Statements in JavaControl Statements in Java
Control Statements in Java
 
04. Console Input Output
04. Console Input Output 04. Console Input Output
04. Console Input Output
 
Rethrowing exception- JAVA
Rethrowing exception- JAVARethrowing exception- JAVA
Rethrowing exception- JAVA
 
Jdbc
JdbcJdbc
Jdbc
 
JK flip flops
JK flip flopsJK flip flops
JK flip flops
 
Mastering the MongoDB Shell
Mastering the MongoDB ShellMastering the MongoDB Shell
Mastering the MongoDB Shell
 
Applet life cycle
Applet life cycleApplet life cycle
Applet life cycle
 
De lab manual
De lab manualDe lab manual
De lab manual
 
D flip Flop
D flip FlopD flip Flop
D flip Flop
 
Oracle Index
Oracle IndexOracle Index
Oracle Index
 
Presentation on nesting of loops
Presentation on nesting of loopsPresentation on nesting of loops
Presentation on nesting of loops
 
Function in PL/SQL
Function in PL/SQLFunction in PL/SQL
Function in PL/SQL
 
Java 9/10/11 - What's new and why you should upgrade
Java 9/10/11 - What's new and why you should upgradeJava 9/10/11 - What's new and why you should upgrade
Java 9/10/11 - What's new and why you should upgrade
 
Logic gates and logic circuits
Logic gates and logic circuitsLogic gates and logic circuits
Logic gates and logic circuits
 
Multiplexers
MultiplexersMultiplexers
Multiplexers
 
Dynamic Polymorphism in C++
Dynamic Polymorphism in C++Dynamic Polymorphism in C++
Dynamic Polymorphism in C++
 

Viewers also liked

Statements in VHDL - Concurrent Statements
Statements in VHDL - Concurrent StatementsStatements in VHDL - Concurrent Statements
Statements in VHDL - Concurrent Statements
vitaliykulanov
 
Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDL
vitaliykulanov
 
VHDL data types, user-defined types, subtypes
VHDL data types, user-defined types, subtypesVHDL data types, user-defined types, subtypes
VHDL data types, user-defined types, subtypes
vitaliykulanov
 
VHDL composite data types, arrays, records
VHDL composite data types, arrays, recordsVHDL composite data types, arrays, records
VHDL composite data types, arrays, records
vitaliykulanov
 
Structural project description in VHDL
Structural project description in VHDLStructural project description in VHDL
Structural project description in VHDL
vitaliykulanov
 
Attributes in VHDL
Attributes in VHDLAttributes in VHDL
Attributes in VHDL
vitaliykulanov
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
vitaliykulanov
 
Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDL
vitaliykulanov
 
Statements in VHDL - Sequential Statements
Statements in VHDL - Sequential StatementsStatements in VHDL - Sequential Statements
Statements in VHDL - Sequential Statements
vitaliykulanov
 

Viewers also liked (9)

Statements in VHDL - Concurrent Statements
Statements in VHDL - Concurrent StatementsStatements in VHDL - Concurrent Statements
Statements in VHDL - Concurrent Statements
 
Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDL
 
VHDL data types, user-defined types, subtypes
VHDL data types, user-defined types, subtypesVHDL data types, user-defined types, subtypes
VHDL data types, user-defined types, subtypes
 
VHDL composite data types, arrays, records
VHDL composite data types, arrays, recordsVHDL composite data types, arrays, records
VHDL composite data types, arrays, records
 
Structural project description in VHDL
Structural project description in VHDLStructural project description in VHDL
Structural project description in VHDL
 
Attributes in VHDL
Attributes in VHDLAttributes in VHDL
Attributes in VHDL
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
 
Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDLSubprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Functions in VHDL
 
Statements in VHDL - Sequential Statements
Statements in VHDL - Sequential StatementsStatements in VHDL - Sequential Statements
Statements in VHDL - Sequential Statements
 

Similar to File input/output in VHDL

работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 
file handling in c++
file handling in c++file handling in c++
file handling in c++
Maxim Shaptala
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
Igor Shkulipa
 
09 rec file
09 rec file09 rec file
09 rec file
pogromskaya
 
file handling in c
file handling in cfile handling in c
file handling in c
Maxim Shaptala
 
п о файловая система
п о файловая системап о файловая система
п о файловая системаkrasoa2009
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
 
XML
XMLXML
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Vladimir Kochetkov
 
04 - Hadoop. HDFS Java API
04 - Hadoop. HDFS Java API04 - Hadoop. HDFS Java API
04 - Hadoop. HDFS Java API
Roman Brovko
 
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМАФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
Елена Никонова
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
Igor Shkulipa
 
Система электронного документооборота "1С:Документооборот 8"
Система электронного документооборота "1С:Документооборот 8"Система электронного документооборота "1С:Документооборот 8"
Система электронного документооборота "1С:Документооборот 8"
razdolie
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
хранение данных
хранение данныххранение данных
хранение данных
Noveo
 

Similar to File input/output in VHDL (20)

работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
file handling in c++
file handling in c++file handling in c++
file handling in c++
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
09 rec file
09 rec file09 rec file
09 rec file
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Unix /etc/
Unix /etc/Unix /etc/
Unix /etc/
 
п о файловая система
п о файловая системап о файловая система
п о файловая система
 
работа с файлами в с++
работа с файлами в с++работа с файлами в с++
работа с файлами в с++
 
ос урок1
ос урок1ос урок1
ос урок1
 
Lection1
Lection1Lection1
Lection1
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
XML
XMLXML
XML
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
04 - Hadoop. HDFS Java API
04 - Hadoop. HDFS Java API04 - Hadoop. HDFS Java API
04 - Hadoop. HDFS Java API
 
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМАФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
ФАЙЛ И ФАЙЛОВАЯ СИСТЕМА
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
 
Система электронного документооборота "1С:Документооборот 8"
Система электронного документооборота "1С:Документооборот 8"Система электронного документооборота "1С:Документооборот 8"
Система электронного документооборота "1С:Документооборот 8"
 
файлова система
файлова системафайлова система
файлова система
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
хранение данных
хранение данныххранение данных
хранение данных
 

File input/output in VHDL

  • 1. Куланов В.А. [v.kulanov@csn.khai.edu] Файлы. Файловый ввод/вывод в языке VHDL «Технологии проектирования компьютерных систем»
  • 2. Файловый ввод/вывод в VHDL  Используется на этапе моделирования/тестирования/отладки проектных решений (чаще всего в составе testbench-модулей): • работа с большим объемом (набором) входных/выходных данных • инициализация памяти (RAM, ROM) в составе тестируемого устройства • возможность «структуризации» обрабатываемых данных  разные форматы файлов: JSON, XML, CSV, YAML  множество «источников/приемников» • необходимость вести «логирование» процесса моделирования/тестирования/отладки • возможность накопления статистики • "Run and Fun"  Не входит в «синтезируемое» подмножество языка: • только для моделирования
  • 3. Файловый ввод/вывод в VHDL Декларация файлового типа Декларация объекта файлового типа (файлового дескриптора) Операции чтения/записи Закрытие файла Данные какого типа будем хранить? Тот кто будет «посредником» между файловой системой и проектным описаниемОткрытие файла Режимы открытия: «Автоматический» «Ручной» (явное)
  • 4. Декларация файлового типа  Объект типа FILE – специальный тип, который служит «интерфейсом» между VHDL описанием и хост-окружением  Определение типа файла указывает тип объекта, который может храниться в файле данного типа  Файлы могут хранить объекты только одного типа  Декларация файлового типа: TYPE type_name IS FILE OF type_mark; Файловый тип Тип данных  Предопределенный  Пользовательский  Скалярные (простые)  Записи (RECORD)  Одномерные массивы  Многомерные массивы  Указательные  Файловые  Защищенные -- хранит данные типа INTEGER TYPE int_file IS FILE OF INTEGER; -- хранит данные в виде символов -- таблицы ASCII TYPE TEXT IS FILE OF STRING; TYPE state_file IS FILE OF state;
  • 5. FILE file_id: type_name [[OPEN open_mode] IS file_logical_name]; Декларация объекта файлового типа TYPE type_name IS FILE OF type_mark; Режимы открытия файла: READ_MODE – режим чтения (по умолчанию) WRITE_MODE – режим записи APPEND_MODE – режим добавления Файловый дескриптор FILE_OPEN_KIND IS (READ_MODE, WRITE_MODE, APPEND_MODE) Имя (путь) файла (строковое выражение) Если секция присутствует, тогда файл автоматически открывается/закрывается:  в начале/конце моделирования (если объявлен в пакете, архитектурном теле)  при вызове подпрограммы и выходе из нее (если объявлен в подпрограмме)
  • 6. Примеры TYPE int_file IS FILE OF INTEGER; -- автоматический режим открытия/закрытия файла, -- файл "in.dat" находится в текущей директории FILE integer_file: int_file OPEN READ_MODE IS "in.dat"; -- объявление файлового дескриптора, предполагается, что -- связывание между файловым дескриптором и физическим -- файлом будет производиться позже (см. далее) FILE data_file: int_file; -- автоматическое открытие файла в режиме чтения FILE stimulus: int_file IS "vector.dat"; -- пользовательский тип данных TYPE states IS (IDLE, ERROR, SLEEP, RUNNING); TYPE states_file IS FILE OF states; -- *nix ОС хост система. Если файл не существует, то он -- будет создан (если это возможно) FILE states_log: states_file OPEN WRITE_MODE IS "/home/user/project/logs/states.log";
  • 7. Работа с файлом. Чтение/Запись  При открытии файла работа с ним выполняется последовательно, начиная с первого элемента  Для чтения данных из файла используется процедура READ  Для записи данных в файл используется процедура WRITE  Для определения конца файла используется функция ENDFILE  В языке VHDL определены процедуры чтения и записи только для предопределенных типов данных • для пользовательских типов данных необходимо писать собственные процедуры, основанные на базовых PROCEDURE READ(FILE f: FILE_TYPE; value: OUT type); PROCEDURE READ(FILE f: FILE_TYPE; value: OUT type; length: OUT: NATURAL); PROCEDURE WRITE(FILE f: FILE_TYPE; value: IN type); FUNCTION ENDFILE(FILE f: FILE_TYPE) RETURN BOOLEAN;
  • 8. Пример чтения из файла GENERIC(load_file_name: STRING := "/tmp/rom.dat"); ... behavior: PROCESS IS SUBTYPE word IS STD_ULOGIC_VECTOR(0 to DATA_WIDTH - 1); TYPE storage_array IS ARRAY (NATURAL RANGE <>) OF word; VARIABLE storage: storage_array(0 TO 2**ADDRESS_WIDTH – 1); VARIABLE index: NATURAL; TYPE load_file_type IS FILE OF word; FILE load_file: load_file_type OPEN READ_MODE IS load_file_name; begin -- инициализируем ROM содержимым из файла load_file_name index := 0; WHILE NOT ENDFILE(load_file) LOOP read(load_file, storage(index)); index := index + 1; END LOOP; -- работа с ROM ... END PROCESS behavior; ... word_0 word_1 word_2 ... word_n storage 2**ADDRESS_WIDTH
  • 9. Пример чтения из файла TYPE integer_vector IS ARRAY (INTEGER RANGE < >) OF INTEGER; IMPURE FUNCTION read_array (file_name: STRING; array_length: NATURAL) RETURN integer_vector IS TYPE integer_file IS FILE OF INTEGER; FILE data_file: integer_file OPEN READ_MODE IS file_name; VARIABLE result: integer_vector(1 TO array_length) := (OTHERS => 0); VARIABLE index: integer := 1; BEGIN WHILE NOT ENDFILE(data_file) AND index <= array_length LOOP READ(data_file, result(index)); index := index + 1; END LOOP; RETURN result; END FUNCTION read_array; -- инициализация константы списка коэффициентов CONSTANT coeffs : integer_vector := read_array("coeff.dat", 16);
  • 10. PROCESS IS CONSTANT MAX_COUNT: NATURAL := 5; VARIABLE count: INTEGER := 1000; TYPE int_file IS FILE OF INTEGER; FILE data: int_file OPEN WRITE_MODE IS "file_demo.dat"; BEGIN FOR i IN 1 TO MAX_COUNT LOOP IF i >= MAX_COUNT THEN EXIT; END IF; WRITE(data, count); count := count + 1; END LOOP; WAIT; END PROCESS; Пример записи в файл View in HEX 100010 0x000003e8 4 + 4 + 4 + 4 = 16 байт 100110 0x000003e9 100210 0x000003ea 100310 0x000003eb
  • 11. Открытие и закрытие файлов явным образом  Допустима декларация файлового дескриптора (объекта) без явного связывания его с физическим файлом FILE lut_file, result_file: int_file;  Для открытия/закрытия файловых объектов (заданных в таком стиле) используются процедуры FILE_OPEN() и FILE_CLOSE(): TYPE file_type IS FILE OF element_type; TYPE FILE_OPEN_STATUS IS (OPEN_OK, STATUS_ERROR, NAME_ERROR, MODE_ERROR); PROCEDURE FILE_OPEN(status: OUT FILE_OPEN_STATUS; FILE f: file_type; external_name: IN STRING; open_kind: IN FILE_OPEN_KIND := READ_MODE); PROCEDURE FILE_CLOSE(FILE f: file_type); OPEN_OK –успешноеоткрытиефайла STATUS_ERROR –файловыйобъектоткрытисвязанужесдругимфизическимобъектом NAME_ERROR -причтении:файластакимименемнесуществует;призаписиили добавлении:файлстакимименемнесуществуетинеможетбытьсоздан MODE_ERROR –файлсуществует,нонеможетбытьоткрытвуказываемомрежиме
  • 12. Открытие и закрытие файлов явным образом PROCESS IS CONSTANT MAX_COUNT: NATURAL := 10; VARIABLE count: INTEGER := 0; TYPE int_file IS FILE OF INTEGER; FILE data: int_file; VARIABLE f_status: FILE_OPEN_STATUS; BEGIN FILE_OPEN(f_stat, data, "file.dat", WRITE_MODE); REPORT "Got status: "&FILE_OPEN_STATUS'image(f_stat); IF f_stat = OPEN_OK THEN FOR i IN 1 TO MAX_COUNT LOOP IF i >= MAX_COUNT THEN EXIT; END IF; WRITE(data, count); count := count + 2; END LOOP; FILE_CLOSE(data); END IF; WAIT; END PROCESS;
  • 13. Пакет TEXTIO. Предпосылки  Рассматриваемые ранее (выше) типы файлов хранят данные в некотором двоичном представлении • формат определяется хостовой ОС, а также системой моделирования (симулятором)  Возникает проблема переносимости файлов между разными ОС и системами моделирования  Формирование файлов с наборами тестовых воздействий, а также чтение результатов моделирования требует дополнительных усилий, с учетом особенностей хранения двоичных данных • невозможно представить входные/выходные файлы в «читабельной» (для человека) форме Нельзя просто так взять и просмотреть двоичный файл
  • 14. Пакет TEXTIO  Предопределенный пакет TEXTIO библиотеки STD предлагает ряд «полезных» типов данных и операций для чтения/записи текстовых файлов, т.е. файлов, в которых данные представлены в текстовом виде: • стандартные файловые типы • процедуры для чтения и записи текстового представления предопределенных типов данных языка VHDL  Читаемые и записываемые текстовые файлы являются ASCII- файлами  Пакет TEXTIO поддерживается всеми симуляторами  При использовании пакета TEXTIO требуется явное его включение в проект: USE std.textio.ALL;
  • 15. Пакет TEXTIO. Составляющие  Операции ввода/вывода, используемые пакетом TEXTIO основаны на динамических строках, доступ к которым осуществляется через указатели  Тип TEXT является файловым типом, представляющим файл из текстовых строк (ASCII-символов) переменной длины  Процедуры чтения/записи файла TYPE LINE IS ACCESS STRING; -- указатель на строку TYPE TEXT IS FILE OF STRING; PROCEDURE READLINE(FILE F: TEXT; L: OUT LINE); PROCEDURE READ(L: INOUT LINE; value: OUT BIT); PROCEDURE WRITE(L: INOUT LINE; value: OUT BIT); PROCEDURE WRITELINE(FILE F: TEXT; L: INOUT LINE);
  • 16. Пакет TEXTIO  Тип LINE выступает в роли «буфера» для операций чтения и записи: • READ()и WRITE()- получают доступ и работают с этим «буфером» • READLINE()и WRITELINE()- перемещают содержимое этого «буфера» в/из файл(а)  Чтение из файла: 1. READLINE()читает целую строку из входного файла, создает строковый объект в памяти и возвращает на него указатель 2. READ()извлекает из строки значения разных типов (BOOLEAN, BIT, BIT_VECTOR, INTEGER, REAL, TIME, CHARACTER, STRING)  Запись в файл: 1. WRITE()преобразует данные в строковое отображение и возвращает указатель на полученный объект строкового типа 2. WRITELINE()передает указатель на созданный в памяти строковый объект (если значение указателя NULL, тогда в выходной файл записывается пустая строка)
  • 17. В пакете TEXTIO процедура WRITE()перегружена для типов STRING и BIT_VECTOR , поэтому необходимо явно указывать тип передаваемого параметра: WRITE(L, STRING'("hello")); WRITE(L, BIT_VECTOR'("010111")); Пакет TEXTIO PROCESS IS VARIABLE count: INTEGER := 0; VARIABLE buf_in, buf_out: LINE; FILE infile, outfile: TEXT; BEGIN FILE_OPEN(f_stat, outfile, "myfile1.txt", WRITE_MODE); FILE_OPEN(f_stat, infile, "myfile2.txt", READ_MODE); READLINE(infile, buf_in); READ(buf_in, count); count := count + 1; WRITE(buf_out, STRING'("New count value is: ")); WRITE(buf_out, count); WRITELINE(outfile, buf); FILE_CLOSE(infile); FILE_CLOSE(outfile); WAIT; END PROCESS;
  • 18. TEXTIO: INPUT и OUTPUT  В пакете TEXTIO предопределены два файловых дескриптора: • INPUT • OUTPUT  Дескрипторы соответствуют стандартному вводу STD_INPUT и стандартному выводу STD_OUTPUT хостовой ОС (клавиатура и консоль VHDL симулятора соответсвенно) FILE INPUT: TEXT OPEN READ_MODE IS "STD_INPUT"; FILE OUTPUT: TEXT OPEN WRITE_MODE IS "STD_OUTPUT"
  • 19. TEXTIO: INPUT и OUTPUT PROCESS IS FILE thefile: TEXT; VARIABLE buf_out, buf_in: LINE; VARIABLE fname: STRING(1 TO 10); VARIABLE f_status: FILE_OPEN_STATUS; BEGIN WRITE(buf_out, STRING'("Enter file name:")); -- OUTPUT – файловый дескриптор стандартного вывода WRITELINE(OUTPUT, buf_out); -- INPUT – файловый дескриптор стандартного ввода READLINE(INPUT, buf_in); READ(buf_in, fname); FILE_OPEN(f_status, thefile, fname, READ_MODE); READLINE(thefile, buf_in); WRITELINE(OUTPUT, buf_in); WAIT; END PROCESS;