Vektor mit wiederkehrendem Bitmuster befüllen

#7342992
Lesenswert?

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

Gast #7343003
Lesenswert?

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?

Gast #7343026
Lesenswert?

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

Moderator (Firma: Titel) Persönliche Seite #7343033
Lesenswert?

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.

Gast #7343051
Lesenswert?

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.

#7343087
Lesenswert?

Super, vielen Dank euch allen. Läuft einwandfrei.

Testuser schrieb:

Gen_vector: for i in 0 to 4 generate vector(i24 + 23 downto i24) <= 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?

Gast #7346098
Lesenswert?

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?

Gast #7346612
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren