Forum: FPGA, VHDL & Co. Byteweise addieren eines Vektors


von Matthias H. (hille)


Lesenswert?

Hallo liebe Community,

ich bin vor kurzem damit angefangen, mich ins Thema VHDL, FPGA's und Co 
einzuarbeiten. Aktuell sitze ich an einem Projekt, das Vektoren 
vergleichen soll. Nichts großartiges.

Auf ein kleines Problem stoße ich da:

Ein 32 Bit breiter Vektor enthält die Ergebnisse von 4 Vergleichen in 
den einzelnen Bytes.
1
result_reg <= data_reg (31 downto 24) + data_reg (23 downto 16) + data_reg (15 downto 8) + data_reg (7 downto 0);

Wäre die Addition der einzelnen Bytes in ein Ergebnisregister. Auf einen 
möglichen Überlauf brauch nicht geachtet werden, da die Ergebnisse nicht 
entsprechend groß werden können. Die Addition geschieht in einem 
sequentiellem Prozess.

Nun möchte ich diese Zeile durch eine For-Schleife tauschen, um später 
auch größere Vektoren zu verwenden, ohne dort was ändern zu müssen.

Mein Konstrukt (Versuch) sieht bisher so aus:
1
for i in 0 to adder_amount_g-1 loop
2
   result_reg <= result_reg + data_reg(byte+(byte*i)-1 downto byte*i);
3
end loop;

Die Register sind vom selben Typ, entsprechende Libraries sind 
eingebunden,
die in dem Package definierten Konstanten "adder_amount_g" und "byte" 
haben den Wert 4 und 8.

Bin ich gänzlich auf dem Holzweg? Wie würde ein entsprechender Code 
aussehen?

Ich bin für alle Ideen dankbar.
Mit freundlichen Grüßen
Hille

von user (Gast)


Lesenswert?

ja genau so, nur das Ergebnis in eine Variable zwischenspeichern und 
dann and result_reg zuweisen. Das ist einer der seltenen Fälle wo man 
eine Variable verwenden kann.

von Matthias H. (hille)


Lesenswert?

Danke für die kleine, aber feine Antwort. Sie hat durchaus geholfen. Das 
funktionierende Konstrukt sieht nun so aus:

1
       for i in 0 to adder_amount_g-1 loop --adder_amount_g entspricht 3
2
          result_var (7 downto 0) := result_var (7 downto 0) + data_reg(7+(byte*i) downto byte*i); --byte entspricht (natürlich) dem Wert 8
3
       end loop;

Und später im Prozess erfolgt natürlich noch eine Zuweisung von der 
Variable zu dem ursprünglichen Register "result_reg".

Vielen Dank dafür. Solche Tipps sind für Anfänger nicht gegen Gold 
aufzuwiegen.

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.