Multiplicateur entier en VHDL
druduche
Messages postés
6
Statut
Membre
-
druduche Messages postés 6 Statut Membre -
druduche Messages postés 6 Statut Membre -
Bonjour à tous !
Je suis étudiant en informatique, et j'apprends actuellement le VHDL.
Mon problème est le suivant : je dois faire un multiplicateur 23 bits en VHDL (23 car ca fait partie d'un projet plus gros d'un multiplicateur float 32bits, donc la mantisse fait 23 bits).
J'utilist la méthode suivante :
a chaque tour : si le bit de poids faible de B est égal à 1, on ajoute A au résultat.
puis, on shifte B vers la droite ( division par 2 ) et on shifte A vers la gauche ( multiplication par 2). Exemple :
5x6 = 101 x 110 = 10 x 1100 + 110 = 1 x 11000 + 110 = 11110 = 30
voici mon code :
il s'agit d'une machine séquentielle a quatre états avec 1 registre normal pour le résultat, et 2 registre de shift (que j'ai fait moi même, je pense que c'est de la que vient le problème) qui, au lieu de conserver leur valeur a chaque tour, la shifte d'un cran vers la gauche ou vers la droite...
le résultat de la simulation sort un état totalement métastable pour result...
Merci d'avance pour vos réponses !
Je suis étudiant en informatique, et j'apprends actuellement le VHDL.
Mon problème est le suivant : je dois faire un multiplicateur 23 bits en VHDL (23 car ca fait partie d'un projet plus gros d'un multiplicateur float 32bits, donc la mantisse fait 23 bits).
J'utilist la méthode suivante :
a chaque tour : si le bit de poids faible de B est égal à 1, on ajoute A au résultat.
puis, on shifte B vers la droite ( division par 2 ) et on shifte A vers la gauche ( multiplication par 2). Exemple :
5x6 = 101 x 110 = 10 x 1100 + 110 = 1 x 11000 + 110 = 11110 = 30
voici mon code :
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Multiplicateur is port( A,B :in std_logic_vector(22 downto 0); clk,reset,start :in std_logic; result :out std_logic_vector(47 downto 0); ok : out std_logic ); end Multiplicateur; architecture test of Multiplicateur is type state is (init,state2,state3,state4); signal currentState, nextState : state; signal inregB, outregB : std_logic_vector(22 downto 0); signal inRes, outRes, inregA, outregA : std_logic_vector(47 downto 0); signal loadA, loadB : std_logic; begin -- process qui va changer d'état et s'occuper du reset process (reset, clk) begin if( reset = '1' ) then currentState <= init; elsif (clk'event and clk='1') then currentState <= nextState; end if; end process; process (currentState, start) begin ok <= '0'; loadA <= '0'; loadB <= '0'; nextState <= init; result <= (47 downto 0 => '0'); case currentState is when init => if start='1' then nextState <= state2; end if; when state2 => loadA <= '1'; loadB <= '1'; nextState <= state3; when state3 => if ( outregB /= (22 downto 0 => '0') ) then if (outregB(0) = '1') then inRes <= outRes + outregA; end if; --shift de regB nextState <= state3; else nextState <= state4; end if; when state4 => ok <= '1'; result <= outRes; end case; end process; shift_B : process (clk,reset) begin if(reset='1') then outregB <= (22 downto 0 => '0'); else if (clk'event and clk = '1') then if (loadB = '1') then --on met l'input outregB <= B; else --on shift a droite outregB(21 downto 0) <= outregB(22 downto 1); outregB(22) <= '0'; end if; end if; end if; end process; shift_A : process (clk,reset) begin if(reset='1') then outregA <= (47 downto 0 => '0'); else if (clk'event and clk = '1') then if (loadA = '1') then --on met l'input outregA <= (47 downto 23 => '0') & A; else --on shift a gauche outregA(47 downto 1) <= outregA(46 downto 0); outregA(0) <= '0'; end if; end if; end if; end process; resultat : process ( clk) begin if (clk'event and clk='1') then outRes <= inRes; end if; end process; end test;
il s'agit d'une machine séquentielle a quatre états avec 1 registre normal pour le résultat, et 2 registre de shift (que j'ai fait moi même, je pense que c'est de la que vient le problème) qui, au lieu de conserver leur valeur a chaque tour, la shifte d'un cran vers la gauche ou vers la droite...
le résultat de la simulation sort un état totalement métastable pour result...
Merci d'avance pour vos réponses !
A voir également:
- Multiplicateur entier en VHDL
- Comment imprimer un tableau excel en entier - Guide
- Il manque 5 valeurs dans le tableau ci-dessous. retrouvez-les dans votre tableau, puis reportez-les arrondies à l’entier le plus proche. - Guide
- Site pour regarder des film en entier gratuitement sans compte ✓ - Forum Réseaux sociaux
- Appliquer un coefficient multiplicateur excel ✓ - Forum Excel
- Imprimer un tableau sur une seule page avec Excel - Guide
1 réponse
Ouf, trop de tabs !
Voila ce qu'il y a marqué sous la définition de l'architecture, j'avais oublier d'enlever ce que je n'utilisais plus
Voila ce qu'il y a marqué sous la définition de l'architecture, j'avais oublier d'enlever ce que je n'utilisais plus
type state is (init,state2,state3,state4); signal currentState, nextState : state; signal outregB : std_logic_vector(22 downto 0); signal inRes, outRes, outregA : std_logic_vector(47 downto 0); signal loadA, loadB : std_logic;