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
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
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
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.
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
Hallo Duke, nachträglich noch herzlichen Dank für Deine Datei. Hat mir sehr weitergeholfen und funktioniert gut! Gruß Benjamin
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
> 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?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.