2017-03-07 5 views
1
paramétrables

Je sais qu'il est possible de créer un sous-type d'une plage définie, par exemple:sous-types VHDL

subtype ADDRESS is UNSIGNED range (32 downto 0); 

Est-il possible de créer un type paramétrables/sous-type? Essentiellement en laissant la valeur de '32' à définir par l'utilisateur lors de la création d'une variable de type ADRESSE. Par exemple:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

où f() est une fonction prédéfinie dans un autre paquet, et X est un nombre entier naturel fournie par l'utilisateur lors de la création d'une instance d'adresse.

Essentiellement, je veux raccourcir ...

y : UNSIGNED(f(X) downto 0); 

à

y : ADDRESS(X); 

où X est un produit naturel.

Répondre

1

Eh bien, oui. Mais vous ne pouvez pas écrire:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

parce que ce n'est pas correct VHDL. Vous devez écrire:

subtype ADDRESS is UNSIGNED (f(x) downto 0); 

x doit être statique. c'est-à-dire x doit être un littéral, constant ou générique.

Vous pouvez utiliser les fonctions de cette manière pour définir la valeur des constantes et d'autres valeurs statiques. Toutes les entrées d'une telle fonction doivent être statiques. Fait intéressant, une telle fonction s'exécute pendant l'élaboration, ce qui peut rendre difficile le débogage. Si vous rencontrez des problèmes pour déboguer une telle fonction, vous pouvez temporairement changer la cible de la valeur de retour de la fonction en quelque chose qui n'est pas statique (par exemple une variable); alors la fonction s'exécutera après l'heure 0, ce qui facilitera le débogage. Voici un exemple concret:

package P is 
    function F(I : integer) return integer; 
end package P; 

package body P is 
    function F(I : integer) return integer is 
    begin 
    if I > 16 then 
     return I - 1; 
    else 
     return (I * 2) - 1; 
    end if; 
    end function F; 

end package body P; 

library IEEE; 
use IEEE.numeric_std.all; 
use work.P.all; 

entity E is 
    constant X : integer := 16; 
end entity E; 

architecture E of E is 
    subtype ADDRESS is UNSIGNED (f(x) downto 0); 
begin 

    process 
    begin 
    report "ADDRESS'left= " & integer'image(ADDRESS'left); 
    wait; 
    end process; 

end architecture E; 

Et ici, il est sur EDA Playground.

1

La réponse de Matthew Taylor est déjà correct, mais je voudrais répondre à votre dernière question

y : ADDRESS(X); 

En C, vous vous utilisez une macro, mais en VHDL ce n'est pas possible. Il faudrait que la fonction ADDRESS renvoie un type de sous-type. IEEE1076-2008 définit:

function_specification ::= 
    [ pure | impure ] function designator 
     subprogram_header 
     [ [ parameter ] (formal_parameter_list) ] return type_mark 

Où:

type_mark ::= 
    type_name 
    | subtype_name 

à savoir le type de retour doit être un type déjà défini. Cela ne peut pas être un nouveau type [sub]. Vous pourriez faire quelque chose avec une définition de sous-type, comme Matthew explique:

subtype ADDRESS_X is unsigned(f(X) downto 0); 
signal new_signal : ADDRESS_X;