Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz6_input_output_files.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.69 Mб
Скачать

Временная диаграмма работы Проекта 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]