Forum: FPGA, VHDL & Co. Lattice Mico32 EBR Initialisierung


von Mark K. (mrdigit)


Lesenswert?

Hallo,

ich habe ein Lattice ECP2-Board und möchte darauf den LM32-uP 
integrieren. Ich habe zunächst eine sehr einfache Konfiguration für den 
LM32 gewählt: LM32 + 16kB EBR über Wishbone angeschlossen. Exception 
Adresse (EBA) im LM32 ist auf die Startadresse des EBR's eingestellt. 
Diese Konfiguration lässt sich scheinbar auch ohne größere Probleme auf 
den FPGA bringen.

Starte ich nun ein einfaches Beispielprogramm (LEDtest) im Debug-Modus 
über Eclipse so funktioniert alles bestens. Jetzt wollte ich das 
Programm (bzw. zur Benutzung im EBR erstellte .mem-Datei) über Memory 
Initialization im ISPLever in den Bitstream in den FPGA integrieren und 
anschließend einspielen und ablaufen lassen (ohne Eclipse zu benutzen). 
Weiterhin habe ich versucht das so generierte Bit-File in den SPI-Flash 
zu bringen. Leider tut sich in beiden Fällen rein gar nichts. Der LM32 
scheint auf dem FPGA zwar richtig erstellt worden zu sein (man kann ohne 
Probleme den Debug-Modus starten und das Programm darüber zum laufen 
bringen), aber das Programm läuft nicht selbstständig nach dem 
Übertragen des Bitstreams los (es wird nach einiger Zeit ein Reset 
ausgelöst).

Hat vielleicht jemand eine Idee woran das liegen kann. Kann man den EBR 
gar nicht über den Bitstream via Memory Initialization initialisieren? 
Oder wird bei der Erstellung des EBR mit Hilfe des MicoSystemBuilders 
gar kein EBR erstellt und man muss dieses erst noch im ISPLever über 
PCIExpress hinzufügen?

von cfgardiner (Gast)


Lesenswert?

Hi,
1)
eine Initialisierung des EBRs aus dem Flash Inhalt ist auf jeden Fall 
möglich.

2)
es ist eher unwahrscheinlich (aber möglich), dass kein EBR angelegt 
worden ist. Falls ja, muesste es eine diesbzgl. Meldung im Synthese 
Report geben. Ich glaube in dem Memory Abschnitt, kann man die 
hierarchische Pfade zu allen EBRs finden. Vorsichtshalber hier 
nachschauen.

3) Woran das liegen kann? Falls 2) in Ordnung ist, tippe ich zunächst 
auf die Startadresse. Welcher Wert hast Du im Microsystem Builder (MSB) 
eingestellt? Sind Deine EBR-Selects usw. in Ordnung?

Nachdem Du anscheinend so ein schönes abgeschlossenes System hast, würde 
ich es auch mit einer kurzen Simulation probieren. Hier kannst Du sehen, 
ob der erste Befehl tatsächlich aus dem EBR geholt wird.

von Mark K. (mrdigit)


Lesenswert?

Hallo,

erst mal danke für schnelle die Antwort.

> 1)
> eine Initialisierung des EBRs aus dem Flash Inhalt ist auf jeden Fall
> möglich.

Das ist gut zu wissen, ich zweifelte nämlich so langsam daran, obwohl es 
explizit in den Manuals aufgeführt ist, dass man das Programm via Memory 
Initialization in das Bitfile einbetten kann.

> 2)
> es ist eher unwahrscheinlich (aber möglich), dass kein EBR angelegt
> worden ist. Falls ja, muesste es eine diesbzgl. Meldung im Synthese
> Report geben. Ich glaube in dem Memory Abschnitt, kann man die
> hierarchische Pfade zu allen EBRs finden. Vorsichtshalber hier
> nachschauen.

Es werden während der Synthese zwar eine Menge Warnungen ausgegeben, 
aber keine Fehlermeldung. In dem Memory Initialization Tool im ISPLever 
kann ich das EBR auch sehen und die zugehörigen Pfade sind dort auch 
angegeben. Ich wähle das entsprechende EBR an (es gibt noch zusätzlich 
welches für den Cache) und gebe dann den mem-File an, den es beinhalten 
soll. Nach dem Abspeichern erhalte ich die Meldung das die Änderung im 
zugehörigen Place&Route-File abgespeichert wurde. Anschließend wird der 
Bitstream mit diesem File neu generiert. Was mich aber ein wenig wundert 
ist, dass wenn ich das Memory-Tool ein zweites mal aufrufe dort der 
mem-File nicht mehr eingetragen ist. Vielleicht ist das aber auch 
richtig so.

> 3) Woran das liegen kann? Falls 2) in Ordnung ist, tippe ich zunächst
> auf die Startadresse. Welcher Wert hast Du im Microsystem Builder (MSB)
> eingestellt? Sind Deine EBR-Selects usw. in Ordnung?

EBR steht auf der Startadresse 0x00004000, den gleichen Wert habe ich im 
EBA des LM32 angegeben. Adressen hab ich danach im MSB vor der 
Generierung der Verilog-Module gelockt. DRC läuft ohne Fehler durch. Das 
sollte doch so richtig sein?

Wie gesagt, wenn ich das Programm über Eclipse im Debug-Modus oder 
Run-Modus starte, läuft es ohne Probleme. Das spricht doch eigentlich 
dafür, dass die Adressen richtig sind. Muss vielleicht das 
Debug-Interface im LM32 entfernt werden (steht auf Adresse 0x0)?

Ja, ich befürchte auch, dass irgendein EBR-Select nicht richtig desetzt 
ist. Im MSB kann man aber nur Größe und Startadresse des EBR angegeben 
(und Initialisierungs File, dies hat aber den gleichen Effekt, als wenn 
man das über das Memory Tool im ISPLever angibt). Ich erhalte nämlich 
während der Systhese die Warnung, dass in den EBR-Modulen das globale 
Reset (GSR) disabeled ist und man darauf achten soll, dass beim Startup 
Write-Enable und Chip-Enable ebefalls disabled werden, damit der Code im 
EBR nicht beschädigt wird.
Wie kann ich weitere Selects des EBR's vornehmen, wenn es über das MSB 
generiert wurde? Direkt im Verilog-Code?

> Nachdem Du anscheinend so ein schönes abgeschlossenes System hast, würde
> ich es auch mit einer kurzen Simulation probieren. Hier kannst Du sehen,
> ob der erste Befehl tatsächlich aus dem EBR geholt wird.

Ja, habe ich bereits gemacht. Simulation läuft ohne Probleme inklusive 
mem-File. LED-Ausgänge blinken auch in der Simulationsausgabe. 
Allerdings muss man für die Simulation auch die Peripherals des LM32 
austauschen. Anstatt der Black-Box-Modelle für die Synthese (im 
pmi_dev.v), muss man die Behavioral-Modelle für die Simulation benutzen 
(macht natürlich auch Sinn). Insofern ist die Simulation nicht mehr 
identisch mit der Synthese - wodurch man z.B. Punkt 2 nicht 
ausschliessen kann.

von cfgardiner (Gast)


Lesenswert?

Hi,

es ist schon eine Weile her seitdem ich zuletzt etwas mit Mico32 gemacht 
habe. Wegen den Details muesste ich nochmal nachschauen.

Im SW-Developers Guide (so ca. Seite 300 in der Ausgabe von Okt. 2008) 
gibt es eine Anleitung wie man die Memory Files generieren muss. Der 
Abschnitt heisst "Advanced Programming Topics -> Deploying to On-Chip 
Memory"

Hast Du Deine "Memory Initialisation File" auch so generiert?

von Mark K. (mrdigit)


Lesenswert?

Hallo,

> Im SW-Developers Guide (so ca. Seite 300 in der Ausgabe von Okt. 2008)
> gibt es eine Anleitung wie man die Memory Files generieren muss. Der
> Abschnitt heisst "Advanced Programming Topics -> Deploying to On-Chip
> Memory"
>
> Hast Du Deine "Memory Initialisation File" auch so generiert?


Habe ich mir durchgelesen und meiner Meinung nach habe ich das auch 
alles so gemacht wie beschrieben. Eigentlich ist ja gerade die 
Initialisierung eines EBR-Memories nicht besonders kompliziert :(

von cfgardiner (Gast)


Lesenswert?

Hi Mark,

inzwischen habe ich mein Lattice Board ausgegraben und das LED Demo aus 
dem on-chip RAM zum laufen gebracht. Ich weiss nicht, ob ich mich an dem 
Manual gehalten habe aber es lief in etwa ab wie ich es mir vorgestellt 
habe.

Hier vielleicht noch ein Paar Punkte:
1) Im MSB Fenster
-a- "Location of Exception Handler" für den Mico32 muss identisch sein 
mit der Basisadresse des EBRs
-b- Dopple Click auf EBR: Initialisation File muss die Datei sein die 
von der SW-Build angelegt wird. Ggfs. Zeitstempel vergleichen. Ich habe 
File-Format 'Hex' gewählt

2) Nach dem SW Build, Tools -> Software Deployment aufrufen. Hier die 
Mem Init Datei festlegen, die oben unter 1b) verwendet wird.

3) Nachdem der SW Deployment gelaufen ist, FPGA neu synthetisieren. 
Sonst wird die Mem Init Datei nicht im Bitstream übernommen

4) Falls Du vorher z.B. aus ext. Flash+(SD)RAM gelaufen bist, hast Du 
möglicherweise noch ein Code-Copy Stub mitgelinkt. Das brauchst Du beim 
Laufen aus dem internen EBR natürlich nicht

Viel Erfolg.

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hi Mark,

"normalerweise" funktionieren beide Fälle. Als .mem File im MSB oder 
nachträglich mit dem Memorytool.

Das Programm bleibt aber hängen, falls Du irgendwelche printf Kommandos 
noch im Code hast. Diese funktionieren über JTAG nur, wenn per Debugport 
hochgeladen wurde.

Problematisch bei den .mem Files sind zu lange Pfadnamen und Pfade mit 
Leerzeichen. Diese werden von den Tools nicht korrekt übernommen.

In selten Fällen kann das Linkerspript auch auf falsche Adressen zeigen.

Kannst Du evtl. das *.msb und Deinen C-Code hier bitte posten?

Viele Grüße
Arndt

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.