Forum: FPGA, VHDL & Co. VHDL OneWire Bus - einfache Variante


von Christian Heinz (Gast)


Lesenswert?

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!

von Thomas (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

was du schreibst klingt logisch, aber warum machst du nich pullup + 
opencollector, das is 1. üblicher & 2. kurzschlusssicher.

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


Lesenswert?

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?

von Thomas (Gast)


Lesenswert?

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.

von woko (Gast)


Lesenswert?

wie willst du vorgehen, wenn plötzlich beide zugleich senden wollen? Das 
solltest du verhindern, sonst sind die Datenpakete hinüber...

sg,
Wolfgang

von elko (Gast)


Lesenswert?

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.

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


Lesenswert?

> 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... :-/

von Matthias G. (mgottke)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.