
- •Тема: vhdl проектирование криптографических процессоров с использованием файлового ввода/вывода
- •Вводные замечания
- •2. Практическая организация чтение текстовых данных из файла ос.
- •2.1 Проект Варианта 0
- •1.2 Проект Варианта 2
- •3. Практическая организация записи текстовых данных в файл ос.
- •4. Практическая организация добавления текстовых данных в файл ос.
- •Временная диаграмма работы Проекта write2_file , реализующего процедуру добавления данных в файл показана на Рис.4.2
- •5. ПримерVhdl проекта оперирующего с файлами ос
- •6. Приложение №1: Процедуры пакета textio обеспечивающих запись/чтение стандартных типов данных
- •7. Приложение №2: Общая структурная схема процесса записи/чтения файловых данных Процедура чтения/записи файлов (текстовые файлы)
3. Практическая организация записи текстовых данных в файл ос.
Общая структура процесса записи текстовых данных в файл ОС может быть проиллюстрирована диаграммой Рис.3.1
Рис.3.1
Проект entity write1_file демонстрирует возможности языка VHDL и САПР Active HDL 5.1 при выполнении операции записи данных в файл. В этом проекте исходные записываемые данные первоначально сохранены в массиве massiv20: string(1 to 20);
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity write1_file_en is
port(
clk : in STD_LOGIC
);
end write1_file_en;
architecture write1_file_ar of write1_file_en is
signal massiv20: string(1 to 20) :="!!!SUN IS SHINING!!!";
begin
process(clk)
variable write_vec: string(1 to 20); --Обьявл. Програм. буфера
file vect_wr: TEXT open WRITE_MODE is -- Объявление контейнера
"D:\my_designs_ahdl\Write_file\TextFile2.txt";
begin
if clk'event and clk='1' then
write_vec:=massiv20; --перезапись данных в прогр. буфер
FILE_OPEN(vect_wr,"D:\my_designs_ahdl\Write_file\TextFile2.txt",
WRITE_MODE); --открытие файла
WRITE(vect_wr, write_vec); -- запись данных
end if;
FILE_CLOSE(vect_wr); -- закрытие контейнера
end process;
end write1_file_ar;
Пояснения к отдельным строкам и переменным в описанной программе приведены ниже:
variable write_vec: string(1 to 20); – программный буфер, определяющий объем записываемой в файл информации;
vect_wr – Файловая Переменная (контейнер)
"D:\my_designs_ahdl\Write_file\TextFile2.txt" - полный путь к файлу;
FILE_OPEN() – оператор вызова процедуры открытия файла;
WRITE() - оператор вызова процедуры записи в файл;
FILE_CLOSE() - оператор вызова процедуры закрытия файла.
Важные замечания:
Для записи данных в файл ОС , он предварительно должен быть создан пользователем (нужно создать пустой файл);
При объявлении файловой переменной (контейнера), а также в операторе вызова процедуры FILE_OPEN()очень желательно указывать полный путь к файлу.
Если запись данных производиться не в пустой файл, то старые данные будут уничтожены. Уничтожение старых данных и запись новых данных будет происходить, когда Вы нажмете вкладку с именем файла ОС и подтвердите в появившемся ДО предупреждения кнопкой ОК , что запись новых данных в непустой файл ОС можно произвести
Оператор вызова процедуры WRITE()содержит только два фактических аргумента.
Waveform Editor1
Рис. 3.2 Временная диаграмма работы проекта write1_file.
Результаты работы проекта показаны в файле TextFile2.txt.Содержимое файла TextFile2.txt после того, как в него будет записана новая информация. Показано на Рис.3.3.
µ !!!SUN IS SHINING!!!
Рис.3.3. Содержимое файла TextFile2.txt после записи в него данных
4. Практическая организация добавления текстовых данных в файл ос.
Общий процесс добавления текстовых данных в файл ОС можно проиллюстрировать такой блок-схемой Рис.4.1:
Рис.4.1
Проект entity WRITE2_file демонстрирует возможности языка VHDL и САПР Active HDL 5.1 при выполнении операции добавления данных в файл.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity WRITE2_file is
port(
clk : in STD_LOGIC
);
end WRITE2_file;
architecture WRITE2_file_ar of WRITE2_file is
signal massiv10: string(1 to 10) := "paredigman"; --исходный
--источник данных
begin
process(clk)
variable write_vec: string(1 to 10);
file vect_wr: TEXT open APPEND_MODE is "f2_wr.dat";
begin
if clk'event and clk='1' then
write_vec:=massiv10;
FILE_OPEN(vect_wr,"f2_wr.dat", APPEND_MODE);
WRITE(vect_wr, write_vec);
end if;
FILE_CLOSE(vect_wr);
end process;
end WRITE2_file_ar;
Пояснения к отдельным строкам и переменным в описанной программе приведены ниже:
write_vec –буфер источник данных, подлежащих добавлению в файл (источник данных);
vect_wr –Файловая переменная (контейнер);
"D:\my_designs_ahdl\Write_file\TextFile2.txt" - полный путь к файлу;
Важные замечания:
Очень желательно указывать полный путь к файлу, в который мы желаем добавить информацию.
Однако, чтобы просмотреть изменения (добавления) необходимо переключиться с закладки Waveform Editor на закладку с именем файла ОС и подтвердить кнопкой ОК свое желание внести дополнение. Это подтверждение нужно сделать в запросе, который выдаст Active HDL при выборе закладки с файлом ОС.
Этот проект демонстрирует процедуру работы с файлами ОС, в частности, как добавить в уже существующий (созданный ранее) файл некоторые текстовые данные.
Исходные текстовые данные (символьная строка) хранятся в одномерном массиве massiv10 , имеющий тип string. Символьная строка содержит 10 символов, поэтому массив massiv10 объявлен типом string(1 to 10), т. е. помещающий в себя 10 элементов.
Массив massiv10 объявлен программным типом signal в разделе объявлений тела архитектуры. Такое объявление сделает сигнал видимым в любом месте тела архитектуры, включая и тело оператора process().
Для того, чтобы реализовать процедуру добавления данных в файл ОС в разделе объявлений оператора process() объявлена типом string(1 to 10) дополнительная буферная переменная write_vec , в которую сначала переписываем данные, хранящиеся в массиве massiv10. В разделе объявлений оператора process() содержится объявление специальной переменной с именем vect_wr . Эта переменная является переменной файлового типа (или контейнером). Обратите внимание, что перед именем этой переменной стоит ключевое слово file. Эта переменная имеет тип TEXT. Под термином «переменная файлового» типа следует понимать:
Что эта переменная жестко связывается с файлом ОС (в нашем примере этот файл имеет имя f2_wr.dat) и является специальным контейнером, куда предварительно помещаются данные перед реальной операцией их записи в физический файл.
Эта переменная непосредственно участвует в процессах получения доступа к физическому файлу.
Обратите внимание, что после ключевого слова TEXT имеется дополнительная запись вида:
open APPEND_MODE is f2_wr.dat.
Эта дополнительная запись означает, что файловая переменная vect_wr получает права доступа к файлу ОС f2_wr.dat. Режим добавления данных (APPEND_MODE) и эти права будут практически реализованы после выполнения дополнительных процедур, связанных с физическим открытием файла ОС и реальной записью в него данных подпрограммой процедурой Write(...);
Процедура физического открытия файла ОС выполняется подпрограммой FILE_OPEN() , описание которой содержится в ядре языка VHDL . Для запуска подпрограммы FILE_OPEN() (она реализована как подпрограмма процедура) нужно в VHDL – проекте предусмотреть оператор вызова этой подпрограммы процедуры. Оператор вызова подпрограммы процедуры FILE_OPEN()представлен в нашем проекте строкой, которая имеет вид :
FILE_OPEN(vect_wr,"f2_wr.dat", APPEND_MODE);
1 2 3
результат работы : сигнал разрешение (ENABLE) для осуществления операции записи.
Он содержит три фактических аргумента:
Первый аргумент vect_wr – это имя переменной Файловой переменной, которая играет роль контейнера, в который помещаются добавляемые данные перед физическим занесением их в файл ОС.
Имя файла ОС, в который мы желаем добавить данные (этот файл должен уже существовать, т. е. он должен уже предварительно быть создан пользователем).
Третий аргумент определяет режим доступа к файлу. Слово APPEND_MODE является зарезервированным идентификатором, описание которого имеется в базовой версии языка VHDL.
Процедура физического добавления (до записи) данных в файл ОС реализуется с помощью подпрограммы процедуры WRITE(). Описание этой подпрограммы имеется в ядре языка VHDL.
Для запуска (вызова) этой подпрограммы в нашем проекте мы должны предусмотреть оператор вызова подпрограммы- процедуры WRITE(…);, которая представлен в нашем проекте строкой, имеющей вид:
перенесение
WRITE(vect_wr, write_vec);
1 2
(Ф.П.- (контейнер)) Программный буфер
результат работы : данные добавленные в файл
Оператор вызова подпрограммы- процедуры WRITE(…);, содержит два аргумента:
Первый аргумент представляет собой файловую переменную (контейнер), куда мы предварительно помещаем данные из программного буфера, Затем данные, которые мы желаем добавить в файл ОС, автоматически переносятся из контейнера в файл ОС.
Второй аргумент фактически является источником тех данных, которые мы желаем добавить в файл.
Примечание:
После вызова описания подпрограммы процедуры WRITE(), она перепишет данные из переменной-источника (программного буфера) в контейнер ( в файловую переменную) и затем автоматически перешлет добавленные данные в файл ОС.
Процедура закрытия файла (снятия разрешения на добавление в него данных) реализуется подпрограммой FILE_CLOSE и соответствующим оператором вызова этой подпрограммы FILE_CLOSE(vect_wr);