Forum: FPGA, VHDL & Co. Wie 8kByte ROM beim AX8-Softcore?


von Benjamin (Gast)


Lesenswert?

Hallo,

ich arbeite gerade im Zuge meiner Diplomarbeit mit einem Spartan-3E und 
dem AX8-Softcore von opencores, der ja standardmäßig nur 2kB 
Programmspeicher hat. Das ist mir jetzt zu wenig. Laut Wiki 
(http://www.mikrocontroller.net/articles/FPGA_Soft_Core) soll es einfach 
möglich sein, den auf 8kB ROM aufzupeppeln.
Meine Frage ist, was muss genau am µC geändert werden? Ich benutze 
bisher das hex2rom aus diesem Thread hier: 
Beitrag "hex2rom für AX8 und Xilinx:XST"
Vielleicht hat ja jemand Erbarmen mit einem Anfänger :)

Danke und Gruß
Benjamin

von Benjamin (Gast)


Lesenswert?

Als Ergänzung vielleicht meine bisherigen Gedanken, ich hoffe, die sind 
nicht ganz falsch. Genügt es, um 8kByte PROM adressieren zu können:
a) in der Datei A90S2313.VHD die Konstante "ROMAddressWidth" von 10 auf 
12 zu ändern und
b) für hex2rom anstelle von "10l16x" den Paramter "12l16x" zu verwenden?

Gruß,
Benjamin

von Duke Scarring (Gast)


Lesenswert?

Prinzipiell sollten Deine Änderungen schon reichen. Ich guck mal, was 
ich damals geändert habe.
In der C-Toolchain mußt Du auch noch einen entsprechenden Chip 
auswählen.

Duke

von Benjamin M. (beme)


Lesenswert?

Das wäre sehr nett, wenn Du mal nachschauen würdest. Hast Du zufällig 
auch noch zusätzliche Ports hinzugefügt? Die könnte ich auch noch gut 
gebrauchen...

Ich benutze WinAVR und werde dort dann mal den im Wiki erwähnten 
AT90S8535 einstellen. Wobei WinAVR/avr-gcc auch dann durchkompiliert und 
die hex-Datei erstellt wenn man die ROM-Größe des eingestellten Chips 
(hier dann AT90S2313) überschreitet.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Guck mal ob der Anhang so verwendbar ist. Bei Bedarf kann ich Dir auch 
noch den Watchdog und den EEPROM geben. (Der EEprom wird nur emuliert, 
kann aber als einfache Speichererweiterung fuer Daten genutzt werden.)

Duke

von Benjamin (Gast)


Lesenswert?

Hallo Duke,

nachträglich noch herzlichen Dank für Deine Datei. Hat mir sehr 
weitergeholfen und funktioniert gut!

Gruß
Benjamin

von Benjamin (Gast)


Lesenswert?

Hi Duke,

bin jetzt doch noch auf ein Problem gestoßen... Sobald ich mehr als 4kB 
ROM verwende, macht der µC nur noch Quatsch (zumindest bei allem, was im 
ROM oberhalb der ersten 4kB liegt).
Aufgefallen ist mir das dabei, dass der UART nur funktioniert, wenn ich 
unter den magischen 50% ROM-Auslastung bleibe. Darüber kommen nur noch 
wirre Zeichen.

Hattest Du Deinen erweiterten Core schon mit mehr als 4kB getestet?
Meine mit hex2rom generierte ROM-Beschreibung müsste jedenfalls korrekt 
sein, oder?
1
...
2
entity ROM8535 is
3
  port(
4
    Clk  : in std_logic;
5
    A  : in std_logic_vector(11 downto 0);
6
    D  : out std_logic_vector(15 downto 0)
7
  );
8
end ROM8535;
9
10
architecture rtl of ROM8535 is
11
  signal A_r : std_logic_vector(11 downto 0);
12
  subtype ROM_WORD is std_logic_vector(15 downto 0);
13
  type ROM_TABLE is array(0 to 4095) of ROM_WORD;
14
  signal ROM: ROM_TABLE := ROM_TABLE'(
15
    "1100000000100000",  -- 0x0000
16
    "1100000000111011",  -- 0x0002
17
    "1100000000111010",  -- 0x0004
18
    "1100000000111001",  -- 0x0006
19
    "1100000000111000",  -- 0x0008
20
...

Viele Grüße
Benjamin

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Sobald ich mehr als 4kB ROM verwende...
Dein ROM hat 4k Worte (allerdings mit je 16 Bit). Bist du sicher, dass 
die Probleme bei 4k Bytes auftreten und nicht bei 4k Worten?

von Duke Scarring (Gast)


Lesenswert?

Benjamin schrieb:
> Hattest Du Deinen erweiterten Core schon mit mehr als 4kB getestet?

Ich denke ja, weil letztendlich waren mir die 8k auch noch zu wenig, so 
daß ich Daten in ein virtuelles EEPROM ausgelagert habe. Ich guck aber 
gern nochmal nach, um sicher zu gehen.

Kommt denn aus dem AX8 die richtige Bitbreite für den Speicher raus?

Duke

von Benjamin M. (beme)


Lesenswert?

Lothar Miller schrieb:
> Bist du sicher, dass
> die Probleme bei 4k Bytes auftreten und nicht bei 4k Worten?

Ja, schon.... Bleibe ich unter 50% laut avr-gcc, wird das ROM mittels 
hex2rom auch automatisch nur mit 2k Worten beschrieben. Komme ich über 
50% enthält es 4k Worte.

So sieht die Ausgabe ja in WinAVR am Schluss aus:
Program:    4218 bytes (51.5% Full)
(.text + .data + .bootloader)
Data:        162 bytes (31.6% Full)
(.data + .bss + .noinit)

Duke Scarring schrieb:
> Kommt denn aus dem AX8 die richtige Bitbreite für den Speicher raus?

Ja, habe das unverändert von Deiner VHDL-Datei übernommen:
1
constant ROMAddressWidth    : integer := 12;
2
signal ROM_Addr  : std_logic_vector(ROMAddressWidth - 1 downto 0);
3
signal ROM_Data  : std_logic_vector(15 downto 0);

Gruß,
Benjamin

von Benjamin M. (beme)


Lesenswert?

Ich war in der Zwischenzeit nicht untätig und habe es jetzt irgendwie 
hinbekommen.

Ich habe die Konstante "ROMAddressWidth" im µC auf 13 erhöht, obwohl 12 
ja eigentlich ausreichen sollte, um 24096 Wörter zu adressieren.

Weiter benutze ich für hex2rom dazu passend jetzt den folgenden 
Parameter, damit das ROM auch mit einer Breite von 13 Bit fürs 
Adresssignal erstellt wird:
./hex2rom.exe main.hex ROM8535 13l16x > rom8535.vhd

Verstehe das nun wer will, aber so laufen jetzt auch Programme mit über 
4K Speicherbedarf.
Ideen?

Viele Grüße
Benjamin

von Benjamin M. (beme)


Lesenswert?

Oben meinte ich natürlich:

"Ich habe die Konstante "ROMAddressWidth" im µC auf 13 erhöht, obwohl 12
ja eigentlich ausreichen sollte, um 4096 Wörter zu adressieren."

Hier noch die komplette neue ROM-Beschreibung (Array-Elemente gekürzt):
1
-- This file was generated with hex2rom written by Daniel Wallner
2
-- additions by Bert Lange
3
4
library IEEE;
5
use IEEE.std_logic_1164.all;
6
use IEEE.numeric_std.all;
7
8
entity ROM8535 is
9
  port(
10
    Clk  : in std_logic;
11
    A  : in std_logic_vector(12 downto 0);
12
    D  : out std_logic_vector(15 downto 0)
13
  );
14
end ROM8535;
15
16
architecture rtl of ROM8535 is
17
  signal A_r : std_logic_vector(12 downto 0);
18
  subtype ROM_WORD is std_logic_vector(15 downto 0);
19
  type ROM_TABLE is array(0 to 4095) of ROM_WORD;
20
  signal ROM: ROM_TABLE := ROM_TABLE'(
21
    "1100000000100000",  -- 0x0000
22
    "1100000000111011",  -- 0x0002
23
    "1100000000111010",  -- 0x0004
24
    ...
25
    ...
26
    ...
27
    "----------------");  -- 0x1FFE
28
begin
29
  process (Clk)
30
  begin
31
    if Clk'event and Clk = '1' then
32
      A_r <= A;
33
    end if;
34
  end process;
35
  D <= ROM(to_integer(unsigned(A_r)));
36
end;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.