Hallo, ich hoffe ihr könnt mir weiterhelfen. Mein Problem liegt gerade ehr beim Verständnis! Ich habe 2 FPGA Board mit jeweils einem Netzwerk aus MicroBlazes. Diese Boards sollen über eine Serielle Schnittstelle kommunizieren. Habe aus Hardwarerestriktionen nur ein Pin bzw. Kabel zur Verfügung. Von der Sache ist mein Problem recht simple. Ich möchte über die Schnittstelle 32bit Wörter versenden. Das Serializieren ist schon realisiert. Bevor ich aber meine einzelnen Bits auf die "Reise schicke", muss ich überprüfen ob der Empfänger auch wieder bereit ist diese zu empfangen. Meine Idee war es mit einem Tristate Driver (INOUT Port) und einem Pull Down die Leitung Standard mäßig auf Null zu halten. Bei einem Sendewunsch sende ich für einen Takt eine 1. Jetzt müsste der Sender Output abgestellt werden und am Eingang gelauscht werden. Der Empfänger soll nach dem er die 1 bekommen hat mit einer 1 Antworten. Dann werden die Daten versendet. Beim Sender halte ich außer wenn Daten übertragen werden müssen, dass Signal auf Z. Also müsste doch durch den Pull Down nach dem die 1 gesendet wurde, mein serielle Leitung wieder auf 0 abfallen, oder? Weil nur so kann ich ja die Antwort 1 erkennen. Vielen Dank!
Hi! Vielleicht verstehe ich da was nicht!? Wenn Du eine 1 für einen Takt sendest musst Du ja nach dem Takt wieder eine 0 anlegen. Wozu brauchst Du dann den Pull-Down? Müsste die Leitung nicht auf 'Z' abfallen? Bei 0 Kommst Du in einen undefinierten Zustand. LG Thomas
was du schreibst klingt logisch, aber warum machst du nich pullup + opencollector, das is 1. üblicher & 2. kurzschlusssicher.
Thomas schrieb: > Müsste die Leitung nicht auf 'Z' abfallen? Was ist 'Z'? Wie kann man diesen Pegel ins FPGA einlesen? > Vielleicht verstehe ich da was nicht!? Kann sein... ;-) Christian Heinz schrieb: > Dann werden die Daten versendet. Soll die Übertragung bidirektional sein? Welche Übertragungsrate willst du? > Bei einem Sendewunsch sende ich für einen Takt eine 1. Von welchem Takt? Haben beide FPGAs den selben Takt?
Wenn Du Daten an einen Eingang senden willst, der auch als Ausgang dienen soll muss er vorher auf Hochohmig (Z) gesetzt werden. Bei Bidirektionalen hat man sonst 0 bzw. 1 anliegen und kann nichts reinsenden.
wie willst du vorgehen, wenn plötzlich beide zugleich senden wollen? Das solltest du verhindern, sonst sind die Datenpakete hinüber... sg, Wolfgang
Guck dir doch mal den CAN-Bus an. Wenn ich das bisher richtig verstanden habe, ist das auch ein 1-Draht-Bus, der Kollisionen zuverlässig erkennen kann. Vielleicht kannst du dir ja was gutes abgucken? Ich glaube, gelesen zu haben, dass der Sender selber mitliest, was er sendet. Stimmt das nicht mit dem überein, was er senden wollte, so wollte ein anderer gleichzeitig senden.
> auch ein 1-Draht-Bus, der Kollisionen zuverlässig erkennen kann. Nicht nur das. Wenn eine Kollision erkannt wird, geht der Sender, der das rezessive Bit gesendet hat, freiwillig vom Bus, und die Übertragung geht weiter. Aber noch immer sind ein paar Fragen aus dem Beitrag "Re: VHDL OneWire Bus - einfache Variante" unbeantwortet... :-/
Insgesamt ist zu wenig über die Anwendung bekannt. Eine weitere wichtige Frage: Master-Slave-Kommunikation oder Multi-Master. Bei letzterem wird es schon spannender. Vor allem wenn hohe Datenraten benötigt werden.
Vielen Dank für die Antworten! Ich möchte versuchen meine Anwendung im groben zu erklären: Es geht um eine serielle Schnittstelle. Die Datenpakete laufen nur in eine Richtung, sprich es gibt einen Sender und nur einen Empfänger (Point-to-Point Verbindung). Der Empfänger sitzt dabei auf einem anderen FPGA. Beide Chips sind über einen Bus verbunden, also haben den selben Takt. Mein Problem sieht somit folgender Maßen aus: Der Sender nimmt sich ein 32bit Paket aus einem FiFO und schickt es seriell bitweise über den Bus. Empfänger bekommt es und schiebt das zusammengesetzte 32bit Wort in einen FiFo. Jetzt gibt es aber den Fall, das der Empfänger FiFo voll ist, sprich Empfänger kann keine neuen Daten empfangen. Dies bekommt der Sender aber nicht mit! --> evtl. Datenverlust Meine Idee war jetzt die Ports jeweils als IO zu konfigurieren. Sender sendet ganz normal, falls der Empfänger aber nicht bereit ist, soll er das Signal ändern (z.B. auf Null ziehen). Und an diesem Punkt stehe ich jetzt und komme nicht weiter. Funktioniert es, dass der Sender ein bit überträgt und gleichzeitig prüft ob das bit auch auf der Leitung anliegt, oder ob der Empfänger es verändert hat? Wie ist das zu realisieren?
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.