Es gestaltet sich in VHDL oft nicht so einfach, dem Synthesizer etwas Glasklares zu vermitteln. Nehmen wir mal diese einfache Aufgabe: Eine Konstante x"1234" soll an einen Vektor (std_logic_vector oder unsigned) zugewiesen werden. Weil die Länge des Vektors noch nicht feststeht, soll vorher ein resize() durchgeführt werden.
Wenn man das jetzt einfach so hinschreibt:
slv <= std_logic_vector(resize(x"1234", slv'length));
Dann erlebt man ein blaues Wunder. Obwohl eigentlich auf Anhieb erkennbar ist, was hier passieren soll, zickt der Compiler herum und meldet sowas wie:
Expression in type conversion to std_logic_vector has 2 possible definitions in this scope, for example, SIGNED and UNSIGNED.
Was ist passiert?
resize() kann signed oder unsigned für diese Konstante zurückliefern. Weil der Synthesizer selber aber nicht entscheiden kann, welcher Datentyp gemeint ist, weiß er auch nicht, ob die resize() Funktion die Konstante als signed oder unsigned zu betrachten hat.
Dies kann ihm mit einem Qualifier gesagt werden: unsigned' sagt, dass der folgende Wert als unsigned zu betrachten ist.
slv <= std_logic_vector(unsigned'(resize(x"1234", slv'length)));
Das hilft dem Synthesizer aus der Klemme, denn jetzt weiß er was das Ziel ist und er verwendet die gewünschte Implementierung der Funktion.
Hier mal eine kleine Aufstellung, was geht und was nicht:
signal slv : std_logic_vector (15 downto 0); signal uv : unsigned (15 downto 0); slv <= std_logic_vector(resize(x"1234", slv'length)); --> Expression in type conversion to std_logic_vector has 2 possible definitions in this scope, for example, SIGNED and UNSIGNED. slv <= std_logic_vector(unsigned'(resize(x"1234", slv'length))); --> ok, das Ergebnis von resize ist ein unsigned Vektor slv <= std_logic_vector(resize(unsigned(x"1234"), slv'length)); --> Expression in type conversion to unsigned has 7 possible definitions in this scope, for example, std_ulogic_vector and std_logic_vector. slv <= std_logic_vector(resize(unsigned'(x"1234"), slv'length)); --> ok, die Konstante x"1234" ist ein unsigned Wert uv <= resize(unsigned(x"1234"), uv'length); --> Expression in type conversion to unsigned has 7 possible definitions in this scope, for example, std_ulogic_vector and std_logic_vector. uv <= resize(unsigned'(x"1234"), uv'length); --> ok, die Konstante x"1234" ist ein unsigned Wert uv <= resize(x"1234", uv'length); --> ok, der Typ von uv wird für resize verwendet
Bis zu einer Vektorlänge von 31 Bit geht es auch so:
slv <= std_logic_vector(to_unsigned(16#1234#, slv'length));