Multiplicateur entier en VHDL

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 :

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 !

1 réponse

druduche Messages postés 6 Statut Membre
 
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

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