Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > VHDL
VHDL Forum d'entraide sur VHDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/11/2012, 18h12   #1
binome-x
Invité de passage
 
Homme
Ingénieur/Chercheur
Inscription : novembre 2007
Messages : 56
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur/Chercheur

Informations forums :
Inscription : novembre 2007
Messages : 56
Points : 1
Points : 1
Par défaut Test de parité d'un entier

Bonjour,
j'aimerais simplement donner la valeur d'une sortie en fonction de la parité de l'indice d'une boucle. Un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
library ieee;
use     ieee.std_logic_1164.all;
use 	ieee.std_logic_arith.all;
use     ieee.std_logic_signed.all;

entity pair is
	port(
		x :		out std_logic_vector(7 downto 0));
end pair;

architecture rtl of pair is
begin
	parité : for k in 0 to 7 loop
		x(k) <= '0' when (k mod 2=0) else
		x(k) <= '1';
	end loop;
end rtl;
Mais Modelsim ne compile pas ce code :
Citation:
** Error: D:/work/FFT/cellule/src/pair.vhd(13): Illegal concurrent statement.
** Error: D:/work/FFT/cellule/src/pair.vhd(15): Type error resolving infix expression "<=" as type ieee.std_logic_1164.STD_LOGIC.
** Error: D:/work/FFT/cellule/src/pair.vhd(15): Cannot read output "x".
J'ai bien peur de mélanger instructions concurrentes et séquentielles.
Quelqu'un peut m'aider ?
Merci.
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 20h47   #2
titiri
Membre régulier
 
Inscription : juin 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 37
Points : 77
Points : 77
Bonsoir,

Réponse en plusieurs points :
  1. l'opérateur "mod" n'est vraiment pas recommandé en synthèse. Il est vrai que le modulo d'une puissance de 2 est normalement correctement géré par les outils de synthèse, mais ça reste bof... Bon, là coup de chance, c'est sur une constante, donc absolument aucun soucis
  2. de même, le type "integer" (et associés : natural, positive) est lui aussi à éviter cette fois pour la raison suivante : un integer est défini sur 32bits (de -2^31 à 2^31 - 1) et correspond donc à 32 registres. La seule parade consiste à définir une range (style 'signal MyInt : integer range 0 to 7') mais se pose alors un autre problème : lorsque l'on souhaite faire un compteur qui reboucle automatiquement de 7 à 0, il faut explicitement faire :
    Code :
    1
    2
    if MyInt=7 then MyInt <= 0;
    else            MyInt <= MyInt + 1; end if;
    C'est beaucoup plus simple et judicieux de définir un std_logic_vector(2 downto 0) et l'on fait toujours "+1" : le rebouclage de 7 à 0 est direct
  3. puisque l'on est dans le monde des std_logic_vector, ce qui de toute façon correspond physiquement à ce qui sera implémenté, la parité d'un objet se teste tout simplement en regardant le bit de poids faible du vecteur
  4. On a donc les deux possibilités :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    process
    begin
    for k in 0 to 7 loop
        if k mod 2=0 then x(k) <= '0';
        else              x(k) <= '1'; end if;   
    end loop;
    
    MyLabel : for k in 0 to 7 generate
        x(k) <= '0' when (k mod 2=0) else
                '1';
    end generate MyLabel ;

Cdlt
titiri est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h02.


 
 
 
 
Partenaires

Hébergement Web