'HDL-27 valeur constante requise »lors de l'utilisation du signal que l'indice

W

woutput

Guest
J'espère que vous pourrez m'aider sur ce problème, j'ai travaillé dessus depuis quelques jours.

Lorsque je simule le code suivant VHDL, je reçois pas d'erreurs et les résultats sont bons.
Une partie de mon code:

library ieee;
utilisation ieee.std_logic_1164.all;
utilisation ieee.numeric_std.all; - d'utiliser to_integer ()
...
génériques
(
AXI_ADDR_DATA_BITS: integer: = 32;
VPAGE_BITS: integer: = 12;
VPAGE_SETTING_BITS: integer: = 3;
VPAGE_SETTING_OFFSET: integer: = 10
)
port
(
PAGE_SIZE_SETTING: in std_logic_vector (VPAGE_SETTING_BITS - 1 downto 0);
VIR_ADDRESS_PAGE: out std_logic_vector (VPAGE_BITS - 1 downto 0);
VIR_ARAW_ADDR: in std_logic_vector (AXI_ADDR_DATA_BITS - 1 downto 0);
)
...
VIR_ADDRESS_PAGE <=
VIR_ARAW_ADDR
(
VPAGE_BITS

to_integer
(
unsigned
(
PAGE_SIZE_SETTING
)
)

VPAGE_SETTING_OFFSET
--
1
downto
to_integer
(
unsigned
(
PAGE_SIZE_SETTING
)
)

VPAGE_SETTING_OFFSET
);

Mais quand je le synthétiser, j'obtiens l'erreur suivante: HDL-27 valeur constante requise
Quand je regarde la description d'erreur (2nd hit: Google pour la «valeur constante requise" VHDL), il n'est pas clair pour moi pourquoi ce n'est pas possible.Je pourrais l'image d'un circuit combinatoire (avec beaucoup de multiplexeurs) qui pourrait résoudre ce problème.
Lorsque je remplace "to_integer (non signé (PAGE_SIZE_SETTING))» par «3», il synthétise aussi.Comme ceci:

VIR_ADDRESS_PAGE <=
VIR_ARAW_ADDR
(
VPAGE_BITS

3

VPAGE_SETTING_OFFSET
--
1
downto
3

VPAGE_SETTING_OFFSET
);

Pour résoudre ce problème, j'ai essayé le code suivant:

CORRECTIF: for i in (to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET) à (VPAGE_BITS to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET - 1) Loop
(VIR_ADDRESS_PAGE I - (to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET)) <= VIR_ARAW_ADDR (I);
boucle de la fin FIX;

mais j'obtiens la même erreur à nouveau.Lors de l'application de la remplacer, elle «travaille» à nouveau.Comme ceci:

CORRECTIF: for i in (3 VPAGE_SETTING_OFFSET) à (VPAGE_BITS 3 VPAGE_SETTING_OFFSET - 1) Loop
VIR_ADDRESS_PAGE (I - (3 VPAGE_SETTING_OFFSET)) <= VIR_ARAW_ADDR (I);
boucle de la fin FIX;

Pouvez vous me donner un indice pour résoudre mon problème s'il vous plaît?
Je pense que mon problème est "juste" l'indexation d'une std_logic_vector avec un signal que l'indice.

Nous vous remercions à l'avance,
Wouter

Simulation: ModelSim SE 6.3a
Synthèse: Synopsys Design Analyzer

 
Une gamme discrète VHDL (soit comme élément de tableau ou dans une itération) doit être constant par la spécification, je crois.ModelSim mai accepter une mesure variable, la cause qu'elle ne distingue pas clairement entre le temps de compiler et exécuter des opérations en temps à cet égard.Mais vous pouvez effectuer une itération sur l'index de gamme et sélectionnez un Cordillère de l'assignation des données par une instruction IF.

 
Merci beaucoup!
Cela m'a vraiment aidé.

Maintenant, j'ai

VIR_ADDRESS_PAGE <= (others => '0 ');
FILL_VIR_ADDRESS_PAGE: for i in (0 VPAGE_SETTING_OFFSET) à (VPAGE_BITS (2 VPAGE_SETTING_BITS ** - 1) VPAGE_SETTING_OFFSET - 1) Loop
if ((I> (to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET)) et (i <(VPAGE_BITS to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET - 1))) then
(VIR_ADDRESS_PAGE I - (to_integer (non signé (PAGE_SIZE_SETTING)) VPAGE_SETTING_OFFSET)) <= VIR_ARAW_ADDR (I);
End If;
END LOOP FILL_VIR_ADDRESS_PAGE;Ce qui prend du temps pour synthétiser, mais semble être OK.

Merci encore, j'espère que vous pourrez m'aider avec mon problème de durer trop (autre sujet)
Wouter

 

Welcome to EDABoard.com

Sponsor

Back
Top