VHDL-Textio — чтение строк из текстового файла, который записывается другим процессом

Я пытаюсь написать генератор пакетов на своем тестовом стенде. Я должен писать в файл и читать из него в течение всего теста. Кажется, что когда я закрываю файл после того, как прочитал из него строку, указатель возвращается к первой строке. Поэтому я не знаю, как читать файл построчно и закрывать его между каждым чтением. Мне нужно как-то сохранить значение указателя даже после закрытия файла или удалить строку после каждого чтения, чтобы при следующем открытии файла для чтения была прочитана вторая строка. Запросы на чтение и запись независимы и не синхронизируются, поэтому процесс чтения может дойти до конца файла и ждать записи новой строки. Процесс записи находится в режиме добавления. Дополнительная информация о коде: 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;

person user2854519    schedule 07.05.2014    source источник
comment
См. вопрос Как читать из определенной строки текстового файла в формате VHDL для некоторых возможных советов.   -  person fru1tbat    schedule 07.05.2014
comment
Возможный дубликат: Чтение и запись в файл одновременно   -  person Chiggs    schedule 07.05.2014
comment
Вместо того, чтобы пытаться заставить эту работу работать через файловый ввод-вывод, рассмотрите возможность представления ваших пакетов в виде записей, хранящихся в связанном списке. Вы можете получить к нему чистый доступ через защищенный тип, не задействуя базовую ОС. Это устранило бы круговое путешествие через строковое представление и избавило бы вас от необходимости анализировать любой текст.   -  person Kevin Thibedeau    schedule 07.05.2014


Ответы (1)


Как упоминалось в этом ответе, VHDL имеет сильные и слабые стороны. На мой взгляд, файловый ввод-вывод не является одной из его сильных сторон. Вы можете читать и писать, но делать что-либо с оттенком сложности может быстро стать неловко.

Вы не указали вескую причину, почему вам вообще нужны файлы. Как предложил Кевин в его комментарий вам, вероятно, будет лучше обмениваться данными между различными операциями, не касаясь файла. Например, вы можете использовать FIFO, связанный список или другую подобную память. Если вам нужно вести журнал в файл, вы можете записывать в файлы по мере того, как данные помещаются в элемент памяти или из него.

Не понимая всей проблемы, вы также можете подумать о создании пакетов для чтения вашим тестовым стендом, внешним по отношению к вашему тестовому стенду, с помощью инструмента, более подходящего для задачи, такого как Python или Perl.

person Josh    schedule 11.02.2015