Speichern von Programmanweisungen auf FPGA

Ich erstelle einen grundlegenden RISC-Verarbeitungskern auf einem FPGA-Entwicklungsboard (Nexys A7-100t).

Ich habe einen RAM-Block erstellt, der verwendet wird, um die Anweisungen zu speichern, die mein Basisprozessor ausführt, um ein einfaches Programm auszuführen. Ich habe den Dateicode für meinen RAM-Block unten angehängt. Beachten Sie, dass es nicht vollständig ist oder getestet / kompiliert wurde, so dass es Fehler geben wird, aber es ist nur dazu da, Ihnen eine Vorstellung von der Funktionalität der RAM-Blöcke zu geben.

Dieser Code generiert theoretisch die Logik für den Zugriff auf / das Sortieren von Daten, initialisiert jedoch nicht den Inhalt des RAM-Speichers, um die binären Anweisungen zu speichern.

Meine Frage ist, wie kann ich den RAM-Block beim Einschalten oder bei der FPGA-Konfiguration initialisieren?

Meine ersten Gedanken sagen mir, dass ich die folgenden Optionen habe:

  1. Generieren Sie die Daten „manuell“ mit VHDL-Code und LUT, um die Datenbytes in den RAM-Block zu schreiben. Dies ist möglicherweise die einfachste Option, da möglicherweise nur ca. 100 Speicherplätze mit einer Breite von 32 Bit vorhanden sind.

  2. Vielleicht bietet Xilinx Funktionen, um dies zu erreichen. Ich bin nicht sicher.

  3. Verwenden Sie eine SD-Karte mit dem integrierten SD-Kartenleser auf der Entwicklungsplatine. Wieder unsicher, ob dies realisierbar ist.

  4. Verwenden Sie ein EEPROM, um die Anweisungen zu speichern, und schreiben Sie diese Daten beim Einschalten in den RAM-Block. Ich kann mir vorstellen, dass dies nicht anders ist als Methode 1. Abgesehen von der Mühe, den EEPROM-Inhalt seriell zu lesen, während die Daten immer noch "manuell" geladen werden müssen. Ich mag jedoch den Klang der Verwendung eines EEPROM.

Ich bin interessiert zu hören, wie jeder dies tun würde. Dies ist ein akademisches Projekt, erfordert also keine hohe Geschwindigkeit, nur geringe Komplexität und etwas Wiederholbares.

Danke für jede Hilfe an alle!

RAM-Block-VHDL-Datei



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;

Antworten (1)

Während der Konfiguration können RAM-Blöcke initialisiert werden. In Ihrem Code müssen Sie nur die Anfangswerte festlegen:

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

Es ist auch möglich von Vivado zu deklarieren, welche Blöcke für das Programm verwendet werden und dann einige Dateien anzuhängen, die in diese Blöcke übertragen werden.

Wenn Sie das Programm von einer SD-Karte oder etwas anderem laden möchten, können Sie in diesen RAM-Blöcken ein kleines Ladeprogramm speichern, das die Übertragungen verwaltet.

Ah richtig ok, also denke ich, dass die beste Methode für meine Anwendung darin besteht, die RAM-Daten in meinem VHDL-Code manuell zu initialisieren. Und in Ihrem obigen Beispiel, was meinen Sie mit "Blöcke deklarieren, die für das Programm verwendet werden, und dann eine Datei anhängen, die in diese Blöcke übertragen wird?"
Schreiben Sie ein Python-Skript, um diesen VHDL-Code (möglicherweise ein konstantes Array in einem VHDL-Paket) automatisch aus Ihrer Datenquelle zu erstellen. Dannsignal ram : memory := mypack.myconst;
@BrianDrummond Meine Python-Erfahrung ist begrenzt. Entschuldigung für meinen Mangel an Wissen, aber welchen Vorteil bietet dies gegenüber der einfachen Eingabe des VHDL-Codes, um die Daten im RAM zu initialisieren?
... oder andere Lieblingssprache. (Ich habe VHDL tatsächlich auch zum Generieren von VHDL verwendet!) Der Vorteil hängt von Ihrer Datenquelle und Wartung ab. Wenn es sich um eine CSV-Datei aus einer Tabellenkalkulation oder eine Objektdatei aus einem Compiler oder Text aus einem Buch handelt, oder ... dann wird das Skript ungefähr beim dritten Mal, wenn Sie eine Reihe von Änderungen von Hand in eine VHDL-Quelle übersetzen, vorankommen .
Hier ist ein Beispiel-Python-Skript, das VHDL-Konstanten aus Binärdateien generiert: github.com/Grabulosaure/Intv_MiSTer/blob/master/src/intv/…