Comprendre ufixed, sfixed, les bits fractionnaires, resize et la conversion vers std_logic_vector.
La virgule fixe donne un poids connu à chaque bit, y compris aux bits fractionnaires. Elle permet de représenter un gain ou une valeur comme 0.75 ou -1.25 avec un format choisi pour sa plage et sa précision.
Pour huit bits en Q4.4, quatre positions sont réservées à la partie entière et quatre à la fraction. La valeur est l'entier encodé divisé par . Les conventions Q peuvent inclure ou exclure le signe dans le premier nombre : indique celle que tu utilises.
Les indices indiquent les poids des bits. Dans cet objet, 1 downto 0 correspond aux positions entières, -1 downto -6 à six positions fractionnaires, soit huit bits au total :
signal r_gain : ufixed(1 downto -6);
Une addition peut demander une position entière supplémentaire pour conserver la retenue :
Le produit s'élargit ; resize le ramène au format de sortie choisi. Pour sfixed(0 downto -11), le bit entier est le bit de signe et onze bits sont fractionnaires. La plage va de -1 à 1 - 2⁻¹¹.
Les ports peuvent rester en std_logic_vector pour l'intégration avec les IP, puis être interprétés à l'intérieur du bloc :
entity fixed_adapter is port ( i_x : in std_logic_vector(11 downto 0); o_y : out std_logic_vector(11 downto 0) );end entity fixed_adapter;architecture rtl of fixed_adapter is signal w_x : sfixed(0 downto -11); signal w_y : sfixed(0 downto -11);begin w_x <= to_sfixed(i_x, w_x'high, w_x'low); w_y <= resize(w_x, w_y'high, w_y'low); o_y <= to_slv(w_y);end architecture rtl;
Les deux côtés doivent partager le format du port. Le cast ne devine pas la position de la virgule.
Choisir l'arrondi et le débordement
Réduire un format oblige à décider du traitement des bits fractionnaires supprimés et des valeurs hors plage. resize permet de choisir arrondi et comportement de débordement selon les options de fixed_pkg :
r_y <= resize(r_acc, r_y'high, r_y'low);
Documente ces choix et vérifie leur prise en charge par la synthèse. Simule les valeurs minimale, maximale et négative, les passages près de zéro et les résultats qui débordent.
Les conversions de real conviennent aux constantes et aux testbenches :
Un signal real ne constitue généralement pas un calcul RTL synthétisable à l'exécution. Pour le bloc matériel, garde sfixed ou ufixed et dimensionne explicitement les résultats d'addition, de multiplication et de conversion.