Index: PROJECT_CORE_MPI/SWITCH_GEN/BRANCHES/v0.03/INPUT_PORT_MODULE.vhd
===================================================================
--- PROJECT_CORE_MPI/SWITCH_GEN/BRANCHES/v0.03/INPUT_PORT_MODULE.vhd	(revision 45)
+++ PROJECT_CORE_MPI/SWITCH_GEN/BRANCHES/v0.03/INPUT_PORT_MODULE.vhd	(revision 65)
@@ -44,5 +44,5 @@
     Port ( data_in : in  STD_LOGIC_VECTOR (Word-1 downto 0);
            data_in_en : in  STD_LOGIC; -- signaler la présence des données en entrée
-			  cmd_in_en : STD_LOGIC;    --permet d'identifier les données qui sont dans le tampon
+			  cmd_in_en :in STD_LOGIC;    --permet d'identifier les données qui sont dans le tampon
            reset : in  STD_LOGIC;
 			  clk   : in  STD_LOGIC;
@@ -73,5 +73,5 @@
 
 --definition du type etat pour les fsm
-type fsm_states is (state0, CmdOn, WaitGrant, ReqPort, state1, state2,stpulse, state3);-- definition du type etat pour le codage des etats des fsm
+type fsm_states is (state0, CmdOn, WaitGrant, ReqPort, state1, state2,stpulse,stateErr, state3);-- definition du type etat pour le codage des etats des fsm
 type fsm_states2 is(cmdstart,cmdwait,cmdread,cmdSetDest,cmdSetCount,cmdSetId,cmdpulse,CmdEnd);
 signal pop_state : fsm_states;
@@ -79,9 +79,10 @@
 signal cmd_exec : std_logic:='0';  --indique que le port est en train d'exécuter une commande
 signal dat_exec :std_logic:='0'; -- indique le port est en train de transférer des données
-signal readOk : std_logic:='0'; --indique s'il est possible de lire les données
+signal dat_Err :std_logic:='0'; -- signal une erreur pendant l'exécution 
+signal readOk,CmdReadOk : std_logic:='0'; --indique s'il est possible de lire les données
 -- signaux utilisés dans les fsm
-signal request_decoder : STD_LOGIC_VECTOR(number_of_ports  downto 1);
+signal request_decoder,req_grant : STD_LOGIC_VECTOR(number_of_ports  downto 1);
 signal request_decoder_en : std_logic;
-signal request_latch : STD_LOGIC_VECTOR(4 downto 1);   -- pourquoi pas 3 downto 0 ?
+signal request_latch : STD_LOGIC_VECTOR(4 downto 1):=(others=>'0');   -- pourquoi pas 3 downto 0 ?
 signal request_latch_en : std_logic;
 signal pipeline_latch : std_logic_vector(Word-1 downto 0);
@@ -131,10 +132,11 @@
 
 data_out <= pipeline_latch ;--when cmd_exec='0' else cmd_data_signal;
-fifo_empty <= fifo_empty_signal;
+fifo_empty <= empty_latch;
 reset_signal <= reset;
 grant_proc:process(clk)
 begin
 if rising_edge(clk) then
-	if unsigned(grant)> 0 then
+--	if unsigned(grant)> 0 then
+	if unsigned(req_grant) > 0 then
 		port_granted <= '1';   		--il faut veiller à ce que ce port soit vraiment autorisé
 	else 
@@ -145,4 +147,8 @@
 rd_en_signal <= not(empty_latch) ;
 request <= request_decoder;
+reg_grant:process (request_decoder,grant)
+begin
+req_grant<=request_decoder and grant;
+end process reg_grant;
 request_word <=  request_latch & request_decoder_en;
 clk_signal <= clk;
@@ -499,5 +505,5 @@
 		  case pop_state is
 			when state0 => if cmd_in_en='0'  then --il ne faut pas exécuter les deux MAE ...
-									if fifo_empty_signal  ='0' then -- pile pas vide on doit dépiler									
+									if empty_latch  ='0' then -- pile pas vide on doit dépiler									
 										pop_state <= WaitGrant;
 									end if;
@@ -505,7 +511,14 @@
 									pop_state <= CmdOn;
 								end if;
-			when CmdOn => if fifo_empty_signal='1' then
+			when CmdOn => if empty_latch='1' and cmd_in_en='0' then
 								pop_state <= state0;
+								elsif empty_latch='0' and cmd_in_en='1' then
+								pop_state <= CmdOn;
+								elsif empty_latch='1' and cmd_in_en='1' then
+								pop_state <= state0;
+								else -- empty_latch='0' and cmd_in_en='0'
+								pop_state <= WaitGrant;
 								end if;
+								
 			when WaitGrant => if port_granted = '1' then
 										--
@@ -536,4 +549,8 @@
 										  pop_state <= state2;
 										  ReadOk<='1';
+										else --rd_en_signal='0' fin prématurée de la lecture
+											ReadOk<='0';
+											pop_state<=stateErr;
+											data_counter<=(others => '0');
 										end if;
 									else
@@ -549,5 +566,7 @@
 										data_counter <= data_counter - 1;
 										pop_state <= state0;
-																						
+			when stateErr => 	 
+										data_counter <= data_counter;
+										pop_state <= stateErr;												
 			when others => pop_state <= state0;
 		   end case;
@@ -557,5 +576,5 @@
 
 -- actions associées à chaque etat de la fsm de mealy
-pop_fsm_action : process(pop_state, fifo_out_signal,fifo_empty_signal, rd_en_signal,readok, port_granted )
+pop_fsm_action : process(pop_state, fifo_out_signal,empty_latch, rd_en_signal,readok, port_granted )
   begin   
 -- code fonctionnel	
@@ -568,7 +587,9 @@
 								dat_priority_rotation <= '1';
 								dat_exec<='0';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
+								
 		when CmdOn =>		dat_request_latch_en <= '0';  
-								dat_pipeline_latch_en <= rd_en_signal;
+								dat_pipeline_latch_en <= '0';
 								dat_fifo_read_signal <='0';
 								dat_request_decoder_en <= '0';
@@ -576,4 +597,5 @@
 								dat_priority_rotation <= '1';
 								dat_exec<='0';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
 		when WaitGrant =>	
@@ -585,13 +607,15 @@
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal(7 downto 4) & PORT_ID(3 downto 0);
 		when ReqPort =>	
 								dat_request_latch_en <='1'; --autoriser l'identification du port de destination
-								dat_pipeline_latch_en <= Port_granted; --pour le transmettre à travers le réseau
-								dat_fifo_read_signal <= Port_granted;
+								dat_pipeline_latch_en <= '1'; --pour le transmettre à travers le réseau
+								dat_fifo_read_signal <= '1';
 								dat_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
 								dat_data_out_pulse <= '0';     --transmettre le signal pour le dernier mot
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal(7 downto 4) & PORT_ID(3 downto 0);
 							
@@ -600,7 +624,8 @@
 								dat_fifo_read_signal <= rd_en_signal and port_granted;
 								dat_request_decoder_en <= '1';
-								dat_data_out_pulse <= '1';
+								dat_data_out_pulse <= port_granted;
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
 								
@@ -612,4 +637,5 @@
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
 								
@@ -621,4 +647,5 @@
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
 								
@@ -630,6 +657,15 @@
 								dat_data_out_pulse <= '0';
 								dat_exec<='0';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
-		
+		when stateErr =>    dat_request_latch_en <= '0';
+								dat_pipeline_latch_en <= '0';
+								dat_priority_rotation <= '1';    -- libérer la priorité
+								dat_fifo_read_signal <= '0';
+								dat_request_decoder_en <= '0';   --libérer le décodeur
+								dat_data_out_pulse <= '0';
+								dat_exec<='1';
+								dat_Err<='1';
+								push_dout<=fifo_out_signal;
 		when others =>    dat_request_latch_en <= '0';
 								dat_pipeline_latch_en <= '0';
@@ -639,4 +675,5 @@
 								dat_data_out_pulse <= '0';
 								dat_exec<='0';
+								dat_Err<='0';
 								push_dout<=fifo_out_signal;
 										
@@ -655,45 +692,57 @@
 	
 	   when cmdstart  =>
-				if cmd_in_en='1' and dat_exec='0' and fifo_empty_signal='0' then 
-				cmdstate<=cmdwait;
+				if cmd_in_en='1' and dat_exec='0' and empty_latch='0' then 
+				cmdstate<=cmdread;
 				end if;
-		when cmdwait => if fifo_empty_signal='0' and port_granted ='1' then
+				cmdReadOk<='0';
+		when cmdwait => if port_granted='1' then  -- demande du port de sortie
 								
-									cmdstate<=cmdread;
+									cmdstate<=cmdsetdest;
+							elsif cmd_in_en='1' then
+								cmdstate<=cmdwait;
 							else 
 								cmdstate<=cmdstart;
 							end if;
+							cmdReadOk<='0';
 		when cmdread =>
-				if port_granted ='1'then -- ne pas modifier l'état des priorités si on ne l'avait pas
+--				if port_granted ='1'then -- ne pas modifier l'état des priorités si on ne l'avait pas
 					cmdcode:= to_integer(unsigned(fifo_out_signal));
 					if cmdcode=1 then --code de getportid
-							cmdstate<=cmdsetdest;
+							cmdstate<=cmdwait;
+							cmdReadOk<='1';
 					else
-						if port_granted='1' then
-							cmdstate<=cmdend;
-						end if;
+						        --ne pas prendre le code inconnu en compte
+							cmdstate<=cmdend; -- la commande n'a pas été reconnu
+						
+						cmdReadOk<='0';
 					end if;
-				end if;
+--				end if;
 		when cmdsetdest =>
 				if port_granted='1' then
 					cmdstate<=cmdsetcount;
 				end if;
+				cmdReadOk<='0';
 		when cmdsetcount =>
 				if port_granted='1' then
 					cmdstate<=cmdsetID;
+				else
+					cmdstate<=cmdsetdest;
 				end if;
+				cmdReadOk<='0';
 		when cmdsetID=>
 			if port_granted='1' then
 			cmdstate <=cmdpulse;
 			end if;
+			cmdReadOk<='0';
 		when cmdpulse =>
 			if port_granted='1' then
 			cmdstate <=cmdEnd;
 			end if;
+			cmdReadOk<='0';
 		when cmdend  =>
-			
+			if cmd_in_en='0' then --éviter l'exécution en boucle
 				cmdstate<=cmdstart; 
-			
-				
+			end if;
+			cmdReadOk<='0';	
 	  
 	end case;
@@ -715,27 +764,27 @@
 						cmd_data_signal<=(others=>'0');
 						cmd_data_out_pulse <= '0';
-	when cmdwait =>
+
+	when cmdread =>
+						cmd_exec<='1';
+						cmd_pipeline_latch_en <= '0';
+						cmd_fifo_read_signal <= '1'; -- vider le tampon d'entrée
+						cmd_request_latch_en<='1';    --mémoriser l'adresse de destination
+						cmd_request_decoder_en <= '1';                   --demande d'émission
+						cmd_data_out_pulse <= '0';
+						cmd_priority_rotation <= '1';                    --sans priorité
+						cmd_data_signal<=Port_ID;  
+		when cmdwait =>
 						cmd_exec<='1';
 						cmd_pipeline_latch_en <='0';
 						cmd_fifo_read_signal <= '0';
-						cmd_priority_rotation <= '1';    --sans priorité
-						cmd_request_latch_en<='0';
-						cmd_request_decoder_en <= not(fifo_empty_signal);   --demande d'émission
-						cmd_data_signal<=(others=>'0');
-						cmd_data_out_pulse <= '0';
-	when cmdread =>
-						cmd_exec<='1';
-						cmd_pipeline_latch_en <= '1';
-						cmd_fifo_read_signal <= '0';
-						cmd_request_latch_en<='1';    --mémoriser l'adresse de destination
-						cmd_request_decoder_en <= '1';                   --demande d'émission
-						cmd_data_out_pulse <= '0';
-						cmd_priority_rotation <= '0';                    --avec priorité
-						--cmd_data_signal<=(others=>'0');
-						cmd_data_signal<=Port_ID;  
+						cmd_request_latch_en<='1';
+						cmd_priority_rotation <= '0';    --avec priorité
+						cmd_request_decoder_en <= '1';   --demande d'émission
+						cmd_data_signal<=Port_ID;
+						cmd_data_out_pulse <= '0';					
 	when cmdsetdest  =>
 						--cmd_request_decoder_en <= '1';
 						cmd_exec<='1';
-						cmd_pipeline_latch_en <='1';
+						cmd_pipeline_latch_en <='1'; --empiler dans le tampon de sortie la donnée
 						cmd_fifo_read_signal <='0';
 						cmd_request_latch_en<='0';
@@ -744,5 +793,14 @@
 						cmd_priority_rotation <= '0';
 						cmd_data_signal<=Port_ID;    -- le numéro du port et le nombre total des ports est envoyé
-						
+	when cmdsetcount =>
+								 
+						cmd_exec<='1';   
+						cmd_pipeline_latch_en <='1'; -- empiler dans le tampon de sortie les données
+						cmd_fifo_read_signal <='0';
+						cmd_request_latch_en<='0';  --enregistrer l'adresse de destination
+						cmd_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
+						cmd_data_out_pulse <= port_granted;
+						cmd_priority_rotation <= '0';
+						cmd_data_signal<=STD_LOGIC_VECTOR(to_unsigned(3,8));					
 	when cmdSetId =>
 						--cmd_request_decoder_en <= '1';
@@ -750,21 +808,10 @@
 						cmd_pipeline_latch_en <='1';
 						cmd_fifo_read_signal <='0';
-						cmd_request_latch_en<='0';
+						cmd_request_latch_en<='0';			--enregistrer l'adresse de destination
 						cmd_request_decoder_en <= '1';          --autoriser le decodeur à activer le dernier bit de request
-						cmd_data_out_pulse <= '1';
+						cmd_data_out_pulse <= port_granted;
 						cmd_priority_rotation <= '0';
 						cmd_data_signal<=Port_ID;    -- le numéro du port et le nombre total des ports est envoyé
 											
-	when cmdsetcount =>
-								 
-						cmd_exec<='1';   
-						cmd_pipeline_latch_en <='1';
-						cmd_fifo_read_signal <='1';
-						cmd_request_latch_en<='0';
-						cmd_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
-						cmd_data_out_pulse <= port_granted;
-						cmd_priority_rotation <= '0';
-						cmd_data_signal<=STD_LOGIC_VECTOR(to_unsigned(3,8));
-	
 	when cmdpulse =>	cmd_exec<='1';
 						cmd_pipeline_latch_en <='0';
