2017-08-13 17 views
1

J'essaye de créer un tableau de vecteurs_logic avec des longueurs réduites. J'ai essayé de faire un tableau avec un générique std_logic_vector et ensuite en utilisant une instruction generate pour créer les vecteurs.VHDL Générer un tableau de STD_LOGIC_VECTORS avec une longueur réduite

architecture behavioral of dadda_mul_32bit is 

type and_planes is array (0 to 31) of std_logic_vector;  

begin 

generate_and_plane: 
    for i in 0 to 31 generate 
     and_planes(i) <= and_vector(a, b(i), i); 
    end generate generate_and_plane; 

end behavioral; 

avec une fonction qui renvoie un std_logic_vector générique:

function and_vector(vec: std_logic_vector; x: std_logic; length: natural) return std_logic_vector is 
    variable result: std_logic_vector(length - 1 downto 0); 
begin 
    for i in 0 to length - 1 loop 
     result(i) := vec(i) and x; 
    end loop; 

    return result; 
end function; 

Suis-je en utilisant la déclaration de manière incorrecte générer?

+0

Pourquoi vos résultats ET ne sont-ils pas de la longueur d'un? – user1155120

Répondre

3

and_planes est un type pas un signal, donc vous ne pouvez pas lui assigner! De plus, vous créez un type partiellement contraint, qui doit être contraint dans une déclaration d'objet (par exemple, un signal). VHDL ne prend pas en charge les tableaux irréguliers.

(Tableaux dans lesquels chaque élément est de taille différente). Si vous en avez besoin pour la simulation, vous pouvez utiliser des types d'accès et émuler des tableaux irréguliers comme en C. Si vous en avez besoin pour la synthèse, vous pouvez émuler un tableau irrégulier avec un tableau unidimensionnel et quelques fonctions pour calculer les limites d'un imbriqué vecteur.

Voir cette réponse de moi:


btw. VHDL-2008 ajoute une surcharge: "and"(std_logic, std_logic_vector), donc aucune fonction n'est nécessaire pour calculer l'anding d'un seul bit avec chaque bit dans un vecteur.

-- slice 'a' and gate it by 'b(i)' 
and_planes(i) <= a(i downto 0) and b(i);