Hallo, ich möchte, in VHDL, innerhalb eines Takts einen std_logic_vector(119 downto 0) mit einem wiederkehrenden Bitmuster von je 24 Bit Breite befüllen. Also alle 24 Bits das Gleiche.Beispielsweise x"1f1f1f". Geht das irgendwie, ohne den gesamten Vektor hinschreiben zu müssen? Wenn ich das über ein Schieberegister mache, müsste ich jedes Mal mehrmals auf das Prozessende warten. Ich bräuchte den Inhalt auf einmal und habe leider keine Idee wie ich das bewerkstelligen könnte. Außerdem ist der Vektor, je nach Parameter, nicht immer gleich lang und das Muster müsste abhängig von der Vektorbreite unterschiedlich oft hinein geschoben werden. Grüße
:
Bearbeitet durch User
Marco schrieb: > Hallo, > ich möchte, in VHDL, innerhalb eines Takts einen > std_logic_vector(119 downto 0) mit einem wiederkehrenden > Bitmuster von je 24 Bit Breite befüllen. Also alle 24 Bits > das Gleiche.Beispielsweise x"1f1f1f". Geht das irgendwie, > ohne den gesamten Vektor hinschreiben zu müssen? > Wenn ich das über ein Schieberegister mache, müsste ich > jedes Mal mehrmals auf das Prozessende warten. Ich bräuchte > den Inhalt auf einmal und habe leider keine Idee wie ich > das bewerkstelligen könnte. ??? Suchst Du eine bequeme Schreibweise für den Quelltext, oder suchst Du eine Logik , die diese Operation dann im realen Einsatz in Echtzeit übernimmt?
Ich habe gehofft die bequeme Schreibwese wäre die Logik. Also ich suche die Logik, um genau zu sein. Wenn das nicht irgendwie mit einer Zeile im Prozess funktioniert, dann denke ich mir etwas anderes aus. Ich wollte nur wissen, ob das auch so geht.
Gen_vector: for i in 0 to 4 generate vector(i*24 + 23 downto i*24) <= bitmuster; end generate;
Marco schrieb: > Ich habe gehofft die bequeme Schreibwese wäre die Logik. > Also ich suche die Logik, um genau zu sein. Ah, okay :) > Wenn das nicht irgendwie mit einer Zeile im Prozess > funktioniert, dann denke ich mir etwas anderes aus. > Ich wollte nur wissen, ob das auch so geht. Ich habe keine Ahnung von VHDL, stehe aber gelegentlich vor einem verwandten Problem, wenn ich mit einem 64bit-Prozessor acht 8-Bit-Werte verarbeiten will: 42 * 10101 = 424242; 197 * 1001 = 197197 usw. Muss natürlich noch ins Binäre übersetzt werden; ich denke, das Strickmuster ist offensichtlich. HTH
Testuser schrieb:
1 | Gen_vector: |
2 | for i in 0 to 4 generate |
3 | vector(i*24 + 23 downto i*24) <= bitmuster; |
4 | end generate; |
Marco schrieb: > müsste ich jedes Mal mehrmals auf das Prozessende warten. Aha, ein Softwareprogrammierer. In der Hardware ist das aber kein Problem, denn so ein VHDL-Prozess hat per Definition eine Laufzeit von 0. > Ich bräuchte den Inhalt auf einmal > und habe leider keine Idee wie ich das bewerkstelligen könnte. Du musst alle FFs parallel taktsynchron Setzen bzw. Zurücksetzen. > einen std_logic_vector(119 downto 0) mit einem wiederkehrenden Bitmuster > von je 24 Bit Breite befüllen. Beispielsweise x"1f1f1f". > Geht das irgendwie, ohne den gesamten Vektor hinschreiben zu müssen? Das "Hinschreiben" ist das allerkleinste Problem, das geht mit einer for-Schleife im Grunde völlig problemlos:
1 | for i in 0 to 5 loop |
2 | vect( ((i+1)*24)-1 downto i*24 ) = x"1f1f1f"; |
3 | end loop; |
Und das ist mit einem konstanten Wert mit konstanter Breite auch noch nicht so schlimm, das kann sogar über die Set/Reset-Leitungen der beteiligten FFs angesteuert werden. Wenn sich allerdings der 24-Bit-Wert ändert, dann ist vor jedem Flipflop ein Multiplexer nötig. > Außerdem ist der Vektor, je nach Parameter, nicht immer gleich lang und > das Muster müsste abhängig von der Vektorbreite unterschiedlich oft > hinein geschoben werden. Während des Betriebs zur Laufzeit oder nur zur Synthesezeit als "generic" Wert? Denn wenn das zur Laufzeit 1 Takt funktionieren soll, dann ist die Logik, die diese Herkulesaufgabe letztendlich in Hardware lösen muss, ein "Megamonstermultiplexer". Und dabei ist es völlig egal, ob man das in eine Zeile schreiben kann oder ob es eine Funktion braucht oder wie auch immer das in VHDL aussieht. > Also ich suche die Logik, um genau zu sein. Genau **das** musst du tun. Und wenn du die Logik (also die Hardware) die diese Aufgabe lösen kann, auf einem Blatt vor dir hingemalt hast, dann nimmst du die Hardwarebeschreibungssprache VHDL und beschreibst diese hingemalte logische Hardware in Worten.
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Denn wenn das zur Laufzeit 1 Takt funktionieren soll, dann ist die > Logik, die diese Herkulesaufgabe letztendlich in Hardware lösen muss, > ein "Megamonstermultiplexer". Wieso das denn? Es ist ein Register mit dem Muster und etliche weitere parallel mit Duplikaten davon im nächsten Takt.
Lothar M. schrieb: > Während des Betriebs zur Laufzeit oder nur zur Synthesezeit als > "generic" Wert? Als generic Wert. Der ändert sich während der Laufzeit nicht. Es läuft in einem anderen Prozess ein Zähler, der nach einem Enable Signal hochzählt, das Muster mit dessen Inhalt ändert und in den Vektor übernommen werden soll.
Super, vielen Dank euch allen. Läuft einwandfrei. Testuser schrieb: > Gen_vector: > for i in 0 to 4 generate > vector(i*24 + 23 downto i*24) <= bitmuster; > end generate; Hierzu hätte ich noch eine Frage. Dieses Konstrukt darf ich nur nebenläufig und nicht im Prozess verwenden? Hier müsste ich dann zusätzlich noch einen Signalvektor erzeugen und dem "echten" im Prozess dann zuweisen, so richtig?
Im Prozess ist das eine normale Schleife, also:
1 | for i in 0 to 4 loop |
2 | vector(i*24 + 23 downto i*24) <= bitmuster; |
3 | end loop; |
Wäre zwar schlechter Stil, Verketten ginge aber auch:
1 | vector <= bitmuster & bitmuster & bitmuster & bitmuster & bitmuster; |
Oder falls Vector kein ganzzahliges Vielfaches vom Muster lang ist:
1 | for i in vector'range loop |
2 | vector (i) <= bitmuster (i mod bitmuster'length); |
3 | end loop; |
Ja, elegant, allerdings war die Aufgabe doch die, das sequenziell zu steuern und damit abhängig zu machen, von der Länge und der Menge und gfs auch dem Wert, wodurch - abhängig vom Zeitpunt - ein jeweils anderes Muster eingesetzt wird und der endliche Vektor aus verschiedenen Mustern bestehen können sollte. Oder ist das überinterpretiert?
Irgendwo hier wurde was von Generic geschrieben, Länge und Muster ändern sich dann nicht zur Laufzeit.
Testuser schrieb: > Irgendwo hier wurde was von Generic geschrieben, Länge und Muster > ändern > sich dann nicht zur Laufzeit. Das Muster ändert sich schon und zwar durch einen Zähler. Immer wenn um 1 addiert wird muss der neue Wert in den Vektor übernommen werden. Von Anfang an steht die Länge des Vektors und ein Startwert des 24 Bit Musters fest.
dfIas schrieb: > Wäre zwar schlechter Stil, Verketten ginge aber auch: >
1 | > vector <= bitmuster & bitmuster & bitmuster & bitmuster & bitmuster; |
2 | > |
Das geht nicht, weil durch einen generic Wert die Anzahl veränderbar sein soll.
Wenn sich nur das Muster ändert, dann sollte die Lösung von dflas schon funktionieren oder ist das nicht synthetisierbar?
Testuser schrieb: > Wenn sich nur das Muster ändert, dann sollte die Lösung von dflas > schon > funktionieren oder ist das nicht synthetisierbar? Ich probiere es morgen aus
Und es ist synthetisierbar sagt Quartus. Ist ja auch logisch. Die Vektorlänge ist zur Synthesezeit bekannt und damit wird aus dem Modulo nur eine feste Zuordnung von Bits aus dem Bitmuster an Stellen im Vektor.
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.