Almacenamiento de instrucciones de programa en FPGA

Estoy creando un núcleo de procesamiento RISC básico en una placa de desarrollo FPGA (Nexys A7-100t).

Creé un bloque de RAM que se usará para almacenar las instrucciones que ejecutará mi procesador básico para ejecutar un programa simple. He adjuntado el código de archivo para mi bloque de RAM a continuación. Tenga en cuenta que no está completo ni ha sido probado / compilado, por lo que habrá errores, pero solo está ahí para darle una idea de la funcionalidad de los bloques de RAM.

En teoría, este código genera la lógica para acceder/clasificar datos, pero no inicializa el contenido de la memoria RAM para contener las instrucciones binarias.

Mi pregunta es ¿cómo podría inicializar el bloque de RAM al encender o configurar FPGA?

Mis pensamientos iniciales me dicen que tengo las siguientes opciones:

  1. Genere los datos 'manualmente' con código VHDL y LUT para escribir los bytes de datos en el bloque de RAM. Esta podría ser la opción más fácil, ya que solo puede haber aproximadamente 100 ubicaciones de memoria de 32 bits de ancho.

  2. Tal vez Xilinx proporcione funcionalidad para lograr esto. No estoy seguro.

  3. Utilice una tarjeta SD con el lector de tarjetas SD integrado en la placa de desarrollo. Nuevamente, no estoy seguro de si esto es viable.

  4. Utilice una EEPROM para almacenar las instrucciones y, al encenderlo, escriba estos datos en el bloque de RAM. Me imagino que esto no es diferente al método 1. excepto por la molestia de leer el contenido de la EEPROM en serie y tener que cargar los datos 'manualmente'. Sin embargo, me gusta el sonido de usar una EEPROM.

Estoy interesado en saber cómo todo el mundo haría esto. Este es un proyecto académico, por lo que no requiere alta velocidad, solo baja complejidad y algo repetible.

¡Gracias por cualquier ayuda a todos!

Bloque de RAM archivo VHDL



LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
--add other required library files that holds 'Data_width' constant

entity RAM_Block
 Port ( RAM_Address : in std_logic_vector (Data_width-1 downto 0)); 
        Data_in  : in std_logic_vector (Data_width-1 downto 0));
        Clock : in std_logic;
        Enable : in std_logic;
        Data_out : out std_logic_vector (Data_width-1 downto 0));
end RAM_Block;

architecture Behavioral of RAM_Block is

type memory is array (0 to 100) of std_logic_vector (Data_width-1 downto 0);
signal RAM : memory;
variable RAM_Address_int integer := 0;
signal RAM_output : std_logic_vector (Data_width-1 downto 0);

component Enabler_Block is
 Port ( D : in std_logic_vector(Data_width-1 downto 0);
        Enable : in std_logic;
        Q : in std_logic_vector(Data_width-1 downto 0));
end component;

begin

Enabler_Block_instance port map (D => RAM_output , Enable => Enable , Q => Data_out);

RAM_Address_int <= conv_integer(unsigned(RAM_Address)); 

   Process (Clock , Enable)

    begin

     if(rising_edge(Clock) and Clock = '1') then
        RAM(RAM_Address_int) <= Data_in;

     end if;

     if(rising_edge(Enable) and Enable = '1') then
        RAM_output <= RAM(RAM_Address_int);

     end if;

    end Process;

end Behavioral;

Respuestas (1)

Es posible inicializar bloques de RAM durante la configuración. En su código, solo necesita establecer los valores iniciales:

signal RAM : memory := (data,data,data,data...);

También es posible desde Vivado declarar qué bloques se utilizan para el programa y luego adjuntar algún archivo que se transfiera a estos bloques.

Si desea poder cargar el programa desde una tarjeta SD o cualquier otra cosa, puede almacenar en estos bloques de RAM un pequeño programa de carga que administrará las transferencias.

Ah, está bien, creo que el mejor método para mi aplicación es inicializar manualmente los datos de RAM en mi código VHDL. Y en su ejemplo anterior, ¿qué quiere decir "declarar bloques que se usan para el programa y luego adjuntar algún archivo que se transfiera a estos bloques"?
Escriba un script de Python para crear ese código VHDL (quizás una matriz constante en un paquete VHDL) automáticamente desde cualquier fuente de datos. Entoncessignal ram : memory := mypack.myconst;
@BrianDrummond Mi experiencia con Python es limitada. Perdón por mi falta de conocimiento, pero ¿qué ventaja ofrece esto sobre simplemente escribir el código VHDL para inicializar los datos en la RAM?
... u otro idioma favorito. (¡De hecho, también he usado VHDL con el propósito de generar VHDL!) La ventaja depende de su fuente de datos y mantenimiento. Si es un archivo CSV de una hoja de cálculo, o un archivo de objeto de un compilador, o texto de un libro, o... entonces aproximadamente la tercera vez que traduzca un conjunto de cambios a mano a la fuente VHDL, el script saldrá adelante. .
Aquí hay un script de Python de ejemplo que genera constantes VHDL a partir de archivos binarios: github.com/Grabulosaure/Intv_MiSTer/blob/master/src/intv/…