Sprungnavigation:

zum Inhalt

FPGA mit VHDL

Bei diesem System habe ich lediglich die Datei prozessor.vhd geändert. Alle anderen VHDL-Datei habe so belassen, wie sie im Beispiel Prozessor mit RAM im angeschlossenem FPGA verwendet wurden. Ich gehe hier auch nur auf die Stellen mit Text IO ein.

Instanziierung des Prozessors

Ich liste nur mal die wichtigsten Code-Teile auf, der Rest steht ja in der VHDL-Datei.

Dieser Prozess liesst Zeile für Zeile die Datei ein.
Jede Zeile wird in drei Zeichen unterteilt, weil in der Datendatei Werte von 0 bis 255 auftreten können.
Die einzelnen Zeichen werden dann gewichtet, im Register help aufaddiert und im Vektor RAMDATA abgespeichert.
Zum Schluss wird dann noch das Signal StartRAMTransfer gesetzt, damit der zweite Prozess eine Startbedingung hat.

-- ###########################################
-- Einlesen der Datei in einem virtuelle RAM-Block
-- ###########################################
inputfile_PROC : PROCESS
FILE daten_ins_ram : TEXT open read_mode IS "d:\vhdl\fpga-ram-file-io\daten-ins-ram.txt";
variable rline : line;
variable value : string(1 to 3);
variable nEOL : boolean;
variable I : integer range 0 to 255;
BEGIN
StartRAMTransfer <= '0';
-- Dunkelwerte einlesen
wait until RST = '0';
I := 0;
while not endfile(daten_ins_ram) loop
        readline(daten_ins_ram, rline);
        read(rline, value);
        help <= 100 * HEXCHARACTER_to_INT(value(1));
        wait until clk = '1';
        read(rline, value, nEOL);
        help <= help + 10 * HEXCHARACTER_to_INT(value(2));
        wait until clk = '1';
        read(rline, value, nEOL);
        help <= help + HEXCHARACTER_to_INT(value(3));
        wait until clk = '1';
        RAMDATA(I) <= conv_std_logic_vector(help, 8);
        wait until clk = '1';
        I := I + 1;
        help <= 0;
        wait until clk = '1';
end loop;
wait until clk = '1';
StartRAMTransfer <= '1';
wait;
END PROCESS;

Nach der Deklaration der Variablen und der Initialisierung wartet der Prozess auf die Freigabe zum Datentransfer.
In einer Schleife schreibt er den Vektor RAMDATA Byte für Byte in das RAM.
Im Anschluss daran wird wieder in einer Schleife das RAM ausgelesen und das Byte in die Datei geschrieben.

-- ###########################################
-- RAM-Speicherzugriff
-- ###########################################
RAM_ACCESS_PROC : PROCESS
FILE daten_aus_ram : TEXT open write_mode is "d:\vhdl\fpga-ram-file-io\daten-aus-ram.txt";
variable N, M : integer range 0 to 255;
variable adata : line;
variable data_a : integer;
begin
-- Init
        M := 0;
        ADDRESS        <= (others => '0');
        DATA        <= (others => '0');
        wait until RST = '0' and  StartRAMTransfer = '1';
GrandLoop : FOR M IN 0 to 255 LOOP -- Komplettes Paket ewig wiederholen.

-- ###############################################
-- Daten abspeichern
-- ###############################################
        ADDRESS        <= x"00";
RAMWrite : FOR N IN 0 to 255 LOOP
        DATA <= RAMDATA(N);
        wait until(CLK'Event and CLK = '1');
        BUS_WR(RST, ADDRESS, DATA, T, Adressen, DatenOut, nRD, nWR, nCS);
        ADDRESS        <= ADDRESS + 1;
        END LOOP RAMWrite;

-- ###############################################
-- Daten auslesen und abspeichern
-- ###############################################
        ADDRESS        <= x"00";
RAMRead : FOR N IN 0 to 255 LOOP
        wait until(CLK'Event and CLK = '1');
        BUS_RD(RST, ADDRESS, DATA, T, Adressen, DatenIn, nRD, nWR, nCS);
        data_a := conv_integer(signed(DATA));
        write(adata, data_a);
        writeline(daten_aus_ram, adata);
        ADDRESS        <= ADDRESS + 1;
        END LOOP RAMRead;

END LOOP GrandLoop;
end process;

im 3. Teil Simulation weiterlesen.

Alle Informationen und Dateien zu diesem Beispiel

 
Qualitätsmanagement-Stempel von YASKO
Qualitätsmanagement nach
DIN EN ISO 9001:2015
Logo des FED
Mitglied im Fachverband für
Elektronik-Design e.V. (FED)