Forum: FPGA, VHDL & Co. Vektor mit wiederkehrendem Bitmuster befüllen


von Marco (mannmitbart)


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

: Bearbeitet durch User
von Grummler (Gast)


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?

von Marco (mannmitbart)


Lesenswert?

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.

von Testuser (Gast)


Lesenswert?

Gen_vector:
for i in 0 to 4 generate
   vector(i*24 + 23 downto i*24) <= bitmuster;
end generate;

von Grummler (Gast)


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

von Testuser (Gast)


Lesenswert?

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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Testuser (Gast)


Lesenswert?

Lothar M. schrieb:
> for i in 0 to 5 loop

Nur bis 4 oder 1 to 5.

von Markus (Gast)


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.

von Marco (mannmitbart)


Lesenswert?

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.

von Marco (mannmitbart)


Lesenswert?

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?

von Testuser (Gast)


Lesenswert?

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;

von dfIas (Gast)


Lesenswert?

Wäre zwar schlechter Stil, Verketten ginge aber auch:
1
  vector <= bitmuster & bitmuster & bitmuster & bitmuster & bitmuster;

von dfIas (Gast)


Lesenswert?

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;

von Testuser (Gast)


Lesenswert?

Elegant!

von FPGA-Experte (Gast)


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?

von Testuser (Gast)


Lesenswert?

Irgendwo hier wurde was von Generic geschrieben, Länge und Muster ändern 
sich dann nicht zur Laufzeit.

von Marco (mannmitbart)


Lesenswert?

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.

von Marco (mannmitbart)


Lesenswert?

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.

von Testuser (Gast)


Lesenswert?

Wenn sich nur das Muster ändert, dann sollte die Lösung von dflas schon 
funktionieren oder ist das nicht synthetisierbar?

von Marco (mannmitbart)


Lesenswert?

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

von Testuser (Gast)


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.

von FPGA-Experte (Gast)


Lesenswert?

Warum sollte das auch nicht synthetisierbar sein?

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
Noch kein Account? Hier anmelden.