Cómo cargar la matriz std_logic_vector desde el archivo de texto al inicio de la simulación

1

Estoy intentando modelar una memoria que almacenará instrucciones para el diseño de un procesador. Estas instrucciones se almacenan en un archivo de texto como palabras binarias de 32 bits. Al inicio de la simulación, todos los valores deben copiarse en una matriz std_logic_vector en el bloque de memoria desde este archivo de texto y luego se emitirá un valor a la vez, dependiendo de la dirección suministrada a la memoria. ¿Cómo puedo lograr esto?

Aparentemente necesito ieee.std_logic_textio.all; junto con std.textio.all; y solo puedo usar las funciones de lectura / escritura con variables. Si la matriz std_logic_vector es una señal, no se actualizará tan pronto como le escriba. Estoy confundido sobre cómo hacer esto correctamente. No tendré más de 1023 instrucciones en el archivo de texto ya que no quiero que la simulación utilice demasiada RAM.

    
pregunta quantum231

2 respuestas

2

Aquí hay una función de ejemplo simple que lee un archivo * .hex del disco e inicializa una RAM.

Un archivo hexadecimal almacena una palabra RAM por línea en codificación hexadecimal (caracteres ASCII: 0-9, A-F, a-f)

Al principio, una memoria debe definirse por word_t y ram_t . Los genéricos o constantes DATA_BITS y DEPTH definen el diseño de la memoria:

subtype word_t  is std_logic_vector(DATA_BITS - 1 downto 0);
type    ram_t   is array(0 to DEPTH - 1) of word_t;

En segundo lugar, se define una función para leer un archivo y devolver un vector de inicialización:

-- Read a *.hex file
impure function ocram_ReadMemFile(FileName : STRING) return ram_t is
  file FileHandle       : TEXT open READ_MODE is FileName;
  variable CurrentLine  : LINE;
  variable TempWord     : STD_LOGIC_VECTOR((div_ceil(word_t'length, 4) * 4) - 1 downto 0);
  variable Result       : ram_t    := (others => (others => '0'));

begin
  for i in 0 to DEPTH - 1 loop
    exit when endfile(FileHandle);

    readline(FileHandle, CurrentLine);
    hread(CurrentLine, TempWord);
    Result(i)    := resize(TempWord, word_t'length);
  end loop;

  return Result;
end function;

Se define e inicializa una señal para la RAM:

signal ram    : ram_t    := ocram_ReadMemFile(FILENAME);

Este ejemplo debería funcionar en todos los simuladores y en Xilinx ISE en síntesis, también. Si necesita un ejemplo sintetizable para Altera altsyncram, eche un vistazo a los archivos completos en nuestra PoC-Library .

Por ejemplo PoC.mem.ocram.tdp (verdadera memoria de doble puerto).

    
respondido por el Paebbels
-1

Las respuestas anteriores requieren que el archivo se divida en líneas y que sepamos su tamaño. En esta respuesta podemos hacer que el tamaño de la memoria sea dinámico obteniendo primero el tamaño del archivo.

library IEEE;
use IEEE.STD_LOGIC_1164.all;        
use IEEE.STD_LOGIC_ARITH.all; 
use STD.TEXTIO.all;

entity MYROM is
--IO signals here
end entity;

architecture behaviour of MYROM is

type std_lv_array is array (natural range <>) of std_logic_vector(data'range);

impure function get_file_length(constant filename : string) return positive is
  type char_file_t is file of character;     
  file infile : char_file_t;
  variable c: character;
  variable res : integer := 0;
begin        
    file_open(infile, filename, read_mode);
    while not endfile (infile) loop
      read(infile, c);
      res := res + 1;
    end loop;
    file_close(infile);
    return res;
end function;


impure function get_data(constant filename : string) return std_lv_array is
  type char_file_t is file of character;     
  file infile : char_file_t;
  variable c: character;
  variable res : std_lv_array(0 to get_file_length(filename) - 1);  
  variable x : integer := 0;
begin
    file_open(infile, filename, read_mode);
    while not endfile (infile) loop
      read(infile, c);
      res(x) := std_logic_vector(conv_unsigned(character'pos(c),res(x)'length));
      x := x + 1;
    end loop; 
    file_close(infile);
    return res;
end function;

constant ROM : std_lv_array := get_data("romfile.bin");

begin
--Your code here
end architecture;
    
respondido por el Jason Morgan

Lea otras preguntas en las etiquetas