Forum: FPGA, VHDL & Co. Seltsames (UART) Problem


von Gustl B. (-gb-)


Lesenswert?

Hallo,
ich bastel schon länger an einem erät das folgendes macht:

Es bekommt einen Triggerimpuls und dann ein 13-Bit Bitmuster (beides 
TTL) und baut daraus ein Spektrum im RAM. Also die Bitmuster werden nach 
Häufigkeit sortiert.
Dann kann man das Spektrum über UART auslesen was prima funktioniert.

Als neue Funktion ist jetzt noch hinzugekommen, dass das Board jedes 
einzelne Bitmuster in Echtzeit über einen zweiten UART schickt. Und zwar 
mit genauer Zeitinformation wann das Bitmuster angekommen ist. Da 
manchmal Bitmuster schneller ankommen als der UART senden kann, habe ich 
ein 16kB FIFO gebaut (BlockRAM).

Soweit so gut. Das Problem ist jetzt, dass ich hier an meinem 
Schreibtisch das alles schön an den PC anschließe, und alles so 
funktioniert wie es soll. Also ich kann da am Triggerpin wackeln und 
Bitmuster anlegen und bekomme sowohl ein Spektrum im RAM als auch die 
einzelnen Bitmuster über den zweiten UART und es passt auch alles ganz 
genau zusammen, den FIFO kann ich füllen und er wird wieder 
leergeschrieben, alles fein.

Wenn ich das jetzt aber im Keller (da wo die anderen Messgeräte stehen 
die das reale Bitmuster ausgeben) anschließe, dann ist alles etwas 
komisch. Ich bekomme zwar ein Spektrum im RAM, aber der UART schickt 
nicht die einzelnen Bitmuster. Selbst wenn ich anstelle des UART einen 
einfachen Pin als TX nehmen, zeigt mein Logicanalyzer nichts an.

Ich verstehe das nicht, es ist 1:1 der selbe Aufbau, das selbe Bitfile 
für den FPGA, und die Daten komme ja auch an, sonst wäre im RAM kein 
ordentliches Spektrum.

Der eigentliche Witz ist, dass ich den Teil der nur die Bitmuster über 
UART schickt zuerst alleine zum Testen gebaut habe, also gleiches Board 
(Nexys2) nur fehlt eben die ganze andere Logik im FPGA. Tja und wenn ich 
dieses Bitfile lade, dann funktioniert es.
Und eigentlich hatte ich nur den Code genommen und in das größere 
Projekt zusätzlich reingeklebt was ja auch mit simulierten Bitmustern 
prima funktioniert.

Ich bin etwas ratlos, weiß aber auch nicht, was man wissen müsste um mir 
zu helfen, die FPGA Konfiguration will ich eigentlich ausschließen weil 
es doch funktioniert wenn ich einfach so Bitmuster anlege und am 
Triggerpin wackel.
Ich will eher fragen: Habt ihr auch manchmal so krude Situationen? Und 
was sind da die häufigsten Fehler? Sowas wie schlechte Netzteile 
vielleicht oder sonst irgend etwas?

gustl

von meckerziege (Gast)


Lesenswert?

Meistens der Codefehler in Zeile 42

von Gustl B. (-gb-)


Lesenswert?

Dann würde es aber auch unter anderen Bedingungen Fehler geben.

Ich kann natürlich den ganzen Code hochladen, aber das ist richtig viel 
und vermutlich nicht die Ursache.

von Uwe (Gast)


Lesenswert?

Vermutlich doch.
Du mußt bei der Simulation das gleiche Timing und Signale anlegen wie im 
Keller dann wird auch das gleiche passieren. Also ist entweder was im 
Code falsch (die timings der echten Signale passen nicht zum Code) oder 
die Signale im Keller sind unsauber und können auch mit gutem Code nicht 
verarbeitet werden ohne vorher aufbereitet zu werden). Eine schlechte 
Spannungsversorgung könnte aber auch möglich sein bzw. ein schlechtes 
Platinen Layout.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Uwe schrieb:
> Du mußt bei der Simulation das gleiche Timing und Signale anlegen wie im
> Keller dann wird auch das gleiche passieren.
Nicht unbedingt. Man nehme einen asynchronen Eingang und eine FSM, und 
die Realität ist eine ganz andere als die (Verhaltens-)Simulation...

von Gustl B. (-gb-)


Lesenswert?

Naja, der Witz ist doch, dass das Timing und so auch im Keller passen 
muss, weil ich auch da ein richtig schönes Spektrum aufnehmen kann.

Nur die Funktion, die das einzelne Bitmuster mit genauer Zeit über UART 
ausgibt, die funktioniert nicht mehr. Und diese Funktion nimmt das 
Bitmuster natürlich vom selben Eingang die auch die Funktion die das 
Spektrum im RAM baut.

Mir ist das ein Rätsel, weil hier wenn ich das stehen habe und einfach 
am Trigger Pin wackel, dann kommen die Daten auch schön über RS232. Auch 
die Geschwindigkeit passt, der FIFO kann locker ein Bitmuster+Zeit je us 
speichern. Generell benutzen beide Funktionen erstmal die selbe Stufe, 
also Trigger wird einsynchronisiert, nach dessen falling Edge wird 1us 
gewartet und wenn der Trigger dann immer noch unten ist wird das 
Bitmuster übernommen - und dann erst geht es einmal an die Funktion die 
es direkt mit der Zeit verschickt und da die, die da das Spektrum im RAM 
draus baut. Und sogar nochmal an eine Funktion, die das Spektrum im 
VideoRAM baut und auf den Monitor schreibt (was auch funktioniert).

Eigentlich bin ich nur frustriert...

gustl

von Duke Scarring (Gast)


Lesenswert?

Wie lang ist denn Deine UART-Verbindung im Keller? Und wie erzeugst Du 
die passenden Pegel?

Duke

von Gustl B. (-gb-)


Lesenswert?

Es hat sich ja auch nichts getan, als ich das einfach auf einen Pin 
gelegt hatte und den mit dem Logicanalyzer angeguckt habe.

Der "Fehler" war etwas seltsam, aber hatte ich schon mehrmals. Wobei 
Fehler eben nicht sicher ist, weil es ja am Schreibtisch immer 
funktioniert hat.

Also ich hatte ja den Trigger und wenn der gefallen ist, dann wurde bis 
50 gezählt und dann ein anderes Signal für einen Takt lang auf '1' 
gesetzt.

Das habe ich in einer Unterkomponente gemacht und dieses neue Signal 
dann schön mit Port Map in der Hauptdatei weiterverteilt.
Und da war das Problem, ich habe das Signal das ich von der 
Unterkomponente bekam einfach dann wieder an drei Komponenten 
weitergegeben, also genau das gleiche Signal. (Hat ja auch in alles 
Tests funktioniert.)

Geändert habe ich, dass die Unterkomponente drei Signale erzeugt, die 
dann alle rausgereicht werden und jedes der Signale geht dann nur an 
genau eine neue Komponente. Und jetzt geht das. Vermutlich wäre auch 
gegangen, dass ich in der Hauptdatei das eine Signal an drei neue 
übergeben und diese dann an die drei Unterkomponenten verteile.

Jedenfalls seltsam, also klar man könnte sagen jedes Signal darf nur 
einen Start und einen Endpunkt haben und keine Verzweigungen, aber das 
stimmt auch nicht weil es doch sehr oft funktioniert hat.

gustl

von Chong (Gast)


Lesenswert?

So ähnliches Problem hatte ich auch bei UART-Code. Aber bei mir lag der 
Fehler bei Rx_Modul. Der PC schickt immer ein Handshake-Singal zum mein 
System(mit FPGA). Wenn der uart dieses Signal richtig empfängt, erkannt 
mein System die Befehle und fängt er an die Daten zu schicken. Aber wenn 
das Signal falsch empfängt wird, weiß das System gar nicht mehr was es 
machen soll und schickt es natürlich kein Daten weiter.

Und der "3-in-1" Signal-Fehler habe ich leider auch gehabt. Meine 
Meinung ist: Der FPGA kann kein "langes" logische Signal routingen. Wenn 
ein Signal, z.B Daten_WR, überall in den vhdl-Code erscheint, siehst du 
dann in den Routingplan die sogenannte Signals Daten_WR_1, 
Daten_WR_2,..... Normaleweise ist es OK. Aber wenn du von Daten_WR_1 und 
Daten_WR_2 noch zwei weitere Signale erzeugst und die beide Signale 
unbedingt unter ein exakt Timing bearbeitet werden müssen, dann hast du 
ein Problem.

Meine Lösung ist: alle interne logische verknüpfte Signale werden in die 
"process" zugeordnet und mit System Takt synchronisiert. Und die FPGA 
Einstellung "Fanout-limit" erhöhen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Chong schrieb:
> Meine Lösung ist: alle interne logische verknüpfte Signale werden in die
> "process" zugeordnet und mit System Takt synchronisiert.
Das gibt dann zwar einen Takt Latency, aber dafür kann Register 
Duplication angewendet und so der Fan-Out eines einzelnen Flipflops 
reduziert werden...
http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/pp_db_xilinx_specific_options.htm

von Gustl B. (-gb-)


Lesenswert?

Das Seltsame war halt, dass das doch richtig geroutet war, sonst hätte 
es ja nie funktioniert. Aber wenigstens was gelernt dabei.

Mit ISE 14.1 bin ich auch erstmal gestolpert als nichts mehr ging und 
dann hab ich gesehn, dass ich die Pins in der .ucf Datei noch nicht 
auskommentiert hatte. Das alte 13.x hat da immer einen Fehler gebracht 
und keinen Bitstream gebaut, das 14.1 macht es trotzdem und der geht 
dann nicht wie er soll.

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.