Hallo alle,
ich mache gerade einen ersten Versuch mit einem MachXO2 Pico Board, auf
diesem befindet sich ein MachXO2 im BGA-Gehäuse. Ich verwende den vom
USB-Chip abgezweigten 12MHz-Takt, der an Pin A7 "PT12A/PCLKT0_1"
eingespeist wird. Auch versuchshalber mal die PLL als Clock-Regenerator
benutzt hat auch nichts geändert.
Problem: Eine Situation im MachXO2 gebe ich als Puls mit einem Takt
Länge auf einem Pin auf der Steckerleiste aus. Den Pin habe ich schon
gewechselt, alle verhalten sich gleich: Es ist kein schöner Impuls
sondern ein heftiges Schwingen bei ca. 80MHz. Siehe Bild, oben mein
Puls, unten der PLL-regenerierte Takt auf einen Ausgang gelegt.
Gleiches Verhalten auch wenn ich in der Pinkonfiguration verschiedene
Modis einstelle, z.B. Pullup/-down eingestellt. Das Bild ist mit
LVCMOS33 auf Pin D1 "PL3B/PCLKC3_2" aufgenommen.
Oszi ist ein HP54615B und Tastkopf PML711A (500MHz) von PMK. Ich kann
andere Signale ohne Probleme messen, an diesen Teilen liegt es also
nicht.
Was muß ich tun um hier einen halbwegs sauberen Puls zu bekommen?
Danke für jede Hilfe, Günter
Günter (dl4mea) schrieb:> Was muß ich tun um hier einen halbwegs sauberen Puls zu bekommen?
Den Fehler finden :-)
Ne, im Ernst:
Du kannst deinen PLL-Ausgang auf einen beliebigen Pin ausgeben und alles
sieht erwartungsgemäß aus?
Du kannst deinen Impuls auf einen beliebigen Pin ausgeben und er sieht
schrecklich aus?
Dann würde ich jetzt erstmal vermuten, dass es an der Art und Weise
liegt, wie du diesen Puls generierst. An der Hardware wird es eher nicht
liegen, wenn du den PLL Takt ausgeben kannst.
Daher wäre es hilfreich, wennn du deinen Code mal postest.
Oder es könnte noch am Messaufbau liegen.
Alle Massen richtig angeschlossen?
Hallo Schlumpf,
offenbar hast du den Punkt getroffen. Da ich meinen Original-Code nicht
posten wollte habe ich kurz eine Demo aufgesetzt (siehe unten) und da
kommt ein schöner Puls raus. Siehe erster Screenshot.
Im zweiten hab ich mit der PLL mal 144MHz gemacht um den Puls kürzer zu
machen. Zweiter Screenshot. Und weils gerade Spaß gemacht hat, aber
eigentlich nichts mit dem Problem zu tun hat, die 144MHz am
Spektrumanalyzer angeschaut. Drittes Bild.
Im Original wird ein Pattern detektiert und über Kombinatorik (außerhalb
des Taktes) erkannt. Scheinbar ist da der Fehler zu suchen. Jetzt weiß
ich wenigstens wo ich ansetzen muß. Die Simulation schaut hier aber
total gut aus...
Danke für deine Hilfe. Den Demo-Code poste ich auch mal, vielleicht
hilfts dem einen oder anderen auch.
Schönen Sonntag noch, Günter
1
LIBRARYieee;
2
USEieee.std_logic_1164.all;
3
useieee.numeric_std.all;-- for unsigned, integer, conversions
Günter (dl4mea) schrieb:>> Im Original wird ein Pattern detektiert und über Kombinatorik (außerhalb> des Taktes) erkannt. Scheinbar ist da der Fehler zu suchen. Jetzt weiß> ich wenigstens wo ich ansetzen muß. Die Simulation schaut hier aber> total gut aus...>
Vermutlich hast du eine combinitorische Loop gebaut (bzw Latch). Da
deren Verhalten von Signallaufzeiten abhängt sieht man es in einer
functionalen Simulation eventuell nicht.
In einer Post P&R Simulation sollte es jedoch zu sehen sein.
Combinitorische Loops und Latches produzieren jede menge Warnungen,
schau dir den Syntheserepoert genau an.
Verwende Massefedern an deinen Probes statt die Masseclips irgendwo
anzuschliessen. Das vermeidet dass sich hier manche an den hässlichen
Überschwingern stören.
Hallo Günter,
gerne geschehen.
Kannst ja mal deinen Synthese-Report nach dem Stichwort (Warning)
"Combinatorial Loop" durchsuchen.
Könnte sein, dass du synchron zum Takt ein Signal erzeugst, welches
einen Takt lang gültig ist.
Mit diesem Signal gehst du in eine Kombinatorik (deine
Patternauswertung).
Und eventuell geht einer der Ausgänge dieses kombinatorischen Teils
wieder als Eingang zurück in die Kombinatorik.
Ganz simples Beispiel hierfür wäre:
Ein NAND an dem ein Eingang an ein synchrones Steuersignal verbunden ist
und der andere Eingang mit dem Ausgang des NAND verbunden ist.
Dann schwingt das Teil, solange das synchrone Steuersignal High ist.
Schätze mal, dass du sowas in der Art gebaut hast.
Hallo Schlumpf,
ich hab noch gesucht nach der Slewrate. Aber ich vermute fast die ist
bei 3.3V VCCIO nicht einstellbar.
Um es 'richtig' zu machen habe ich im Spreadsheet-View bei den Global
Preferences Bank VCCIO auf 3.300 eingestellt - und in den Port
Assignements dann LVTTL33 oder LVCMOS33. Zuvor waren da 2.5V
eingestellt, und da gibt es dann in den Port Assignments eine
Möglichkeit für Slew Rate, die es bei 3.3V nicht mehr gibt. Fühl mich
aber mit der 3.3V-Einstellung irgendwie wohler...
Übrigens ändert sich am Ausgang nichts egal ob ich LVTTL33 oder LVCMOS33
einstelle, die Überschwinger bleiben.
Und wegen der kombinatorischen Loop: Ich erinnere mich dass da irgendwo
eine Fehlermeldung war :) Finde das aber jetzt auf die schnelle nicht
mehr. Wenn sie wieder kommt, werd ich sie gebührend begrüssen.
VG Günter
Schlumpf schrieb:> Ein NAND an dem ein Eingang an ein synchrones Steuersignal verbunden ist> und der andere Eingang mit dem Ausgang des NAND verbunden ist.
Pretty simple: Edge Detector, aber die Zuweisung ans <signal>_tm1 stand
nicht unter dem Clock-Prozess...
Günter (dl4mea) schrieb:>> Übrigens ändert sich am Ausgang nichts egal ob ich LVTTL33 oder LVCMOS33> einstelle, die Überschwinger bleiben.
Liegt zu 99% daran wie due die Masse der Probes verbindest. Nochmal,
verwende Massefedern zum Aufstecken auf die Probespitze, und greife die
Masse möglichst nah am zu messenden Signal ab.
Günter (dl4mea) schrieb:> ich hab noch gesucht nach der Slewrate.
Die Slewrate ist definitiv nicht dein Problem..
Günter (dl4mea) schrieb:> Und wegen der kombinatorischen Loop: Ich erinnere mich dass da irgendwo> eine Fehlermeldung war :)
Lagen Lattice User und ich offensichtlich nicht ganz daneben ;-)
Günter (dl4mea) schrieb:> Pretty simple: Edge Detector, aber die Zuweisung ans <signal>_tm1 stand> nicht unter dem Clock-Prozess...
Heißt jetzt konkret was?
Hallo,
schreib es mal meiner Unerfahrenheit zu daß in der C++-Programmierung
häufig Warnings einfach ignoriert werden (naja, nicht ganz...)
Also es war folgendes (falsch):
1
-- edge detection capabilites
2
pattern_detected_tm1<=preamble_detected;
3
4
-- decode the pattern
5
pattern_detected:=...pattern_condition_1...
6
and...pattern_condition_2...
7
and...pattern_condition_3...
8
andnotpattern_detected_tm1;
9
10
IFrising_edge(clk)then
11
12
-- debounce input
13
in_port_tm1<=in_port;
14
in<=in_port_tm1;
Richtigerweise gehört das edge detection halt einfach einen Clock später
1
-- decode the pattern
2
pattern_detected:=...pattern_condition_1...
3
and...pattern_condition_2...
4
and...pattern_condition_3...
5
andnotpattern_detected_tm1;
6
7
IFrising_edge(clk)then
8
9
-- edge detection capabilites
10
pattern_detected_tm1<=preamble_detected;
11
12
-- debounce input
13
in_port_tm1<=in_port;
14
in<=in_port_tm1;
Ganz klar die von Schlumpf beschriebene Schleife um ein NAND-Gatter.
In der Simulation hab ich das nicht gesehen.
Und wie schon geschrieben, das entsprechende Warning übersehen.
Lessons learned halt eben.
Schönen Sonntag noch, Günter
Günter (dl4mea) schrieb:> Richtigerweise gehört das edge detection halt einfach einen Clock später>>
1
>-- debounce input
2
>in_port_tm1<=in_port;
3
>in<=in_port_tm1;
4
>
Nebenbemerkung: Bitte keine Schlüsselwörter als identifier verwenden. Im
source oben ist das für die Portrichtung reservierte Wort "in" als
Signal- oder port-name benutzt. Auch wenn das kein Fehler ist, es bringt
den Syntaxhighlight und style-checker durcheinander.
MfG