2010-06-06 7 views
0

J'ai un signal et ce signal est un bitvector (Z). La longueur du bitvector dépend d'une entrée n, elle n'est pas fixe. Pour trouver la longueur, je dois faire quelques calculs. Puis-je définir un signal après avoir défini les variables? Cela me donne des erreurs quand je fais ça. Cela fonctionne bien Si je garde le signal avant les variables (ce qui est montré ci-dessous) .. mais je ne le veux pas .. la longueur de Z dépend des calculs des variables. Quelle est la solution ?Signaux et variables en VHDL (ordre) - Problème

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 


entity BSD_Full_Comp is 
     Generic (n:integer:=8); 
     Port(X, Y : inout std_logic_vector(n-1 downto 0); 
      FZ : out std_logic_vector(1 downto 0)); 
end BSD_Full_Comp; 

architecture struct of BSD_Full_Comp is 


Component BSD_BitComparator 
    Port (Ai_1 : inout STD_LOGIC; Ai_0 : inout STD_LOGIC; 
      Bi_1 : inout STD_LOGIC; Bi_0 : inout STD_LOGIC; 
      S1 : out STD_LOGIC; S0 : out STD_LOGIC 
    ); 
END Component; 



Signal Z : std_logic_vector(2*n-3 downto 0); 



begin 

    ass : process 

Variable length : integer := n; 
Variable pow : integer :=0 ; 
Variable ZS : integer :=0; 
begin 
while length /= 0 loop 
length := length/2; 
pow := pow+1; 
end loop; 
length := 2 ** pow; 
ZS := length - n; 

wait; 

    end process; 



end struct; 

Répondre

0

La longueur du vecteur de bits dépend de une entrée n, il n'a pas été fixée.

Il est fixe, il est un générique. Une fois que vous avez compilé et élaboré (c'est-à-dire construit) le FPGA, n est corrigé. Et c'est bien, vous pouvez l'utiliser pour définir les longueurs de signaux dans l'architecture. Comme avec l'autre répondant, je ne suis pas sûr de ce que vous essayez de faire avec votre processus. Essayez-vous de calculer la longueur que le signal Z devra avoir?

Si oui, vous pouvez le mettre dans une fonction, et utiliser la fonction dans la déclaration de Z:

signal Z:std_logic_vector(calc_z_high_bit(n) downto 0);

1

On dirait que vous essayez de changer la taille d'un bus matériel en fonction du résultat du calcul? Rappelez-vous qu'une fois que vous compilez le circuit et que vous le gravez sur la FGPA, toutes les tailles de bus sont fixes. Il est possible qu'un FPGA change sa configuration à la volée, mais je suppose que ce n'est pas nécessaire la plupart du temps. Et je suppose que c'est aussi difficile à faire. Peut-être que vous expliquerez exactement ce que vous essayez de calculer, et peut-être que nous pouvons trouver une autre façon de le faire.

Quelques autres choses. Je ne suis pas 100% familier avec VHDL, mais avez-vous les ports bidirectionnels (les inout s)? En outre, vous ne semblez pas utiliser BSD_BitComparator; ou ports X, Y ou FZ; ou signalez Z dans la description de votre architecture.

0

Un générique est fixé à la compilation/heure d'élaboration. Une variable peut changer pendant l'exécution. Donc, ce que vous visez n'est pas directement possible comme vous essayez de le faire. Si vous souhaitez spécifier dynamiquement un bit bits du bus, vous devez définir le bus le plus grand possible, puis utiliser votre n calculé pour extraire la tranche du bus dont vous avez besoin.