Я пытаюсь написать генератор пакетов на своем тестовом стенде. Я должен писать в файл и читать из него в течение всего теста. Кажется, что когда я закрываю файл после того, как прочитал из него строку, указатель возвращается к первой строке. Поэтому я не знаю, как читать файл построчно и закрывать его между каждым чтением. Мне нужно как-то сохранить значение указателя даже после закрытия файла или удалить строку после каждого чтения, чтобы при следующем открытии файла для чтения была прочитана вторая строка. Запросы на чтение и запись независимы и не синхронизируются, поэтому процесс чтения может дойти до конца файла и ждать записи новой строки. Процесс записи находится в режиме добавления. Дополнительная информация о коде: svc0 следует записывать каждый 3-й тактовый цикл, а svc1 каждые 12. В процессе записи, если текущие часы имеют коэффициент 3 или 12, текущие часы будут записываться в соответствующий файл. По запросу (next_packet=1) из каждого файла должна быть прочитана одна строка, а затем файл должен быть закрыт (можно ли как-то избежать этого?) для процесса записи (режим добавления) для доступа к нему, если это необходимо. Код представляет собой два трафика.
Большое тебе спасибо
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use std.textio.all;
use ieee.std_logic_textio.all;
library work;
use work.txt_util.all;
use work.testutil.all;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
entity master is
generic(
SVC0_USAGE : integer := 3;
SVC1_USAGE : integer := 12
);
port(
clk : in std_logic;
rst_n : in std_logic;
en : in std_logic;--;
next_packet : in std_logic_vector(1 downto 0);
Clock_stamp_0: out std_logic_vector(31 downto 0);
Clock_stamp_1: out std_logic_vector(31 downto 0);
svc_read : out std_logic_vector(1 downto 0)
);
end entity;
--------------------------------------------------------------------------------
architecture rtl of master is
--Percentage
type svc_percent_array is array(1 downto 0) of integer;
signal svc_percent : svc_percent_array;
--Files
file generate_svc0 : text;
file generate_svc1 : text;
--Counting clocks
signal clk_count_c :integer range 0 to 2000;
signal count :std_logic_vector(31 downto 0);
--- read and write
signal svc_ready :std_logic_vector(1 downto 0);
begin
---------------------------------
---Clock counter-----------------
---------------------------------
process (clk, clk_count_c)
variable clk_count_v : integer range 0 to 2000;
begin
if (rising_edge(clk)) then
if rst_n='0' then
clk_count_v := 0 ;
else
clk_count_v := clk_count_c+1;
end if;
end if;
clk_count_c <= clk_count_v;
end process;
count <= std_logic_vector(to_unsigned(clk_count_c,32));
svc_percent(0) <= SVC0_USAGE;
svc_percent(1) <= SVC1_USAGE;
----------------------------------
----Write to files-------
----------------------------------
process(clk,count,clk_count_c)
variable v_ILINE_0 : line;
variable v_OLINE_0 : line;
variable v_ILINE_1 : line;
variable v_OLINE_1 : line;
variable v_write_0 :integer range 0 to 2000;
variable v_read_0 :integer range 0 to 2000;
variable v_write_1 :integer range 0 to 2000;
variable v_read_1 :integer range 0 to 2000;
variable Clock_stamp_v_0 :std_logic_vector(31 downto 0);
variable Clock_stamp_v_1 :std_logic_vector(31 downto 0);
begin
file_open(generate_svc0,"svc0_gen",append_mode);
file_open(generate_svc1,"svc1_gen",append_mode);
file_close(generate_svc0);
file_close(generate_svc1);
if (rising_edge(clk)) then
if rst_n='0' then
svc_read <= (others => '0');
else
---------------Writing/reading clock stamps into/from generated log files---------
for svc in 0 to 1 loop
case svc is
when 0 =>
-----Write cycle----------------
if (clk_count_c mod SVC0_USAGE = 0) then
file_open(generate_svc0,"svc0_gen",append_mode);
write(v_OLINE_0, count, right, 32);
writeline(generate_svc0, v_OLINE_0);
file_close(generate_svc0);
end if;
----read cycle-------------------
if ( next_packet(0) = '1' ) then --next_packet IS SENT FROM fsm AND TELLS THE READ_PROCESS TO WAIT OR TO READ
file_open(generate_svc0,"svc0_gen",read_mode);
if not endfile(generate_svc0) then
readline(generate_svc0, v_ILINE_0);
read(v_ILINE_0,Clock_stamp_v_0);
Clock_stamp_0 <= Clock_stamp_v_0;
svc_read(0) <='1';
else
svc_read(0) <='0';
end if;
file_close(generate_svc0);
else
end if;
when 1 =>
-----Write cycle----------------
if (clk_count_c mod SVC0_USAGE = 0) then
file_open(generate_svc1,"svc1_gen",append_mode);
write(v_OLINE_1, count, right, 32);
writeline(generate_svc1, v_OLINE_1);
file_close(generate_svc1);
end if;
----read cycle-------------------
if ( next_packet(1) = '1' ) then
file_open(generate_svc1,"svc1_gen",read_mode);
if not endfile(generate_svc1) then
readline(generate_svc1, v_ILINE_1);
read(v_ILINE_1,Clock_stamp_v_1);
Clock_stamp_1 <= Clock_stamp_v_1;
svc_read(1) <='1';
else
svc_read(1) <='0';
end if;
file_close(generate_svc1);
else
end if;
---------------------------------------------------------------------
when others =>
--
end case;
end loop;
end if; --resst
end if; --rising edge clock
end process;
end architecture;