IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VHDL Discussion :

Opérations arithmétiques simples


Sujet :

VHDL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut Opérations arithmétiques simples
    Bonjour,
    je voudrais faire des opérations arithmétiques simples en VHDL. Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_signed.all;
     
    entity butt is
    generic(
    	x_size : integer := 16);
    port(
    	p,q :	in  signed(x_size-1 downto 0);
    	x,y :	out signed(x_size-1 downto 0));
    end butt;
     
    architecture arc of butt is
    begin
    	x <= p+"0000000000000001";
    	y <= q-"0000000000000001";
    end arc;
    et déjà j'ai l'erreur : Subprogram "+" is ambiguous.
    avec Modelsim et j'ai des erreurs quelques soient les librairies utilisées.
    Vous savez comment faire ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Le piège malheureusement classique lié à une sournoiserie des IEEE. Les bibliothèques "std_logic_arith" et "std_logic_signed" ne sont pas de vraies bibliothèques IEEE, contrairement à ce que leur nom laisse penser.
    Les seules combinaisons qui existent et qui soient viables (simulation, synthèse, et cohérence/exactitude), avec dans tous les cas la std_logic_1164 :
    • pour ne gérer que des "unsigned" :
      1. 1ere possibilité : std_logic_arith et std_logic_unsigned
      2. 2eme possiblité : numeric_std
    • pour ne gérer que des "signed"
      1. 1ere possibilité KO : std_logic_arith et std_logic_signed
      2. 2eme possiblité : numeric_std


    La même chose en raccourcie : seule la "numeric_std" permet de couvrir tous les cas (unsigned et/ou signed) avec un comportement fonctionnel.

    Donc, en n'utilisant que numeric_std, ça fonctionne toujours. Par contre (et oui, il faut bien qu'il y ait quelques inconvénients ), les std_logic_vector n'ont plus de type (signé ou non-signé) par défaut. Ils restent de simples tableaux de std_logic.
    Pour faire une addition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    result_1 <= std_logic_vector(unsigned(a) + unsigned(b));
    result_2 <= std_logic_vector(  signed(c) + unsigned(b));
    result_3 <= std_logic_vector(  signed(c) + MaConstante);
    Vous pouvez aussi définir les objets "a", "b", "c" et "result_x" en tant que "unsigned" ou "signed" (au lieu de std_logic_vector). On écrit alors directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    result_1 <= a+b;
    result_2 <= c+b;
    result_3 <= c+MaConstante;
    Mais attention (et oui, encore un "warning" ) : évitez les types "unsigned" et/ou "signed" dans les ports des entités (ça peut devenir très rapidement la jungle en synthèse).

    Cdlt,

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Eh ben, tout ça n'est pas fait pour nous aider !
    En tous cas, merci pour cette explication très claire.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Bon, j'ai toujours un problème. Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.numeric_std;
     
    entity butt is
    generic(
    	x_size : integer := 16);
    port(
    	p,q :	in  signed(x_size-1 downto 0);
    	x,y :	out signed(x_size-1 downto 0));
    end butt;
     
    architecture arc of butt is
    begin
    	x <= p+"0000000000000001";
    	y <= q-"0000000000000001";
    end arc;
    Ca me donne l'erreur :
    (vcom-1136) Unknown identifier "signed".

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    L'erreur de compilation est simplement liée à l'oubli du ".all" après la bibliothèque "numeric_std".

    Une petite remarque sur le code : bonne idée que d'utiliser des paramètres "generic" pour rendre paramétrable votre code, mais votre addition et soustraction font apparaître un vecteur de 16bits. Remplacez plutôt ces deux vecteurs tout simplement par "1" (un integer, donc sans les ""), et c'est plus simple & lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    library ieee;
    use     ieee.std_logic_1164.all;
    use     ieee.numeric_std.all;
     
    entity butt is generic
        ( X_SIZE : integer := 16
        ); port
        ( p : in  signed(X_SIZE-1 downto 0)
        ; q : in  signed(X_SIZE-1 downto 0)
        ; x : out signed(X_SIZE-1 downto 0)
        ; y : out signed(X_SIZE-1 downto 0)
        );
    end entity butt;
     
    architecture arc of butt is
    begin
        x <= p + 1;
        y <= q - 1;
     
    end arc;
    Cdlt

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Bon ben merci pour le signalement du ".all" manquant. Erreur d'étourderie !
    Merci aussi pour le +-1, c'est vrai que c'est nettement plus lisible et plus facile à écrire.

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Désolé de continuer avec mes ennuis mais j'ai de nouveau un problème : je voudrais déclarer un signal mais Modelsim me dit que le type pose problème :** Error: D:/work/FFT/cellule/src/butt.vhd(15): Expecting a type name, found type conversion (to ieee.NUMERIC_STD.SIGNED) instead.
    et c'est pareil avec du std_logic_vector

    Je vous donne mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
     
    entity butt is
    generic(
    	x_size :	integer := 16;
    	w_size :	integer := 16);
    port(
    	p,q :		in  signed(x_size-1 downto 0);
    	x,y :		out signed(x_size-1 downto 0));
    end butt;
     
    architecture arc of butt is
    	signal m :	signed(x_size+w_size-1);
    begin
    	x <= p+1;
    	y <= q-1;
    end arc;
    Vous voyez le problème ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Ligne 15, la "range" définie n'est pas correcte; d'ailleurs ce n'est pas une range mais une valeur numérique
    x_size + w_size - 1 ==> 31
    Ne serait-ce pas plutôt signed(x_size+w_size-1 downto 0) ?

    Cdlt,

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Houlala, que d'idioties !
    Merci pour ce débogage de base, je manque apparemment d’expérience en VHDL.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Configuration] Opération arithmétique
    Par Fabouney dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 11/07/2007, 18h54
  2. Opération arithmétique dans un select
    Par Christophe Charron dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/03/2007, 11h19
  3. Réponses: 5
    Dernier message: 17/06/2006, 12h33
  4. Opération arithmétique de String à Float
    Par Shiryu57 dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2006, 10h22
  5. [VAL] Opérations arithmétiques
    Par WriteLN dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/05/2005, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo