2016-02-27 7 views
2

J'ai essayé de compiler ma conception qui utilise les bibliothèques fphdl http://www.eda.org/fphdl/ pour les opérations en virgule flottante. Alors que dans la simulation ModelSim est très bien lors de la synthèse dans Quartus compilateur hdl se plaint de la déclaration:compiler fphdl dans Altera Quartus Prime

result := to_integer (fract (frac'high downto frac'high-base)) 

avec raison: « l'expression est pas constante » de regarder les messages autour similaires Je comprends que ce compilateur ne pas comme ça frac'high-base est pas contraint. J'ai essayé de contraintes se rapportent tous les signaux comme suit:

variable frac : UNSIGNED (23 downto 0); 
variable base : INTEGER range 0 to 23; 

mais l'erreur continue à ... est-il solution de contournement pour que le niveau de HDL ou dans Quartus lui-même?

Répondre

2

Notez que le message d'erreur dit:

expression

n'est pas constante

et non:

... contraint

La raison du message d'erreur est donc que la fonction to_integer ne peut pas être synthétisée lorsque la plage comprise entre fract est variable au moment de l'exécution et n'est pas fixée au moment de l'élaboration.

un travail autour de Quartus peut être:

variable part : UNSIGNED(23 downto 0); 
... 
part := (others => '0'); 
part(base downto 0) := frac(frac'high downto frac'high - base); 
result := to_integer(part); 

La partie extraite de frac est alors nul-extneded, et la longueur du vecteur donné à to_integer est alors fixé, permettant ainsi la synthèse Quartus.

+0

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

1

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); 

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.

+0

c'est une bonne solution de contournement à avoir à l'esprit. Merci! – user2609910