2016-12-14 1 views
0

Par souci de cohérence et de facilité de maintenance, je voudrais faire certaines constantes en utilisant des instructions séquentielles, par ex. en cours.Comment utiliser des instructions séquentielles (par exemple, un processus) pour obtenir une valeur constante sans attendre?

J'ai défini une plage en utilisant:

subtype FIELD is natural range 3 downto 0; 

Un processus qui rend la valeur pourrait alors ressembler à:

process is 
begin 
    reg <= (others => '0'); 
    reg(FIELD) <= (others => '1'); 
    wait; -- Error in Xilinx ISE 
end process; 

Cependant, la wait n'est pas accepté par l'outil de synthèse Xilinx ISE. L'une des façons est bien sûr d'utiliser un signal non utilisé dans une liste de processus, comme une horloge, mais c'est une sorte de moche.

Le style concurrent serait comme:

reg <= (FIELD => (others => '1'), others => '0'); 

Mais champ ne peut pas être utilisé comme ça dans VHDL.

Existe-t-il un moyen de créer des constantes en utilisant des instructions séquentielles, mais où le wait n'est pas requis dans un process?

+0

Vous n'avez pas besoin d'un processus pour affecter une valeur constante à un signal. Faites-le directement dans l'architecture. –

+0

Oui, je suis conscient de cela, mais je préfère utiliser la même structure pour générer le contenu du registre même s'il contient une valeur constante, donc je peux ensuite mettre à jour vers une sortie non constante dans la même structure. – EquipDev

Répondre

1

Vous pouvez utiliser une fonction pour ce faire. Notez, je ne fais aucune vérification d'erreur sur la gamme, mais n'est pas difficile à faire.

-- subtypes 
subtype FIELD is natural range 3 downto 0; 

-- functions 
function test_func(a: std_logic_vector) return std_logic_vector is 
    variable result : std_logic_vector(a'left downto a'right) := a; 
begin 
    result(FIELD) := (others => '1'); 
    return result; 
end function; 

-- constants 
constant ALL_ZEROS : std_logic_vector(7 downto 0) := (others => '0'); 

-- signals 
signal reg   : std_logic_vector(7 downto 0) := test_func(ALL_ZEROS); 
+0

Bon point utilisant une fonction pour autoriser des instructions séquentielles, puis utilisez simplement la fonction pour initialiser le 'reg'. Peut-être que 'reg' devrait même être une constante dans ce cas. Btw. le 'ALL_ZEROS' n'est pas nécessaire si le résultat est initialisé en utilisant' result: = (others => '0'); 'au début. Je vais lui donner quelques jours pour voir si c'est la meilleure idée. – EquipDev