VHDL: Leer array de fichero para la memoria de instrucciones de un procesador??

Iniciado por x7, 6 Mayo 2013, 23:41 PM

0 Miembros y 1 Visitante están viendo este tema.

x7

Hola, tengo un problema con este código de la memoria de instrucciones de mi procesador MIPS. Lo he estado desarrollando en VHDL con ModelSim y aunque he conseguido que funcione insertando manualmente las operaciones, no consigo que lo lea desde un fichero. ¿Alguien sabe cómo? Mi problema está en asignar a cada instrucción (0,4,8,12,..) su salida (palabra de 32 bits).

Para leer sin fichero de texto:

Código (vhdl) [Seleccionar]
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use std.textio.all;

ENTITY Memoria_Ins IS
    port(address_i : IN std_logic_vector (31 DOWNTO 0);
         d_o : OUT std_logic_vector (31 DOWNTO 0));
END Memoria_Ins;

architecture funcional of  Memoria_Ins is
type memoria is array(integer range <>) of std_logic_vector(31 downto 0);
signal instrucciones : memoria(0 to 64):=
   (0=>  "11110000000000110000000000000100",
    4=>  "11110000000001010000000000001000",
    8=>  "11000000101000110011000000000001",
    12=> "00000100000010000000000000000000",
    16=> "00001100000001010000000000001100",
    20=> "10001000000000000000000000011100",
    24=> "00000000000000000000000000000000",
    28=> "11000001010001010001100000000101",
    others=> "11111100000000000000000000000000");

begin

  d_o<=instrucciones(conv_integer(address_i));

end funcional;


Para leer con fichero de texto (intento de process):

Código (vhdl) [Seleccionar]
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use std.textio.all;

ENTITY Memoria_Ins IS
    port(address_i : IN std_logic_vector (31 DOWNTO 0);
         d_o : OUT std_logic_vector (31 DOWNTO 0));
END Memoria_Ins;

architecture funcional of  Memoria_Ins is
type memoria is array(integer range <>) of std_logic_vector(31 downto 0);
signal instrucciones : memoria(0 to 64);         
     
      --0 addi r0,r3,4
      --4 addi r0,r5,8
      --8 add r5,r3,r6 --12
      --12 lw r0,0(r8)
      --16 sw r0,12(r5)
     
begin

  d_o<=instrucciones(conv_integer(address_i));
 
process
   FILE vector_test : text OPEN read_mode IS "test.txt";
    VARIABLE vector : LINE;
    VARIABLE instrucciones_aux : memoria(0 to 64);
    VARIABLE palabra : std_logic_vector (31 DOWNTO 0);
    VARIABLE instruccion : INTEGER;
   
  BEGIN
     instruccion:=0;
     WHILE NOT endfile(vector_test) LOOP
       
       readline(vector_test,vector); --Guardo la linea en vector
       read(vector,palabra); --Obtengo los 32 bits de la palabra y los guardo en palabra
       Instrucciones_aux:=(instruccion => palabra, others=> "11111100000000000000000000000000"); --Intento recrear el array de instrucciones con sus salidas
       instruccion:= instruccion + 4; --Sumo 4 para el siguiente ciclo
       
       WAIT FOR 20 ns;
      END LOOP;
     
      instrucciones <= instrucciones_aux;
      file_close(vector_test);
END process;

end funcional;


El fichero de texto sólo tiene las palabras de 32 bits:

"11110000000000110000000000000100
11110000000001010000000000001000
11000000101000110011000000000001
00000100000010000000000000000000
00001100000001010000000000001100"

Un saludo foreros ;D

Khronos14