
- •Тема: vhdl проектирование криптографических процессоров с использованием файлового ввода/вывода
- •Вводные замечания
- •2. Практическая организация чтение текстовых данных из файла ос.
- •2.1 Проект Варианта 0
- •1.2 Проект Варианта 2
- •3. Практическая организация записи текстовых данных в файл ос.
- •4. Практическая организация добавления текстовых данных в файл ос.
- •Временная диаграмма работы Проекта write2_file , реализующего процедуру добавления данных в файл показана на Рис.4.2
- •5. ПримерVhdl проекта оперирующего с файлами ос
- •6. Приложение №1: Процедуры пакета textio обеспечивающих запись/чтение стандартных типов данных
- •7. Приложение №2: Общая структурная схема процесса записи/чтения файловых данных Процедура чтения/записи файлов (текстовые файлы)
Временная диаграмма работы Проекта write2_file , реализующего процедуру добавления данных в файл показана на Рис.4.2
Waveform Editor2
Рис. 4.2 Временная диаграмма работы проекта WRITE2_file.
Содержимое файла ОС D:\my_designs_ahdl\FILE_APPEND\ f2_wr.dat, после выполнения нескольких добавлений данных в файл ОС, показано на Рис.4.2.
paredigman
paredigman
paredigman
paredigman
Рис. 4.2. Содержимое файла f2_wr.dat после того, как в него будет добавлена новая информация.
5. ПримерVhdl проекта оперирующего с файлами ос
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
library STD;
use STD.textio.all;
use work.converters.all;
entity mem2 is
port(
clk : in STD_LOGIC;
r : in STD_LOGIC;
w : in STD_LOGIC;
addr : in natural;
datai : in STD_LOGIC_VECTOR(7 downto 0);
load_mem : in STD_LOGIC;
store_mem : in STD_LOGIC;
datao : out STD_LOGIC_VECTOR(7 downto 0)
);
end mem2;
architecture mem2_a of mem2 is
type mem_array is array(0 to 3) of STD_LOGIC_VECTOR(7 downto 0);
signal mem_arr : mem_array;
begin
mem_from_file : process(clk) – чтение текст.данных из файла и конвертир.
file vectors_kont_r : text open READ_MODE is "C:\Program Files\Aldec\shem_mem1\src\load6.txt";
variable buf_prog_r : string(1 to 4);
variable control_read : natural;
begin
if clk'event and clk = '1' and load_mem = '1' and r ='0' then
FILE_OPEN( vectors_kont_r, "C:\Program Files\Aldec\shem_mem1\src\load6.txt", READ_MODE);
READ(vectors_kont_r, buf_prog_r, control_read);
for i in 0 to 3 loop
mem_arr(i) <= conv8(character'POS(buf_prog_r(i+1)));
end loop;
else
if clk'event and clk ='1' and load_mem = '0' and r ='0' then
mem_arr(addr) <= datai;
end if;
end if;
FILE_CLOSE(vectors_kont_r);
end process mem_from_file_or_bus;
char_file_load5 : process(w) – запись текст. Данных в файл с предварит. Конвертир.
file vectors_kont_w :TEXT open WRITE_MODE is "C:\Program Files\Aldec\shem_mem2\src\load5.dat";
variable buf_prog_w : string (1 to 4);
begin
FILE_OPEN( vectors_kont_w, "C:\Program Files\Aldec\shem_mem2\src\load5.dat", WRITE_MODE);
if w'event and w = '1' then
for i in 0 to 3 loop
buf_prog_w(i+1) := conv(mem_arr(i)); --конверт.
end loop;
WRITE(vectors_kont_w, buf_prog_w);
end if;
FILE_CLOSE(vectors_kont_w);
end process int_picture_mem_file_load5;
read_mem : process( clk) –пересылка данных из массива на выход. порт
begin
if r = '0' and clk'event then
datao <= "ZZZZZZZZ";
end if;
if r = '1' and clk'event then
datao <= mem_arr(addr);
end if;
end process read_mem;
end mem2_a;
Временная диаграмма работы проекта показана на Рис.5.1
Рис.5.1
6. Приложение №1: Процедуры пакета textio обеспечивающих запись/чтение стандартных типов данных
---------------------------------------------------------------------------
-- Package TEXTIO as defined in Chapter 14 of the IEEE Standard VHDL
-- Language Reference Manual (IEEE Std. 1076-1987), as modified
-- by the Issues Screening and Analysis Committee (ISAC), a subcommittee
-- of the VHDL Analysis and Standardization Group (VASG) on
-- 10 November, 1988. See "The Sense of the VASG", October, 1989.
---------------------------------------------------------------------------
-- Version information: %W% %G%
---------------------------------------------------------------------------
-- Пакет TEXTIO содержит описание типов и подпрограмм, обеспечивающих –
-- форматированные операции ввода-вывода (чтения-записи) с символами ASCII.
----------------------------------------------------------------------------------
package TEXTIO is
type LINE is access string; -- LINE является указателем значения типа SRING
type TEXT is file of string;-- Файл из ASCII записей переменной длины
type SIDE is (right, left); -- Для выравнивания записей полей записи/чтения
subtype WIDTH is natural; -- Для задания ширины полей записей
-- Стандартные текстовые файлы
-- changed for vhdl92 syntax:
----------------------------------------------------------------------------------
file input : TEXT open read_mode is "STD_INPUT";
file output : TEXT open write_mode is "STD_OUTPUT";
-- Процедуры чтения данных из файла для стандартных типов данных
--changed for vhdl92 syntax (and now a built-in):
---------------------------------------------------------------------------------
procedure READLINE(file f: TEXT; L: out LINE); --возвращает указатель на строку
procedure READ(L:inout LINE; VALUE: out bit; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out bit);
procedure READ(L:inout LINE; VALUE: out bit_vector; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out bit_vector);
procedure READ(L:inout LINE; VALUE: out BOOLEAN; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out character; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out character);
procedure READ(L:inout LINE; VALUE: out integer; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out integer);
procedure READ(L:inout LINE; VALUE: out real; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out real);
procedure READ(L:inout LINE; VALUE: out string; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out string);
procedure READ(L:inout LINE; VALUE: out time; GOOD : out BOOLEAN);
procedure READ(L:inout LINE; VALUE: out time);
--------------------------------------------------------------------------
-- Процедуры записи данных в файл для стандартных типов данных
-- changed for vhdl92 syntax (and now a built-in):
---------------------------------------------------------------------------
procedure WRITELINE(file f : TEXT; L : inout LINE); --возвращает указатель на строку
procedure WRITE(L : inout LINE; VALUE : in bit;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in bit_vector;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in BOOLEAN;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in character;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in integer;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in real;
JUSTIFIED: in SIDE := right; -- по умолчанию прижатие числа вправо
FIELD: in WIDTH := 0; -- ширина поля выделяемого под число
DIGITS: in NATURAL := 0); -- число позиций после десятичной точки. При
--значении DIGITS=0 число записывается в
--экспоненциальной форме. При этом каждое
--число занимает 13 позиций.
procedure WRITE(L : inout LINE; VALUE : in string;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0);
procedure WRITE(L : inout LINE; VALUE : in time;
JUSTIFIED: in SIDE := right;
FIELD: in WIDTH := 0;
UNIT: in TIME := ns);
-- Процедуры обработки позиции маркера в файле
-- is implicit built-in:
----------------------------------------------------------------------------------
function ENDFILE(file F : TEXT) return boolean;
function ENDLINE(variable L : in LINE) return BOOLEAN;
-- Function ENDLINE as declared cannot be legal VHDL, and
-- the entire function was deleted from the definition
-- by the Issues Screening and Analysis Committee (ISAC),
-- a subcommittee of the VHDL Analysis and Standardization
-- Group (VASG) on 10 November, 1988. See "The Sense of
-- the VASG", October, 1989, VHDL Issue Number 0032.
end;
Внимание!!!! Все эти подпрограммы-процедуры Write( )/Read() (за исключением оперирующих с типом string) осуществляют запись/чтение поэлементно. Поэтому для записи/чтения в/из файл/(а) массива они должны располагаться в теле цикла. Кроме того, для своей работы они требуют наличия указателя на строку файла. Указатель на строку генерируется подпрограммами процедурами procedure WRITELINE(file f : TEXT; L : inout LINE); и procedure READLINE(file f: TEXT; L: out LINE);. Следовательно, подпрограммы-процедуры Write( )/Read() должны использоваться в паре с подпрограммами процедурами WRITELINE( ) / READLINE( ). !!!!!
Примечание: Библиотека IEEE также содержит в своем составе пакет STD_LOGIC_TEXIO. В этом пакете объявлены и определены процедуры чтения/записи данных типов std_ulogic_vector, std_logic_vector для разных систем счисления.
Проиллюстрируем примерами методологию применения процедур чтения/записи стандартных типов данных, определенных в пакете TEXTIO библиотеки STD.
Пример 1. Запись данных типа символьный string в файл ОС.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity wr1_lin is
port(
clk : in STD_LOGIC
);
end wr1_lin;
architecture wr1_lin_ar of wr1_lin is
signal massiv20 : string( 1 to 20) := "paredigman is gut!!!";
begin
process(clk)
variable write_vec : string( 1 to 20); --объявлен. Программного буфера
variable LA2 : LINE ; --объявл. Указателя на строку
variable virav : SIDE ; -- прижатие строки вправо
variable pole : WIDTH :=30; -- ширина поля выделяемого под строку (30 поз.)
file vect_wr : TEXT open WRITE_MODE is "C:\Program -- объявл. Контейнера
Files\Aldec\Wr_line1\src\TextFile2.txt";
begin
if clk'event and clk ='1' then –выявление переднего фронта clk
write_vec := massiv20; --запись данных в программный буфер
FILE_OPEN(vect_wr, "C:\Program Files\Aldec\Wr_line1\src\TextFile2.txt"
, WRITE_MODE);
WRITELINE( vect_wr, LA2);-- возвращает (генерир.) значен. Указат. LA2
WRITE(LA2, write_vec, virav, pole); -- запись данных в файл
end if;
FILE_CLOSE( vect_wr);
end process;
end wr1_lin_ar;
Пример 2. Запись данных типа integer в файл ОС.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity Wr_L_int is
port(
clk : in STD_LOGIC );
end Wr_L_int;
architecture Wr_L_int_ar of Wr_L_int is
Type mas_int is array (0 to 7) of integer;
signal mas_int_sig : mas_int := (25, 38, 456, 987, 12, 3456, 48, 50);
begin
process(clk)
variable write_el : integer range 0 to 5000; --Объявление скалярного буфера
variable LA1 : LINE ; -- объявл. Указателя на строку
variable virav : SIDE ; --прижатие строки вправо по умолчанию
variable pole : WIDTH :=7; -- ширина поля выделяемого под число (7 позиц.)
file mas_wr_int : TEXT open WRITE_MODE is "C:\Program
Files\Aldec\Wr_line_Int\src\TextFile2.txt";
begin
if clk'event and clk ='1' then
FILE_OPEN(mas_wr_int, "C:\Program
Files\Aldec\Wr_line_Int\src\TextFile2.txt" , WRITE_MODE);
WRITELINE( mas_wr_int, LA1); -- В этом варианте числа в файле
--расположатся в строку
for i in 0 to 7 loop
write_el := mas_int_sig (i);
WRITELINE( vect_wr_int, LA1); -- В этом варианте числа в
--файле расположатся в столбец
WRITE(LA1, write_el, virav, pole);
end loop;
end if;
FILE_CLOSE( mas_wr_int);
end process;
end Wr_L_int_ar;
Пример 3. Чтение данных типа integer из файла ОС.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity Rd_ln_int is
port( clk : in STD_LOGIC );
end Rd_ln_int;
architecture Rd_ln_int_ar of Rd_ln_int is
Type mas_int is array (0 to 7) of integer;
signal mas_int_sig : mas_int;
begin
process(clk)
variable rd_el : integer range 0 to 5000;
variable LA1 : LINE ;
file mas_rd_int : TEXT open READ_MODE is "C:\Program Files\Aldec\Rd_line_Int\src\TextFile3.txt";
begin
if clk'event and clk ='1' then
FILE_OPEN(mas_rd_int, "C:\Program
Files\Aldec\Rd_line_Int\src\TextFile3.txt" , READ_MODE);
--READLINE( mas_rd_int, LA1); -- В этом варианте числа в файле
--должны быть расположены в строку
for i in 0 to 7 loop
READLINE( mas_rd_int, LA1); --В этом варианте числа в файле
--должны быть расположены в столбец
READ(LA1, rd_el); --поэлементное чтение данных из файла
mas_int_sig (i) <= rd_el;--запись прочитанного элем. В массив
end loop;
end if;
FILE_CLOSE( mas_rd_int);
end process;
end Rd_ln_int_ar;
Пример 4. Запись данных типа Real в файл ОС.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use STD.TEXTIO.all;
entity wr_ln_real is
port( clk : in STD_LOGIC );
end wr_ln_real;
architecture wr_ln_real_ar of wr_ln_real is
Type mas_int is array (0 to 7) of real;
signal mas_real_sig : mas_int := (2.55, 38.567, 456.98, 987.05, 12.3, 3456.99,
48.4, 50.0);
begin
process(clk)
variable write_el_real : real range 0.0 to 5000.0; --программный буфер
variable Ptr : LINE ; --указатель на строку
variable ravnen : SIDE ;
variable pole : WIDTH :=9;
variable gigit : NATURAL :=4; --числа в файл записыв в нормальной форме
--variable gigit : NATURAL :=0; --числа в файл записыв в експоненциал
--форме
file Kont_mas_wr_REAL : TEXT open WRITE_MODE is "C:\Program Files\Aldec\Wr_line_Real\src\TextFile2.txt"; --контейнер
begin
if clk'event and clk ='1' then
FILE_OPEN(Kont_mas_wr_REAL, "C:\Program Files\Aldec\Wr_line_Real\src\TextFile2.txt" , WRITE_MODE);
WRITELINE(Kont_mas_wr_REAL, Ptr); -- В этом вар. числа в файле
--распложаться в строку
for i in 0 to 7 loop
write_el_real := mas_real_sig (i);
WRITELINE( Kont_mas_wr_REAL, Ptr); -- В этом варианте числа
--в файле распложаться в столбец
WRITE(Ptr, write_el_real, ravnen, pole, gigit);
end loop;
end if;
FILE_CLOSE(Kont_mas_wr_REAL);
end process;
end wr_ln_real_ar;
При variable gigit : NATURAL :=4; и variable pole : WIDTH :=9 -- числа в файл записываются в нормальной форме:
2.5500 38.5670 456.9800 987.0500 12.30003456.9900 48.4000 50.0000
При variable gigit : NATURAL :=0; и variable pole : WIDTH :=9 - числа в файл записываются в экспоненциальной форме, каждое число занимает 13 позиций:
2.550000e+0003.856700e+0014.569800e+0029.870500e+0021.230000e+0013.456990e+0034.840000e+0015.000000e+001
При variable gigit : NATURAL :=0; и variable pole : WIDTH :=15 - числа в файл записываются в экспоненциальной форме, каждое занимает 13 позиций, под каждое число (в примере) отводится 15 позиций:
2.550000e+000 3.856700e+001 4.569800e+002 9.870500e+002 1.230000e+001 3.456990e+003 4.840000e+001 5.000000e+001
Примечание: Дополнительные сведения о методологии создания проектов криптографических процессоров оперирующих с файлами ОС можно получить из материалов приведенных в Л.Р.№5