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 19/10/2012, 12h03   #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 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 ?
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 15h43   #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
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,
titiri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/10/2012, 16h03   #3
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
Eh ben, tout ça n'est pas fait pour nous aider !
En tous cas, merci pour cette explication très claire.
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 17h28   #4
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
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 :
Citation:
(vcom-1136) Unknown identifier "signed".
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2012, 12h50   #5
titiri
Membre régulier
 
Inscription : juin 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 37
Points : 77
Points : 77
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
titiri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/10/2012, 09h05   #6
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
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.
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 11h38   #7
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
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 ?
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 11h42   #8
titiri
Membre régulier
 
Inscription : juin 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 37
Points : 77
Points : 77
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,
titiri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/10/2012, 13h12   #9
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
Houlala, que d'idioties !
Merci pour ce débogage de base, je manque apparemment d’expérience en VHDL.
binome-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web