Forum: FPGA, VHDL & Co. MICO32 - Probleme mit 32Bit GPIO


von Reini (Gast)


Lesenswert?

Hallo,

Ich hab's jetzt endlich geschafft, dass der MICO32 einigermaßen läuft. 
Allerdings ist mir aufgefallen, dass der Core abstürzt wenn ich alle 
Bits eines GPIO-Ports auf '1' setzen möchte. Der Port hat nur Ausgänge 
mit insgesamt 32 Bit.

Die Kurzform meines C-Codes sieht folgendermaßen aus:
1
MicoGPIOCtx_t *port1 = (MicoGPIOCtx_t *) MicoGetDevice("port1");
2
3
MICO_GPIO_WRITE_DATA(port1,0x00000000); // Funktioniert
4
MICO_GPIO_WRITE_DATA(port1,0x00000001); // Funktioniert
5
MICO_GPIO_WRITE_DATA(port1,0xFF000000); // Funktioniert
6
MICO_GPIO_WRITE_DATA(port1,0xFFFFFFFF); // Funktioniert NICHT

Vielleicht hat ja jemand eine Idee. Bin für jeden Tipp dankbar.

Reini

von Duke Scarring (Gast)


Lesenswert?

Was hängt denn am GPIO dran? Hast Du vielleicht den Reset drangehangen?
Ich würde mal jedes Pin/Bit einzeln testen.

Duke

von Reini (Gast)


Lesenswert?

Okay, der MICO32 hat zwar einen 32Bit Ausgang, im Design sind im Moment 
allerdings nur die unteren 18Bit mit einem Pin (über Output Buffer) 
verbunden.
Das sollte aber keine Rolle spielen, denke ich.

Das Programm beginnt im Falle eines Absturzes von vorne mit dem 
Programmlauf, oder springt irgendwohin und bleibt dort hängen.

Für mich deutet das auf irgendwelche Zeiger-Probleme hin. Kann ich das 
irgendwie rauskriegen ?

von bko (Gast)


Lesenswert?

@Reini:

Probier es mal so oder ähnlich,
1
MICO_GPIO_WRITE_DATA(port1,0x00000001); 
2
MICO_GPIO_WRITE_DATA(port1,0xFF000007);
3
MICO_GPIO_WRITE_DATA(port1,0xFF00001F); 
4
MICO_GPIO_WRITE_DATA(port1,0xFF00003F);
5
MICO_GPIO_WRITE_DATA(port1,0xFF0000FF);
6
MICO_GPIO_WRITE_DATA(port1,0xFF0003FF);
7
  usw. bis 
8
MICO_GPIO_WRITE_DATA(port1,0xFFFFFFFF);
wenn dies ohne Absturz geht, aber nicht mit dem Code aus deinem
ersten Posting, hast du vielleicht ein  Problem damit, das zu viele
Ports gleichzeitig umschalten (auf amerikanisch: SSO-noise)
Das erzeugt evtl. kurze Einbrüche auf der Versorgung,
und lässt die Logik kurz mal entgleisen ...

Bei Lattice kenne ich mich nicht so genau aus, bei Xilinx
gibt es die sog. SSO-Guidelines, das sind Tabellen welche
darstellen wieviele Pins zwischen einem VDD/GND Paar
bei welcher Treiberstärke (4,8 12,.. mA) gleichzeitig Schalten
dürfen, das ist bei Lattice wahrscheinlich ähnlich.

Bei Lattice hab ich unter dem Stichwort "SSO guidelines" z.B.: dies
 da gefunden:
http://www.latticesemi.com/forums/forum/messageview.cfm?catid=964&threadid=12557&enterthread=y

von Reini (Gast)


Lesenswert?

@bko

Danke für den Tipp.

Ich hab jetzt folgenden Test gemacht:
Habe auf den Port folgende Werte geschrieben: 0x0, 0x1, 0x2 etc., also 
ein einfacher Inkrement.
Das geht gut bis 0x7FF. Bei 0x800 steigt der MICO aus.
Das gleiche passiert wenn ich mich von oben annähere:
0x1001, 0x1000 ist in Ordnung. Bei 0xFFF ist wieder Schluss.
Es sieht also so aus, als ob ein bestimmtes Bit ein Rolle spielen würde.

Möglicherweise taucht das ganze bei den höherwertigen Bits nochmal auf. 
Hab das noch nicht getestet.

Kann mir jedenfalls noch keinen Reim drauf machen.

Gibts irgendeine spezielle Einstellung, die besonders wichtig ist und 
von mir übersehen wurde?

Gruß
Reini

von bko (Gast)


Lesenswert?

dein Beispiel bestätigt meine Vermutung, denn z.B. bei Wechsel
von 0x7FF auf 0x800 schalten auch wieder  12 Out-Ports gleichzeitig!
Das könnte Störungen auf der Spannungsversorgung verursachen.

Wenn deine Ports nicht schnell sein müssen:
  - "Slow Slew" bei den Outputs einstellen.
  - die Treiberstärke (drive strength) reduzieren
   Ich denke das muss auch bei den Lattice-Tools für jeden Pin
   extra einstellbar sein.
oder oder und   :)
wenn dein Pinning es zulässt dann nimm für deinen 32-Bit-
   Bus Ausgänge die weiter voneinander entfernt liegen.

Was hängt an deinen Ausgängen, und was für ein Board benutzt du ?

Eventuell ist bei deinem Board auch die Versorgung das Problem
  - sind an jedem VCC/Ground Pin die richtigen Blockkondensatoren ?
  - sind diese nahe genug am Chip ?
  - wie sehen die Versorgungen aus ?

 hierzu auch die Doku von Lattice durchlesen ..

von Karl (Gast)


Lesenswert?

>Okay, der MICO32 hat zwar einen 32Bit Ausgang, im Design sind im Moment
>allerdings nur die unteren 18Bit mit einem Pin (über Output Buffer)
>verbunden.
>Das sollte aber keine Rolle spielen, denke ich.

Naja, Versuch macht kluch! Häng doch einfach den Rest auch mal an Pins, 
so dass garantiert nichts weg"optimiert" wird und versuch nochmal. Ist 
jetz ja nicht der riesen Aufwand.

von Reini (Gast)


Lesenswert?

Habs gefunden.

Verantwortlich für den Fehler war ein VHDL-Block (der mir bereits 
mehrfach Kummer bereitet hatte). Damit werden DVI-Bildparameter 
bestimmt. Unter anderem auch die Pixelfrequenz. Das ganze wird asynchron 
ausgemessen. Aus irgendwelchen Gründen scheint das Synthese-Tool hier 
ein Problem zu haben und schießt dann entweder das komplette Design in 
die Tonne, oder es funktioniert scheinbar mit sporadischen, 
unerklärbaren Fehlern (siehe oben). Mit den Tools anderer großer 
Hersteller gabs hier noch keine Probleme.

Trotzdem gelten natürlich die Tipps, die bko gemacht hat (stabile 
Versorgungsspannung etc.).

Vielen Dank für die Hilfe.


Gruß
Reini

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.