Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Multiplication virgule fixe en VHDL

  1. alexglvr

    Date d'inscription
    septembre 2007
    Messages
    74

    Multiplication virgule fixe en VHDL

    Bonjour,

    je suis en train de décrire un composant en VHDL, et j'ai un doute concernant la multiplication virgule fixe...

    Je dois multiplier :

    M1 : std_logic_vector (15 downto 0);
    par M2 : std_logic_vector (7 downto 0);

    M1 est un virgule fixe signé codé sous la forme 0 0.000000 et M2 entier relatif.

    le résultat de cette multiplication sera donc mathématiquement codé sous 24 bits...

    Questions:

    En VHDL, Dois je avoir M1 et M2 de même taille pour pouvoir les multiplier?

    SI oui, je dois donc faire une extension de signe de M2....

    Res <= ((M2(7)&M2(7)&M2(7)&M2(7)&M2(7 )&M2(7)&M2(7)&M2(7)&M2)*M1);

    Mais du coup mon résultat "Res" est défini sur 32 bits dont 8 sont "inutiles"...

    J'ai donc essayé de faire ça :


    Res : std_logic_vector (23 downto 0);
    ...
    Res <= ((M2(7)&M2(7)&M2(7)&M2(7)&M2(7 )&M2(7)&M2(7)&M2(7)&M2)*M1);

    Mais du coup, j'ai un warning à la synthèse comme quoi les dimensions ne sont pas compatibles...


    J'ai donc fini par faire ça :


    Code:
    entity Synchro_voies is
       PORT (
    	       Clk	      	:	in 	std_logic;
                   Raz	  	:   	in 	std_logic;
    	
    	       M1		:	in	std_logic_vector (15 downto 0);	
    	       M2		:	in	std_logic_vector (7 downto 0);	
    	       Res		:	in	std_logic_vector (23 downto 0)
    		);
    end Synchro_voies;
    
    architecture Behavioral of Synchro_voies is
    
    	signal Res1		: std_logic_vector (31 downto 0);	
    	
    begin
    	
    Res <= Res1 (23 downto 0);
    
    Phase_treat : process (Clk, RAZ)
    begin
    
    if Raz = '1' then	
         Res1 <= (others => '0');
    elsif Clk'event and Clk = '1' then
         Res1 <= ((M2(7)&M2(7)&M2(7)&M2(7)&M2(7)&M2(7)&M2(7)&M2(7)&M2)*M1);
    end if;
    end process;
    end Behavioral;

    Mais du coup est ce que je ne déclare/utilise pas un registre de 32 bits pour rien???

    Merci pour votre aide,

    Alex

    -----

     


    • Publicité



  2. jiherve

    Date d'inscription
    juin 2006
    Localisation
    gironde
    Âge
    65
    Messages
    15 179

    Re : Multiplication virgule fixe en VHDL

    Bonsoir,
    pour une multiplication il n'est pas nécessaire d'avoir des vecteurs de même taille par contre la sortie doit avoir une taille égale à la somme des deux opérandes.
    On ne multiplie pas deux std_logic_vector sauf à utiliser un overloading des librairies mathématiques usuelles ce qui est toujours un mauvais codage.
    http://www.csee.umbc.edu/help/VHDL/numeric_std.vhdl
    Il faut multiplier soit des signed , unsigned soit des integer , la gestion de la virgule et du signe est à la charge du concepteur.
    donc le bon codage c'est :
    signal a : std_logic_vector(sizea-1 downto 0);
    signal b : std_logic_vector(sizeb-1 downto 0);
    signal c : std_logic_vector(sizea+sizeb - 1 dowto 0);
    ....
    ...
    c <= std_logic_vector(signed(a) * signed(b));
    ...
    faire attention à la gestion du signe
    JR
    l'électronique c'est pas du vaudou!
     

  3. alexglvr

    Date d'inscription
    septembre 2007
    Messages
    74

    Re : Multiplication virgule fixe en VHDL

    Tout d'abord merci pour votre réponse...

    c <= std_logic_vector(signed(a) * signed(b));
    Comment sont traduis les "conversions" signed() et std_logic_vector lors de la synthèse?
     

  4. jiherve

    Date d'inscription
    juin 2006
    Localisation
    gironde
    Âge
    65
    Messages
    15 179

    Re : Multiplication virgule fixe en VHDL

    Bonsoir,
    par l'instanciation d'une fonction multiplieur, dans le cas d'une cible Altera cela appellera soit LPM_MULT (multiplieur "soft", logic cell interconnectées de façon ad hoc) soit un bloc DSP(multiplieur "hard" précablé).
    Cela doit faire la même chose sur d'autres cibles.
    JR
    l'électronique c'est pas du vaudou!
     


    • Publicité







Sur le même thème :





 

Discussions similaires

  1. VHDL : Multiplication signée
    Par alexglvr dans le forum Électronique
    Réponses: 2
    Dernier message: 06/10/2009, 20h37
  2. puissance 10 à virgule
    Par petitours dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 12/08/2009, 12h02
  3. Point flottant en VHDL et vhdl-200x
    Par grel08128103 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 02/09/2008, 20h47
  4. Calcul en virgule fixe/flottante
    Par aurelien.pean dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 17/02/2007, 16h15