Guten Morgen zusammen, ich hätte eine Verständnisfrage zum UART-Core von Altera Cyclone IV. In der Dokumentation dazu steht ja geschrieben, das ankommende Datenblöcke zurerst ins Shift-Register gelangen und von dort ins Holding-Register geshiftet werden. Aus Letzterem werden sie dann auch ausgelesen und nach dem Auslesen ist das Holding-Register leer. Doch was ist mit dem Shift-Register? Mal angenommen es werden irrtümlich zwei Datenblöcke geschickt. Im Zustand 1 befindet sich Datenblock 1 im Holding-Register und Datenblock2 im Shift-Register. Nun wird das Holding-Register ausgelesen und danach sofort die UART-Schnittstelle geschlossen (z.B. durch die Software oder durch einen Fehler). Nun ist das Holding-Register durch das Auslesen geleert, doch was ist mit dem Shift-Register? Hält es das Datenblock2 solange bis in einem neuen Stream ein neuer Datenblock ankommt? Für den Fall das es so ist, wie könnte man den das Shift-Register wieder löschen? Ich frage gerade, weil ich versuche mittels FPGA eine UART-Schnittstelle zu einem Host-Rechner zu implementieren. Der verkehrende Datenstream verläuft dabei über ein externes USB-Modul, dessen Rx- und Tx-Pins den GPIOs meines Cyclone IV verbunden sind. Mein Problem ist jetzt folgendes, sobald ich die Versorgung auf das USB-Modul schalte, sendet und empfängt es bereits Daten. Und ich vermute, dass der Datenblock, der zum FPGA gesendet wird, im Shift-Register gespeichert wird. Meine Vermutung beruht darauf, dass wenn ich die UART-Verbindung aufbaue und Daten an mein FPGA sende, mein geschriebener Datenbuffer an seiner ersten Stelle bereits mit einem Datenblock (den ich nicht gesendet habe) belegt ist.
Robert M. schrieb: > Nun ist das Holding-Register durch das Auslesen geleert, doch was ist > mit dem Shift-Register? Definiere "leer". Wie sollte denn ein "leeres" Flipflop aussehen? > Und ich vermute, dass der Datenblock, der zum FPGA gesendet wird, im > Shift-Register gespeichert wird. Meine Vermutung beruht darauf, dass > wenn ich die UART-Verbindung aufbaue und Daten an mein FPGA sende, mein > geschriebener Datenbuffer an seiner ersten Stelle bereits mit einem > Datenblock (den ich nicht gesendet habe) belegt ist. Rätselstunde... Wie wäre es, wenn du mal untersuchst, warum da was versendet wird? Fazit insgesamt: Du denkst viel zu abstrakt und softwarelastig. Da ist im FPGA nicht irgendein unbestimmter Buffer, der irgendwelche zufälligen Daten auf nicht nachvollziehbare wunderbare Weise versendet. Sondern da sind lediglich Flipflops, die genau das tun, was ihnen die vorgeschaltete Kombinatorik sagt. Wenn da also was versendet wird, gibt es einen definierten Grund dafür. Denn schon nach dem Anlegen der Versorgung an ein FPGA wird die Konfiguration aus dem Flash geladen und mit durchaus definierten Werten die Arbeit aufgenommen.
Lothar M. schrieb: > Robert M. schrieb: >> Nun ist das Holding-Register durch das Auslesen geleert, doch was ist >> mit dem Shift-Register? > Definiere "leer". Wie sollte denn ein "leeres" Flipflop aussehen? Ja dann ist es nicht "leer", sondern auf Low-Pegel? Ist es denn für gewöhnlich so, dass wenn man das UART initialisiert, als erstes das Low-Pegel aus dem Register gelesen wird?
Robert M. schrieb: > Ja dann ist es nicht "leer", sondern auf Low-Pegel? Ich vermute eher, dann gibt es irgendwo ein zusätzliches Bit, das den Inhalt (egal welchen) als "leer" markiert... > Ist es denn für gewöhnlich so, dass wenn man das UART initialisiert, als > erstes das Low-Pegel aus dem Register gelesen wird? Aus welchem Register? Mein Vorschlag: schreib einfach selber mal ein kleines RS232 Modul. Dann wird dir das recht schnell klar, wie da irgendwelche Buffer miteinander interagieren könnten. Nim z.B. mal das da: http://www.lothar-miller.de/s9y/categories/42-RS232 Dort gibt es das "Holding" Register nicht. Das Schieberegister wird direkt auf den Ausgang abgebildet. Wenn ich da so ein "Holding" Register wollte, dann müsste ich diese kleine Änderung machen:
1 | :
|
2 | :
|
3 | -- Empfangen
|
4 | process begin |
5 | wait until rising_edge(CLK); |
6 | rxd_sr <= rxd_sr(rxd_sr'left-1 downto 0) & RXD; |
7 | if (rxbitcnt<9) then -- Empfang läuft |
8 | if(rxcnt<(Quarz_Taktfrequenz/Baudrate)-1) then |
9 | rxcnt <= rxcnt+1; |
10 | else
|
11 | rxcnt <= 0; |
12 | rxbitcnt <= rxbitcnt+1; |
13 | rxsr <= rxd_sr(rxd_sr'left-1) & rxsr(rxsr'left downto 1); |
14 | end if; |
15 | else -- warten auf Startbit |
16 | RX_Data <= rxsr; -- mit dieser Änderung werden die empfangenen Daten nochmal gepuffert |
17 | if (rxd_sr(3 downto 2) = "10") then |
18 | rxcnt <= ((Quarz_Taktfrequenz/Baudrate)-1)/2; |
19 | rxbitcnt <= 0; |
20 | end if; |
21 | end if; |
22 | end process; |
23 | |
24 | RX_Busy <= '1' when (rxbitcnt<9) else '0'; |
Und wie gesagt verbleibt noch die Frage: welche Daten werden in deinem Fehlerfall warum versendet?
Hier habe ich gerade ein Artikel über einen Uart mit Puffer(FIFO) geschrieben. Da geht nichts verloren. http://www.dossmatik.de/ghdl/GHDL_uart_sim.pdf http://www.dossmatik.de/ghdl/UART.zip
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.