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?
Günter (dl4mea) schrieb: Stellt man die SLEWRATE für die outputs auf FAST kommt es zu Über/Unter-schwingern. Versuch es mal mit SLEWRATE=SLOW. http://www.latticesemi.com/~/media/Documents/ApplicationNotes/MO/MachXO2sysIOUsageGuide.pdf S.9 Treiberstärke runter stellen könnte auch helfen. (S.12) MfG,
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 | LIBRARY ieee; |
2 | USE ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; -- for unsigned, integer, conversions |
4 | |
5 | LIBRARY lattice; |
6 | USE lattice.components.all; |
7 | |
8 | --------------------------------------------------------------------------------------
|
9 | |
10 | ENTITY Clock_Demo IS |
11 | PORT
|
12 | (
|
13 | clk_in : in std_logic; |
14 | clk_out : out std_logic; |
15 | pulse_out : out std_logic |
16 | );
|
17 | |
18 | END Clock_Demo; |
19 | |
20 | --------------------------------------------------------------------------------------
|
21 | |
22 | ARCHITECTURE behavior OF Clock_Demo IS |
23 | |
24 | signal clk : std_logic; |
25 | signal count : natural range 0 to 11 := 0; |
26 | |
27 | BEGIN
|
28 | |
29 | -- Additional Components --
|
30 | ---------------------------
|
31 | |
32 | myPLL : entity work.pll_12in144out (Structure) |
33 | port map |
34 | (
|
35 | clki => clk_in, |
36 | clkop => clk |
37 | );
|
38 | |
39 | |
40 | PROCESS (clk) BEGIN |
41 | |
42 | -- Interconnection Signals that are routed to output pins
|
43 | clk_out <= clk; |
44 | |
45 | IF rising_edge(clk) then |
46 | |
47 | -- clock phase counter
|
48 | if count < 11 then |
49 | count <= count + 1; |
50 | else
|
51 | count <= 0; |
52 | end if; |
53 | |
54 | end if; |
55 | |
56 | END PROCESS; |
57 | |
58 | pulse_out <= '1' when count=0 else '0'; |
59 | |
60 | END behavior; |
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?
Günter (dl4mea) schrieb: > Und wegen der kombinatorischen Loop: Ich erinnere mich dass da irgendwo > eine Fehlermeldung war :) Das wäre ein absolutes KO für das Design. So eine kombinatorische Schleife versteckt sich auch gern mal hinter einem Latch: http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
:
Bearbeitet durch Moderator
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 | and not pattern_detected_tm1; |
9 | |
10 | IF rising_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 | and not pattern_detected_tm1; |
6 | |
7 | IF rising_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
Auch wenn ich in dem von dir geposteten Codeschnipsel keine Combinatorial Loop erkennen kann, wenn der Hinweis geholfen hat, dann ist ja gut ;-)
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
Günter (dl4mea) schrieb: >
1 | > ENTITY Clock_Demo IS |
2 | > PORT |
3 | > ( |
4 | > clk_in : in std_logic; |
5 | > clk_out : out std_logic; |
6 | > pulse_out : out std_logic |
7 | > ); |
8 | > END Clock_Demo; |
9 | |
10 | > PROCESS (clk) BEGIN |
11 | >
|
12 | > -- Interconnection Signals that are routed to output pins |
13 | > clk_out <= clk; --!!!!MISSPLACED |
14 | >
|
15 | > IF rising_edge(clk) then |
16 | > -- clock phase counter |
17 | > if count < 11 then |
18 | > count <= count + 1; |
19 | > else |
20 | > count <= 0; |
21 | > end if; |
22 | > end if; |
23 | > END PROCESS; |
24 | |
25 | >
|
Die Signalzuseisung "clk_out <= clk;" innerhalb eines Process gehört da nicht hin. MfG,
Fpga Kuechle schrieb: > Die Signalzuseisung "clk_out <= clk;" innerhalb eines Process gehört da > nicht hin. Sorry wenn ich jetzt frage: Wohin dann?
Günter (dl4mea) schrieb: > Sorry wenn ich jetzt frage: Wohin dann? Einfach Concurrent irgendwo hin:
1 | -- hierhin
|
2 | clk_out <= clk; |
3 | |
4 | PROCESS (clk) BEGIN |
5 | |
6 | IF rising_edge(clk) then -- nur die Taktabfrage gehört in einen getakteten Prozess |
7 | -- und allerhöchstens noch ein zugehöriger asynchroner Reset
|
8 | -- clock phase counter
|
9 | if count < 11 then |
10 | count <= count + 1; |
11 | else
|
12 | count <= 0; |
13 | end if; |
14 | |
15 | end if; |
16 | |
17 | END PROCESS; |
18 | |
19 | -- oder hierhin
|
20 | clk_out <= clk; |
21 | |
22 | pulse_out <= '1' when count=0 else '0'; |
23 | |
24 | -- oder hierhin
|
25 | clk_out <= clk; |
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.