Die gerne noch verwendeten Quasi-Industrie-Standards der Synopsys-Lib sind schon geraume Zeit obsolete.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Statt dessen sollte die Numeric_Std Library verwendet werden. Diese ist herstellerunabhängig und über IEEE 1076.3 genormt.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
Auf keinen Fall dürfen aber frei nach dem Motto "Viel hilft viel!" einfach alle Libs genommen werden. Denn dann existieren ein paar Typdefinitionen und Umwandlungen doppelt, und der Synthesizer hat die Qual der Wahl, die er aber in Form einer Fehlermeldung gern an den Bediener zurückgibt.
Hier eine kurze Übersicht, wie die Datentypen signed und unsigned zwischen integer und std_logic_vector sitzen.
Cast vs. Konvertierung:
Von std_logic_vector nach signed/unsigned und zurück wird "nur" gecastet mit singed(), unsigned() und std_logic_vector().
Von signed/unsigned nach integer und zurück wird konvertiert, das ist leicht zu erkennen an dem Prefix "to_" bei to_signed(), to_unsigned() und to_integer().
Umwandlung von real nach std_logic_vector und zurück:
Natürlich kann man einen Vektor nicht so einfach in eine Fließkommazahl umwandeln. Um aber irgendeine Berechnung mit der ieee.math_real.all durchführen zu können und das Ergebnis dann einem integer und anschliessend einem Vektor übergeben zu können, gibt es die Konvertierungsfunktionen real() und integer().
realzahl <= real(to_integer(unsigned(vektor))) / 32768.0; vektor <= std_logic_vector(to_unsigned(integer(realzahl * 512.0),vektor'length));
Diese Wandlungen werden z.B. bei der Tabellenberechnung für die DDFS und bei der Berechnung der Vektorbreite verwendet.
Übrigens:
Ein beliebter Fehler ist es, dem Synthesizer undefinierte Typen mit einem Cast "beizubiegen". Der richtig Ansatz dafür wäre aber ein Qualifier.