Forum: FPGA, VHDL & Co. Integer to STD_LOGIC_VECTOR (nur obere Bits)


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Ich versuche folgende Konversion durchzuführen:
1
std_logic_vector(to_unsigned(DATA_IN((chipCount - 1) - chipCounter)(arrayCount), 16))(15 downto 8);

Leider scheitert diese in der Simulation mit folgender Meldung:
1
Type names are not allowed as primaries.
2
 The index types in the reference to the array object are incompatible with its range type.
3
 Expected array type.
4
Undefined type of expression. Expected type 'STD_LOGIC_VECTOR'.

Warum darf ich das Ergebnis der Konvertierung nicht "Maskieren" mittels 
(15 downto 8) ?

von Tobias (. (Gast)


Lesenswert?

Bitte mal vollständige Zuweisung!

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


Lesenswert?

Holger K. schrieb:
> Warum darf ich das Ergebnis der Konvertierung nicht "Maskieren" mittels
> (15 downto 8) ?
Mal davon ausgegangen, dass der Rest wahrscheinlich schon passen wird, 
dann darfst du das schon, nur brauchst du eben tatsächlich ein 
Zwischenergebnis:
1
zwischenergebnis <= std_logic_vector(to_unsigned(DATA_IN((chipCount - 1) - chipCounter)(arrayCount), 16));
2
endergebnis      <= zwischenergebnis(15 downto 8);

> Warum darf ich das Ergebnis der Konvertierung nicht "Maskieren" mittels
> (15 downto 8) ?
Weil die "Typdefinition" von to_unsinged eben völlig anders aussieht, 
als die Typdefinition eines Vektors. Siehe dort die ersten paar Zeilen 
und die Id D.3:
https://www.csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd

von FPGAzumSpass (Gast)


Lesenswert?

Trotzdem ist das jedes mal nervig für so etwas Triviales eine Variable 
oder ein Signal definieren zu müssen.

Das führt dann dazu, das ich in so einem Fall oft abwäge was jetzt am 
hässlichsten aussieht:

- Hilfssignal bzw -Variable
- gar nicht erst Integer nehmen und gleich bei Unsigned bleiben
- mit Integer weiter arbeiten, in dem Fall also:
1
ergebnis <= DATA_IN((chipCount - 1) - chipCounter)(arrayCount) / 256;

Was aber auch wieder nur klappt wenn das Ergebnis nicht an einen Port 
ran muss, weil die Konvertierung bei der Portzuweisungen auch wieder 
nicht zulässig ist.

Wenn da jemand eine ein-Anweisungs-Lösung finden würde wäre es echt eine 
Erleichterung.

von Markus F. (mfro)


Lesenswert?

Ich versteh's nicht.

Ja, man kann keinen Slice aus einer Typkonvertierung bilden:
1
std_logic_vector(to_unsigned(DATA_IN((chipCount - 1) - chipCounter)(arrayCount), 16))(15 downto 8);
Geht nicht.
na und?
Man kann einen Slice aus einem unsigned rausschneiden:
1
std_logic_vector(to_unsigned(DATA_IN((chipCount - 1) - chipCounter)(arrayCount), 16)(15 downto 8));

Und das geht völlig ohne Verrenkungen, man muss nur eine Klammer ein 
bißchen verschieben.

: Bearbeitet durch User
von FPGAzumSpass (Gast)


Lesenswert?

Wahnsinn, das ich noch nie darauf gekommen bin das so rum zu probieren.
(der Threadersteller und Lothar wohl auch nicht)

Probiere ich bei Gelegenheit mal in Simulator und Synthese aus, ob das 
so "baut".

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.