mikrocontroller.net

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


Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Meier (beme)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Duke,

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

Gruß
Benjamin

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
...
entity ROM8535 is
  port(
    Clk  : in std_logic;
    A  : in std_logic_vector(11 downto 0);
    D  : out std_logic_vector(15 downto 0)
  );
end ROM8535;

architecture rtl of ROM8535 is
  signal A_r : std_logic_vector(11 downto 0);
  subtype ROM_WORD is std_logic_vector(15 downto 0);
  type ROM_TABLE is array(0 to 4095) of ROM_WORD;
  signal ROM: ROM_TABLE := ROM_TABLE'(
    "1100000000100000",  -- 0x0000
    "1100000000111011",  -- 0x0002
    "1100000000111010",  -- 0x0004
    "1100000000111001",  -- 0x0006
    "1100000000111000",  -- 0x0008
...

Viele Grüße
Benjamin

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Meier (beme)
Datum:

Bewertung
0 lesenswert
nicht 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:
constant ROMAddressWidth    : integer := 12;
signal ROM_Addr  : std_logic_vector(ROMAddressWidth - 1 downto 0);
signal ROM_Data  : std_logic_vector(15 downto 0);

Gruß,
Benjamin

Autor: Benjamin Meier (beme)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Meier (beme)
Datum:

Bewertung
0 lesenswert
nicht 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):
-- This file was generated with hex2rom written by Daniel Wallner
-- additions by Bert Lange

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity ROM8535 is
  port(
    Clk  : in std_logic;
    A  : in std_logic_vector(12 downto 0);
    D  : out std_logic_vector(15 downto 0)
  );
end ROM8535;

architecture rtl of ROM8535 is
  signal A_r : std_logic_vector(12 downto 0);
  subtype ROM_WORD is std_logic_vector(15 downto 0);
  type ROM_TABLE is array(0 to 4095) of ROM_WORD;
  signal ROM: ROM_TABLE := ROM_TABLE'(
    "1100000000100000",  -- 0x0000
    "1100000000111011",  -- 0x0002
    "1100000000111010",  -- 0x0004
    ...
    ...
    ...
    "----------------");  -- 0x1FFE
begin
  process (Clk)
  begin
    if Clk'event and Clk = '1' then
      A_r <= A;
    end if;
  end process;
  D <= ROM(to_integer(unsigned(A_r)));
end;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.