Cargando datos hexadecimales y binarios al mismo tiempo desde un archivo de texto a std_logic_vector

0

Estoy intentando crear un caché simple para usar en la simulación con el diseño de mi procesador.

Quiero rellenar el caché con instrucciones que están almacenadas en un archivo, .bin o .txt.

El archivo no tiene más de 1023 líneas, y cada línea tiene el siguiente formato:

addr[tab]instruction

Adr es la dirección de la instrucción, y la instrucción es el código de la instrucción, y [tab] es una pestaña (espacio entre el addr y la instrucción).

Aquí está el problema:

Addr se escribe como un valor hexadecimal, tiene 32 bits y la instrucción se escribe como un valor binario y también tiene 32 bits. Así que una línea parece, por ejemplo, esta

0000000A[tab]00001000000100001110000000000011

Mi idea fue crear una matriz de vectores lógicos estándar y cada línea era un vector lógico estándar donde elem (63 a 32) sería la dirección y elem (31 a 0) sería el código de instrucción.

¿Cómo leo cada línea y al mismo tiempo convierto el valor hexadecimal en binario, ignoro la pestaña, leo las instrucciones y almaceno todo en un vector lógico estándar?

Gracias de antemano por tu ayuda.

EDITAR:

Algo como este trabajo:

while not endfile(load_file) loop
        readline(load_file, rdline);
        hread(rdline, address);
        read(rdline, data);
        memory(index) := data;
        index := index + 1;
end loop;

Mi pregunta es: ¿mueve el cursor el cursor al leer la línea? Además, ¿cómo voy a omitir el carácter de la pestaña?

    
pregunta idjuradj

2 respuestas

1

El proceso básico es

  1. Abra el archivo para leer usando file_open() .
  2. Recorra cada línea hasta que se encuentre el final del archivo:
    1. Lea la línea a una variable de tipo line usando readline() .
    2. Lea la línea como string usando read() .
    3. Separe la cadena en las dos partes en las que está interesado usando índices.
    4. Convierta las cadenas carácter por carácter a std_logic_vector s usando una función de conversión (no puedo encontrar una incorporada, podría faltar lo obvio), pero es solo una simple declaración de caso con casos para todos. los caracteres que le interesan y una bandera o afirmar para cualquier inesperado).

Hay muchos ejemplos para la parte IO del archivo:

respondido por el Xcodo
0

Esto es más un comentario, pero lo publicaré aquí por el bien del formato. Como se mencionó en otra parte, esta función de utilidad podría ayudar.

    FUNCTION hex2bin (hex: character) RETURN std_logic_vector IS
        VARIABLE result : std_logic_vector (3 downto 0);
    BEGIN
        CASE hex IS
            WHEN '0' =>     result := "0000";
            WHEN '1' =>     result := "0001";
            WHEN '2' =>     result := "0010";
            WHEN '3' =>     result := "0011";
            WHEN '4' =>     result := "0100";
            WHEN '5' =>     result := "0101";
            WHEN '6' =>     result := "0110";
            WHEN '7' =>     result := "0111";
            WHEN '8' =>     result := "1000";
            WHEN '9' =>     result := "1001";
            WHEN 'A'|'a' => result := "1010";
            WHEN 'B'|'b' => result := "1011";
            WHEN 'C'|'c' => result := "1100";
            WHEN 'D'|'d' => result := "1101";
            WHEN 'E'|'e' => result := "1110";
            WHEN 'F'|'f' => result := "1111";
            WHEN 'X'|'x' => result := "XXXX";
            WHEN others =>  NULL;
        END CASE;
    RETURN result;
    END;
    
respondido por el AaronDanielson

Lea otras preguntas en las etiquetas