Le fragment de code dans la question ne semble pas avoir quelque chose à voir avec les paquets fphdl directement. Cela ne dépend d'aucun type déclaré dans l'un d'entre eux.
L'expression donne un nombre entier result
de frac
avec frac'HIGH - base
'bits' de précision.
Un équivalent de l'expression originale pourrait être:
variable dist: integer range 0 to 23;
dist := frac'HIGH - base;
result := to_integer (SHIFT_RIGHT(frac, dist));
SHIFT_RIGHT provient du package de la bibliothèque IEEE numeric_std, utilisée parce frac
est un non signé.
L'observateur canny pourrait noter que c'est l'équivalent d'un diviseur entier par la puissance de deux qui tend à être pris en charge par la synthèse en général, en fournissant un matériel plus ou moins identique.
Et à ce sujet, vous pourriez avoir l'idée que votre déclaration est un multiplexeur avec des entrées décalées qui sont remplies de zéro, le tout sous réserve d'optimisation.
Historiquement, norme IEEE 1076.6-2004 (retirée) 8.6.5 noms tranche fournis -
Pour une plage discrète qui apparaît en tant que partie d'un nom de tranche, les limites de la plage discrète doivent être spécifiées directement ou indirectement des valeurs statiques appartenant à un type entier.
Morten nous dire Quartus Prime peut traiter
part := (others => '0');
part(base downto 0) := frac(frac'high downto frac'high - base);
result := to_integer(part);
où base
est pas statique (bien que vous pensez qu'il devrait être contraint).
Pour les outils de synthèse qui ne peuvent pas traiter avec une plage discrète non statique peut être fait la même chose dans une boucle en fonction du paramètre de boucle qui est une constante dans une boucle déroulée:
part := (others => '0');
for i in part'range loop
if i = b then
part(i downto 0) := frac(frac'high downto frac'high - i);
end if;
end loop;
result := to_integer(part);
l'IEEE Std 1076 = 2008 10,10 déclaration Loop nous dit:
pour une instruction de boucle avec un pour le schéma itération, le Le paramètre de boucle est la déclaration du paramètre de boucle avec l'identificateur donné. Le paramètre loop est un objet dont le type est le type de base de la gamme discrète. Dans la séquence d'instructions, le paramètre loop est une constante.
La boucle for donne le même résultat et devrait produire le même matériel.
cela semble fonctionner. J'ai essayé de faire quelque chose de semblable mais probablement je n'ai pas déclaré correctement la variable de partie temporaire et l'erreur se déplaçait vers cette déclaration ... mais votre code passe la synthèse. Merci! – user2609910