VHDL Textio—从另一个进程正在写入的文本文件中读取行

VHDL Textio—从另一个进程正在写入的文本文件中读取行,text,vhdl,read-write,Text,Vhdl,Read Write,我正试图在我的测试台上编写一个数据包生成器。在整个测试过程中,我必须写入一个文件并从中读取。似乎当我从文件中读取一行后关闭文件时,指针会返回到第一行。所以我不知道如何逐行读取文件,并在每次读取之间关闭它。我需要以某种方式保留指针的值,即使在文件关闭后,或者在每次读取后删除该行,以便下次打开文件进行读取时,将读取第二行。读请求和写请求是独立的,并且它们不同步,因此读取过程可能会到达文件的末尾,并且在写入新行之前需要等待。写入进程处于附加模式。 有关代码的详细信息: svc0应每3个时钟周期写入一次

我正试图在我的测试台上编写一个数据包生成器。在整个测试过程中,我必须写入一个文件并从中读取。似乎当我从文件中读取一行后关闭文件时,指针会返回到第一行。所以我不知道如何逐行读取文件,并在每次读取之间关闭它。我需要以某种方式保留指针的值,即使在文件关闭后,或者在每次读取后删除该行,以便下次打开文件进行读取时,将读取第二行。读请求和写请求是独立的,并且它们不同步,因此读取过程可能会到达文件的末尾,并且在写入新行之前需要等待。写入进程处于附加模式。 有关代码的详细信息: 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;
IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
使用std.textio.all;
使用ieee.std_logic_textio.all;
图书馆工作;
使用work.txt_util.all;
使用work.testutil.all;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
实体主控是
通用(
SVC0_用法:整数:=3;
SVC1_用法:整数:=12
);
港口(
clk:标准逻辑中;
rst_n:标准逻辑中;
en:在标准逻辑中;——;
下一个数据包:在标准逻辑向量中(1到0);
时钟戳0:输出标准逻辑向量(31向下至0);
时钟戳1:输出标准逻辑向量(31向下至0);
svc_读取:输出标准逻辑_向量(1到0)
);
终端实体;
--------------------------------------------------------------------------------
master的体系结构rtl是
--百分比
类型svc_percent_数组是整数的数组(1到0);
信号svc_百分比:svc_百分比数组;
--档案
文件生成_svc0:文本;
文件生成_svc1:文本;
--计时钟
信号时钟计数:整数范围0至2000;
信号计数:标准逻辑向量(31到0);
---读写
信号svc_就绪:标准逻辑_向量(1到0);
开始
---------------------------------
---时钟计数器-----------------
---------------------------------
过程(时钟、时钟计数)
变量clk_count_v:0到2000的整数范围;
开始
如果(上升沿(clk)),则
如果rst_n='0',则
时钟计数=0;
其他的
时钟计数(v):=时钟计数(c+1);;
如果结束;
如果结束;
clk_count_c如中所述,VHDL有优点和缺点。在我看来,文件I/O不是它的优势之一。你可以阅读,也可以写作,但做任何有点复杂的事情都会很快变得笨拙

你没有给出一个确切的理由来解释为什么你需要文件。正如Kevin在中所建议的,您最好在不同操作之间交换数据,而不必接触文件。例如,您可以使用FIFO、链表或其他类似内存。如果您需要记录到文件,可以在数据被推入或移出内存元素时写入文件


不理解你的全部问题,你也可以考虑生成一个数据包,由你的测试平台外部的测试平台读取,其中一个工具更适合这个任务,例如Python或Perl。< /P>看到一些可能的提示问题。可能的重复:而不是通过文件I/O来努力工作,把你的数据包表示成存储在链表中的记录。您可以通过受保护的类型干净地访问它,而无需涉及底层操作系统。它将消除通过字符串表示的往返,并使您不必解析任何文本。