Forum: FPGA, VHDL & Co. VHDL: Index auf Integer?


von Heiko L. (drcaveman)


Lesenswert?

Hallo!

Ich habe ein Problem mit der Synthese eines "Vergleiches".
Ich habe einen 4-Bit-Zähler, bei dem das vierte Bit als "Überlauf" 
aufgefasst werden soll. Im Code habe ich den Zähler als Integer 
realisiert, weil es einfacher ist. Schreibe ich nun aber:
1
if (bla_int = 8) then

wird unnötigerweise ein kompletter Komparator synthetisiert (naja, gut, 
das Synthesewerkzeug kann ja nicht wissen, dass ich das vierte Bit nur 
dazu verwende).

Ich helfe mir gerade damit aus, dass ich eine Kopie des integers in 
einem STD_LOGIC_VECTOR vorhalte, indem ich dann auf den Index zugreife, 
also so:
1
if (bla_std_cpy(3) = '1') then

- geht das auch einfacher?

Danke,
Heiko.

von Jan M. (mueschel)


Lesenswert?

Normalerweise sollte
if (bla_int > 7) then
dem Optimierer auf die Spruenge helfen. Die uebliche Regel "ungleich 
braucht mehr Ressourcen als gleich" trifft in solch speziellen Faellen 
nicht zu.

Du kannst auch einfach unsigned statt integer verwenden, dann kannst du 
auch direkt auf die einzelnen Bits zugreifen.

von Hans-Werner (Gast)


Lesenswert?

Ja, wahrscheinlich mit "unsigned" nicht mit "integer".

von Heiko L. (drcaveman)


Lesenswert?

Jan M. wrote:
> Normalerweise sollte
> if (bla_int > 7) then
> dem Optimierer auf die Spruenge helfen. Die uebliche Regel "ungleich
> braucht mehr Ressourcen als gleich" trifft in solch speziellen Faellen
> nicht zu.

Da wird dann kein Komparator, sondern ein "greatervalue" synthetisiert.

> Du kannst auch einfach unsigned statt integer verwenden, dann kannst du
> auch direkt auf die einzelnen Bits zugreifen.

Das funktioniert.

Danke euch beiden!

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


Lesenswert?

>  if (bla_std_cpy(3) = '1') then
> - geht das auch einfacher?
Wenn du die numeric_std Lib verwendest, dann mach doch einfach eine 
Conversion.
1
if (to_unsigned(bla_int,4)(3) = '1') then

von Heiko L. (drcaveman)


Lesenswert?

Lothar Miller wrote:

> Wenn du die numeric_std Lib verwendest, dann mach doch einfach eine
> Conversion.
>
1
> if (to_unsigned(bla_int,4)(3) = '1') then
2
>

Ich habe jetzt den integer in unsigned geändert und musste dadurch 
natürlich bei Zuweisungen auf "array" (others => '0') umsteigen- da wäre 
die Lösung ja noch ein bisschen "änderungsärmer", danke!

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.