请帮助我,不要阅读文件"mem.dat"



描述内存 .VHDL

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity Memory is 
    generic(file_name: string:= "MEM.dat");
port (addr: in std_logic_vector(7 downto 0);
        data: out std_logic_vector(7 downto 0);
        rd: in std_logic;
        ld: in std_logic);
end Memory;
architecture Memory of Memory is
type t_rom_data is array (15 downto 0) of std_logic_vector(7 downto 0);
type rom_file_type is file of character;
file rom_file: rom_file_type;
signal rom_data: t_rom_data;
begin   
    process(addr,rd)
    variable i: natural;
    begin
        if rd = '1' then
            i := conv_integer(addr);
            data <= rom_data(i) after 5ns;
        else 
            data <= (others => 'Z');
        end if;
    end process;
    process(ld)
    variable c: character;
    begin
        if ld='1' then  file_open(rom_file,file_name,read_mode);
            for i in 0 to 15 loop
                for b in 7 downto 0 loop
                    c:='U';
                    if not(endfile(rom_file)) then  read(rom_file,c);
                        while not(endfile(rom_file)) and c/='0' and c/='1' and c/='Z' and c/='W'
                        and c/='L' and c/='H' and c/='-' and c/='X' and c/='U' loop
                            read(rom_file,c);
                        end loop;                   
                    end if; 
                    if c='0' then rom_data(i)(b) <= '0';
                    elsif c='1' then rom_data(i)(b) <='1';
                    elsif c='Z' then rom_data(i)(b) <='Z';
                    elsif c='W' then rom_data(i)(b) <='W';
                    elsif c='L' then rom_data(i)(b) <='L';
                    elsif c='H' then rom_data(i)(b) <='H';
                    elsif c='-' then rom_data(i)(b) <='-';
                    elsif c='X' then rom_data(i)(b) <='X';
                    else rom_data(i)(b) <='U';
                    end if;
                end loop;
            end loop;
            file_close(rom_file); 
        end if;`enter code here`
    end process;
end Memory;

错误是:警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][7]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][6]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][5]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不关心)表示净"rom_data[15][4]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不关心)表示净"rom_data[15][3]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][2]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][1]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[15][0]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不关心)表示净"rom_data[14][7]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不关心)表示净"rom_data[14][6]"警告 (10873):在 MEMORY.vhd(17) 中使用初始值 X(不在乎)表示净"rom_data[14][5]"

文件"mem.dat"与项目位于同一目录中。我在夸脱工作

这个问题似乎是关于如何使用文件中的数据初始化 ROM,以便合成。如果是这种情况,那么显然运行一个进程将数据加载到内存中(这要求文件在运行时可读)是行不通的。

但是,你可以做的是声明内存 - 不是作为SIGNAL而是作为CONSTANT,并且声明必须有一个初始化器子句;这允许调用函数。由于初始化器是在合成过程中评估的,因此它可以打开、读取和关闭文件。

示例可能如下所示

type t_rom_data is array (15 downto 0) of std_logic_vector(7 downto 0);
function init_rom return t_rom_data is
   type rom_file_type is file of character;
   file rom_file: rom_file_type;
   variable temp : t_rom_data;
begin
   file_open(rom_file,file_name,read_mode);
   for i in 0 to 15 loop
      ...
      temp(i) := ...
   end loop;
   file_close(rom_file); 
   return temp;
end init_rom;
constant rom_data: t_rom_data := init_rom;

使用您编写的 ROM 读取过程。

相关内容

  • 没有找到相关文章

最新更新