Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    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 :
    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
    Inscrit en
    juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 52
    Points : 95
    Points
    95

    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 :
    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 :
    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
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    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
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    Par défaut

    Bon, j'ai toujours un problème. Mon code :
    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.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
    Inscrit en
    juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 52
    Points : 95
    Points
    95

    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 :
    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
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    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
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    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 :
    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
    Inscrit en
    juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 52
    Points : 95
    Points
    95

    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
    Invité de passage
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : novembre 2007
    Messages : 74
    Points : 4
    Points
    4

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •