Hallo, kann mir jemand einen Tipp oder ein Beispiel geben wie man zwei bzw. mehrere serielle Datenströme mit jeweils eigener Clock mittels VHDL multiplexen kann? (Bin Anfänger damit und versuche gerade Anhaltspunkte zusammenzusuchen um das Konzept dahinter zu verstehen). Also angenommen 2x je 8 bit streams zu einem zusammenzufassen. Ich stelle mir das vom Input so vor: Input 1: 8 Bit Input 2: 8 Bit Output 1: 12 Bit interleaved, jeder Kanal fügt ggf. einen Prefix beim Datenstrom hinzu woher dieser kommt, aber wie man das in VHDL umsetzt ist für mich noch nicht klar... Wenn man das in der Praxis anders macht bitte darauf hinweisen, ich versuch wie gesagt das irgendwie zu lernen auch wenn noch ein ganzer Berg vor mir ist...
Stell Dir vor, Du müsstest eine Handvoll Arbeiter einweisen, genau das zu leisten, Daten abzuholen, sie markieren und wechselseitig zum Ausgang geben. Die Arbeiter müssten wissen, wann was Neues da ist, was sie auf die Daten draufschreiben sollen und wann sie dran sind, was auf den Ausgang zu geben. Wenn du das formulieren kannnst, malst du die Schaltung hin. Und dann hast du die Lösung.
Martin schrieb: > Wenn man das in der Praxis anders macht bitte darauf hinweisen Dazu müsste man mehr zum "das" wissen: Quelle, Ziel, Datenraten, Taktfrequenzen...
Als Quelle würde ich einfach mal einen billigen Funktionsgenerator nehmen der 10101010101 (ohne Synchronisation) mit z.B 10 MHz ausgibt. Es geht mir ja in erster Linie darum das Konzept dahinter zu verstehen. Bei der Ausgabe vom FPGA würde ich dann einen USB Chip (z.B FX2) verwenden. Ich stehe da noch ganz am Anfang...
Martin schrieb: > Bei der Ausgabe vom FPGA würde ich dann einen USB Chip (z.B FX2) > verwenden. Naja, nimm gleich den FX3, wenn Du was neues machst. Der ARM ist wesentlich angenehmer zu debuggen als der 80C51...
Martin schrieb: > Ich stehe da noch ganz am Anfang... Von WAS denn? WAS soll denn das Ganze letztendlich geben? Ein USB-Wandler gibt ja keinen kontinuierlichen Bitstrom, sondern Daten entsprechend einem Protokoll aus.
Lothar Miller schrieb: > Martin schrieb: >> Ich stehe da noch ganz am Anfang... > Von WAS denn? WAS soll denn das Ganze letztendlich geben? > > Ein USB-Wandler gibt ja keinen kontinuierlichen Bitstrom, sondern Daten > entsprechend einem Protokoll aus. Wiegesagt von einem Funktionsgenerator (1010101010...) also der Input ist nicht sinnvoll, Ausgabe soll am PC ein 8 bit Datenstrom sein. Synchronisation ist hinfällig ich will mal das allgemeine Konzept dahinter verstehen. Ich hab bis jetzt ein paar Schaltungen probiert leuchtende LED, Adder, Dekodierung eines Streams und Ausgabe auf einem 7-Segment Modul. Aber wie man einen Datenstrom bei einem FPGA einlesen, serialisieren und ausgeben kann dazu fehlt mir nach wie vor das Hintergrundwissen bzw. ich erkenne da auch kein Konzept wie man das machen könnte..
Martin schrieb: > ich > erkenne da auch kein Konzept wie man das machen könnte.. weil das Konzept von den Randbedingungen abhängt. Und die Randbedingungen von nicht-sinnvollen Problemstellungen sind nicht definiert Hilft dir folgender Vorschlag: - jeder der beiden seriellen Datenströme wird durch ein Schieberegister erst mal in 8 bit breite Datenströme umgewandelt. - diese byte-breiten Datenströme aus den nicht synchronisierten Quellen werden in jeweils ein FIFO geschickt, dessen Eingang in der Taktdomäne der jeweiligen Datenquelle läuft - am anderen Ende der FIFOs wartet eine FSM darauf, dass die FIFOs Daten enthalten. Sobald das der Fall ist, holt sie beim volleren FIFO ein Paket von Daten ab, versieht es mit dem passenden Prefix (der die Quelle identifiziert), und sendet es an den PC
Martin schrieb: > Aber wie man einen Datenstrom bei einem FPGA einlesen, serialisieren und > ausgeben kann dazu fehlt mir nach wie vor das Hintergrundwissen bzw. ich > erkenne da auch kein Konzept wie man das machen könnte.. Bei einer so allgemeinen Fragestellung kann man nur verallgemeinert antworten: den Datenstrom schnell genug einlesen, schnell genug verarbeiten und mit der nötigen Geschwindigkeit ausgeben. Das wars. Bei einem mit 100MHz getakteten FPGA und einer Datenrate von 1MBit/s wäre das kein Problem. Bei einer Datenrate von 50MBit/s wäre das schon spannender. Deshalb eben die Frage nach dem WOZU...
Die Aufgabenstellung ist viel zu wässrig und abstrakt, als dass man daraus eine konkrete Übung mit konkreten Tips machen könnte. Da es aber anscheinend erstmal um Grundlagen geht, sollte man ein eher einfaches Beispiel wählen, auch nicht mit hohen Takten oder sonstwas. Man sollte auch nichts mit mehrfachen Takten etc. nehen, das ist was für die höheren Semester. Also ein einfaches System mit EINEM globalen Takt und mehreren Daten/Steuereingängen. Z.B. 2x 8 Bit Dateneingänge mit je einem Data enable Eingang (der natürlich nicht permanant aktiv sein kann). Diese werden auf einen 4 Bit Datenausgang gemultiplext. Dazu wird auf einer Zusatzleitung eine Synchronmarke ausgegeben, damit der Empfänger die Daten wieder demultiplexen kann. Alles mit einem globalen Takt. Dafür braucht man ein paar Zwischenpuffer, Schieberegister, Zähler und eine kleine state machine. Für den Anfang sollte das reichen. Als ersten Schritt erstellt man ein Blockschaltbild, dann kann man schrittweise die einzelnen Module erstellen, dazu die Testbenches. Wobei hier auf grund der eher geringen Komplexität alles in einer VHDL-Entity Platz hat, man muss nicht krampfhaft modularisieren. Trotzdem sollten sich die Blöche des Blockschaltbildes in den VHDL-Konstrukten wiederfinden lassen. Und als 2. Aufgabe kann man dann den Demultiplexer entwerfen. Als Zusatzaufgabe kann man beim MUX eine Fehlererkennung einbauen, wenn z.B. die Eingangsdaten zu schell kommen (data enable ist zu oft oder zu lange aktiv).
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.