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