Hallo, ich habe folgendes VHDL Problem: Über einen seriellen Eingang kommen einen gewisse Menge an Bits an. Sagen wir mal 60000 Bits. Nun gehören jeweils die Bits 0,8,16, ... und 1,9,17, ... und 2,10,18, ... usw. zusammen. Wie kann ich diese nun am effizientesten und Resourcen schonensten sortieren damit ich am Ende wieder einen Serielles Signal habe, bei dem die jeweils zusammengehörigen Bits hintereinander ausgelesen werden können. Also so: Bit0,Bit8,Bit16,....Bit1,Bit9,Bit17,....Bit2,Bit10,Bit18,... Ich habe mir überlegt eine Variable zu definieren, die Mitzählt bei welchem Bit man gerade ist und das jeweilige Bit einem Vektor zuordnet. Wenn dann alle Bits in ihren Vektoren stehen wollte ich diese wieder über einen MUX zusammen binden. Gibt es eine effizientere Methode? Kann man das so verstehen? Würde mich über antworten freuen.
Hallo Klaus, deine Aussage: "Ich habe mir überlegt eine Variable zu definieren" laesst vermuten dass Du dich bereits vom Tugend der HDL Beschreibung bereits entfernt hast... Veriablen sind etwas voellig anderes wie bei der klassischen (Microprozessor) Programmierung... Man(n/Frau) nutzt Register nicht Variablen... Zu bedenken ist der zeitliche Ablauf, nicht dass waehrend der Ausgabe der Bits bereits Die ersten Werte wieder ueberschrieben werden... In diesem Sinne
Klaus schrieb: > Sagen wir mal 60000 Bits. Ist diese Datenpaketlänge immer gleich? Denn nur dann kannst du am Ende erst die Bits(n*8) (mit n=0..749), dann die Bits(n*8+1) usf. bis zu den Bits(n*8+7) ausgeben...
Hallo Lothar, das könnte funktionieren. Sie sind zwar nicht immer gleich, aber doch zumindest immer ein vielfaches davon. Das werd ich ausprobieren. zu Vanilla: Ich bin noch kein VHDL Experte. Wie genau muss man sich denn eine Variabel hier vorstellen und warum ist es ein Problem sie zu benutzen? Gruß Klaus
Klaus schrieb: > Wie genau muss man sich denn eine Variabel hier vorstellen Du hast doch mit Variablen angefangen... :-o > und warum ist es ein Problem sie zu benutzen? Variablen sind und machen in VHDL etwas grundsätzlich anderes als Variable in Programmiersprachen wie z.B. C Immer wieder fallen da ein paar Anfänger auf die Nase, weil sich so eine Variable mitunter unschön verhält... Beitrag "Variable vs Signal" Wenn sich z.B. eine Variable in einem Prozess ändert, und deshalb eigentlich der Prozess neu berechnet werden müsste, ist sehr schnell die Simulation anders als die Hardware: Beitrag "Re: Variable vs Signal" Und das ist wirklich blöde... :-/
Hallo Lothar, ja das hab ich, aber nach dem Rüffel von Vanilla werd ich das in Zukunft, wenn irgendwie möglich, vermeiden. Bis jetzt ist es mir zwar noch nicht ganz klar warum Variablen so ein Teufelszeug sind, aber ich das werd ich im Laufe der Zeit hoffentlich noch.
Klaus schrieb: > Bis jetzt ist es mir zwar > noch nicht ganz klar warum Variablen so ein Teufelszeug sind Wenn das jedem Anfänger klar wäre, wäre die Welt ein Stück einfacher. Duke
Hallo Klaus, hier ist ein Lösungsvorschlag. Du schiebst deinen seriellen Datenstrom in ein 8Bit Schieberegister. Nach jedem achten Bit schreibst du das Byte in einen BlockRAM. Das ist interner Speicher im FPGA. So etwas haben alle modernen FPGAs und das auch noch dual-ported. Heißt zweimal Adressbus, Datenbus und Steuerleitungen. Sodass du von zwei Seiten auf dieselben Daten zugreifen kannst. Von der zweiten Seite liest die die Daten wieder byteweise. Jedoch verwendest du nicht das ganze Byte sondern nur ein Bit. Dies gibst du aus. Dann liest du die nächste Adresse. Wenn du von allen Adresse ein Bit verarbeitet hast, fängst du wieder von vorn an mit dem nächsten Bit usw. Wenn dir jetzt die Ohren von Bits. Bytes BRAM usw. klingeln, dann weist du auf was du dich eingelassen hast. Viel Spaß Tom
Klaus schrieb: > Über einen seriellen Eingang kommen einen gewisse Menge an Bits an. > Sagen wir mal 60000 Bits. Nun gehören jeweils die Bits 0,8,16, ... und > 1,9,17, ... und 2,10,18, ... usw. zusammen. Wie kann ich diese nun am > effizientesten und Resourcen schonensten sortieren damit ich am Ende > wieder einen Serielles Signal habe, bei dem die jeweils > zusammengehörigen Bits hintereinander ausgelesen werden können. Also so: > Bit0,Bit8,Bit16,....Bit1,Bit9,Bit17,....Bit2,Bit10,Bit18,... Du kannst das ganze auch mit einem (oder zwei) langen Schieberegister lösen, dessen Bits nach und nach über zwei verschachtelte Zähler selektiert werden. nachdem Du Deine 256 Bits voll hast, kannst Du das Register raustakten und somit Deinen Datenstrom generieren, während mittlerweile der zweite Puffer gefüllt wird. Gruß Marcus
Oder du nimmst 8 Schieberegister, in die immer der Reihe nach ein Bit reingeschoben wird. Wenn dann alle Register 8 Bit empfangen haben, wird der Inhalt der Register nacheinander ausgelesen und ins RAM geschrieben.
Klaus schrieb: > Ich habs geschafft! Schön wäre es, wenn du deine Lösung (wenigstens ansatz- oder auszugsweise) beschreiben würdest. Nur, falls irgendwann mal Einer eine ähnliche Aufgabe hat...
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.