Forum: FPGA, VHDL & Co. Resize funktioniert nicht


von Michael K. (manhunt)


Lesenswert?

Hallo

Ich habe folgenden Resize probiert nur leider funktioniert er nicht und 
ich habe keine Idee was ich falsch machen:
1
my_logic_vector <= std_logic_vector(resize(unsigned(x"434A"), my_logic_vector'length));

Fehlermeldung "Expression has ambiguous type" ich vermute es liegt am 
unsigned(x"434A") habe jedoch keine idee wie ich es sonst schreiben 
könnte.

lg Michael

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


Lesenswert?

Probiers so:
1
my_logic_vector <= std_logic_vector(resize(unsigned'(x"434A"), my_logic_vector'length));
Stichwort: Qualifier

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


Lesenswert?

Hier mal eine Aufstellung, was geht und was nicht:
1
signal slv  :  std_logic_vector (15 downto 0);
2
signal uv   :  unsigned (15 downto 0);
3
4
5
slv <= std_logic_vector(resize(x"1234", slv'length));
6
--> Expression in type conversion to std_logic_vector has 2 possible definitions in this scope, for example, SIGNED and UNSIGNED.
7
8
slv <= std_logic_vector(unsigned'(resize(x"1234", slv'length)));
9
--> ok, das Ergebnis von resize ist ein unsigned Vektor
10
11
slv <= std_logic_vector(resize(unsigned(x"1234"), slv'length));
12
--> Expression in type conversion to unsigned has 7 possible definitions in this scope, for example, std_ulogic_vector and std_logic_vector.
13
14
slv <= std_logic_vector(resize(unsigned'(x"1234"), slv'length));
15
--> ok, die Konstante x"1234" ist ein unsigned Wert
16
17
uv <= resize(unsigned(x"1234"), uv'length);
18
--> Expression in type conversion to unsigned has 7 possible definitions in this scope, for example, std_ulogic_vector and std_logic_vector.
19
20
uv <= resize(unsigned'(x"434A"), uv'length);
21
--> ok, die Konstante x"1234" ist ein unsigned Wert
22
23
uv <= resize(x"434A", uv'length);
24
--> ok, der Typ von uv wird für resize verwendet

von Matthias (Gast)


Lesenswert?

Müsste man auch so schreiben können:
1
my_logic_vector <= std_logic_vector(to_unsigned(16#434A#, my_logic_vector'length));

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


Lesenswert?

Richtig: Bis zu einer Vektorlänge von 31 Bit geht das.

von Matthias (Gast)


Lesenswert?

QuestaSim kompiliert mir das auch für einen 58 Bit Vektor (für die 
Simulation hab ich hier grad keine Zeit) und ich sehe nicht, warum das 
nicht mit beliebigen Vektrogrößen gehen soll. Ich hab noch den 
pedantic-switch dazu getan, da stört sich der Questa an zwei anderen 
Dingen aber diese Zuweisung geht durch.

Warum sollte es denn nicht gehen?

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


Lesenswert?

Matthias schrieb:
> QuestaSim kompiliert mir das auch für einen 58 Bit Vektor
Was genau?
> ich sehe nicht, warum das nicht mit beliebigen Vektrogrößen gehen soll.
VHDL verlangt für Integer mindestens 32 Bit. Ganz dumm wäre jetzt, wenn 
der Simulator längere Integer (z.B. 64Bit) kann als der Synthesizer 
(z.B. 32Bit)...

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


Lesenswert?

Xilinx ISE13.2:
1
  signal int : integer := 16#80000000#;
2
:
3
:
4
  slv <= std_logic_vector(to_unsigned(16#87654321#, slv'length));
-->
1
  The integer value of 16#80000000# is greater than integer'high.
2
  The integer value of 16#87654321# is greater than integer'high.

von Michael K. (Gast)


Lesenswert?

Danke für die schnelle Hilfe!

Habs leider erst jetzt testen können, funktioniert danke nochmal 
vorallem für die Aufstellung.

lg Michael

von Matthias (Gast)


Lesenswert?

@Lothar: Sorry, hatte das Thema aus den Augen verloren, aber so gesehen 
klar. Danke für die Erklärung!

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.