File VHDL文件\u OPEN未返回正确的状态

File VHDL文件\u OPEN未返回正确的状态,file,io,vhdl,intel-fpga,quartus,File,Io,Vhdl,Intel Fpga,Quartus,我有一个VHDL程序,它从文件中读取一行,并根据行的各个字符分配信号值。我面临的问题是,我的FILE_OPEN语句似乎不起作用 FILE_OPEN(fstatus, mem_file, "H:\memfile.dat", READ_MODE); 如果未初始化,fstatus始终具有OPEN_OK,或者其初始化为的值从未更改。下面给出了该程序的完整代码 library IEEE; use IEEE.STD_LOGIC_1164.all; use STD.TEXTIO.all; use IEEE

我有一个VHDL程序,它从文件中读取一行,并根据行的各个字符分配信号值。我面临的问题是,我的FILE_OPEN语句似乎不起作用

FILE_OPEN(fstatus, mem_file, "H:\memfile.dat", READ_MODE);
如果未初始化,fstatus始终具有OPEN_OK,或者其初始化为的值从未更改。下面给出了该程序的完整代码

library IEEE; 
use IEEE.STD_LOGIC_1164.all; use STD.TEXTIO.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use IEEE.NUMERIC_STD.all;
--use ieee.std_logic_1164_additions.all
entity imem is -- instruction memory
 port(a:  in  STD_LOGIC_VECTOR(5 downto 0);
      rd: out STD_LOGIC_VECTOR(31 downto 0));
 end;
architecture behave of imem is
begin
 process is
   file mem_file: TEXT;
   variable L, my_line: line;
   variable L_ch : string(1 to 8);
   variable ch, charac: character;
   variable i, index, result: integer;
   variable valid : boolean; -- to record whether a read is successful or not
   variable fstatus: FILE_OPEN_STATUS;
   type ramtype is array (63 downto 0) of STD_LOGIC_VECTOR(31 downto 0);
   variable mem: ramtype;
begin
  -- initialize memory from file
for i in 0 to 63 loop -- set all contents low
  mem(i) := (others => '0'); 
end loop;
index := 0; 
 --fstatus := NAME_ERROR;
FILE_OPEN(fstatus, mem_file, "H:\memfile.dat", READ_MODE);
 report "Got status from file: '" & FILE_OPEN_STATUS'image(fstatus) & "'";

 IF fstatus = OPEN_OK THEN

while not endfile(mem_file) loop


  readline(mem_file, L);
    report "Got line from file: '" & L.all & "'";
    result := 0;    
  for i in 1 to 8 loop
    read(L, ch, valid);
      --write(my_line, string'(L_ch));    -- formatting
      --writeline(output, my_line);

      if (L'length = 0) then report "line empty " & integer'image(index)
            severity error;
      end if;


      --ch := L_ch(i);
      read(L, charac);

    if '0' <= ch and ch <= '9' then 
        result := character'pos(ch) - character'pos('0');
    elsif 'a' <= ch and ch <= 'f' then
       result := character'pos(ch) - character'pos('a')+10;
    else report "Format error on line " & integer'image(index) & character'image(ch) & character'image(charac) & boolean'image(valid) --& to_string(L_ch)
         severity error;
    end if;
    mem(index)(35-i*4 downto 32-i*4) :=std_logic_vector(to_unsigned(result,4));
  end loop;
  index := index + 1;
end loop;



-- read memory
loop
  rd <= mem(to_integer(unsigned(a)));
  wait on a;
end loop;
 file_close(mem_file);
 end if;
 wait;
 end process;
end;
IEEE库;
使用IEEE.STD_LOGIC_1164.all;使用STD.TEXTIO.all;
使用IEEE.STD_LOGIC_UNSIGNED.all;
使用IEEE.NUMERIC_STD.all;
--使用ieee.std_logic_1164_additions.all
实体imem是——指令内存
端口(a:标准逻辑向量(5到0);
rd:out标准逻辑向量(31到0);
结束;
imem的体系结构是
开始
过程是
文件mem_文件:文本;
变量L,my_line:line;
变量L_ch:字符串(1到8);
变量ch,charac:字符;
变量i,索引,结果:整数;
变量有效:布尔;--记录读取是否成功
变量fstatus:文件\打开\状态;
ramtype类型是STD_逻辑_向量(31向下到0)的数组(63向下到0);
变量mem:ramtype;
开始
--从文件初始化内存
对于0到63循环中的i——将所有内容设置为低
成员(i):=(其他=>“0”);
端环;
指数:=0;
--fstatus:=名称\u错误;
文件打开(fstatus,mem文件,“H:\memfile.dat”,读取模式);
报告“从文件获取状态:”&文件“打开状态”图像(fstatus)和“”;
如果fstatus=OPEN\u正常,则
而不是endfile(mem_文件)循环
读线(mem_文件,L);
报告“从文件中获取行:”&L.all&“”;
结果:=0;
对于1到8循环中的i
读取(L、ch、有效);
--写(我的行,字符串)(L_ch));--格式化
--writeline(输出,my_行);
如果(L'length=0),则报告“行空”和“整型”图像(索引)
严重错误;
如果结束;
--ch:=L_ch(i);
读(L,charac);

如果“0”Altera的Quartus不支持合成中的VHDL文件I/O功能。据我所知,Quartus在合成中确实支持Verilog文件I/O功能


有关合成时用于读取*.mif文件以初始化RAM的Verilog文件I/O的更多详细信息,请参阅(搜索(
$readmemh(…)
)实现。

Altera的Quartus不支持合成中的VHDL文件I/O功能。据我所知,Quartus在合成中确实支持Verilog文件I/O功能

有关在合成以初始化RAM时用于读取*.mif文件的Verilog文件I/O的更多详细信息,请参阅(搜索(
$readmemh(…)
)实现