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:
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 ?
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
@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
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 ..
>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.
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