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
-----