Index: PROJECT_CORE_MPI/MPI_HCL/BRANCHES/v2.0/NOC/INPUT_PORT_MODULE.vhd
===================================================================
--- PROJECT_CORE_MPI/MPI_HCL/TRUNK/NOC/INPUT_PORT_MODULE.vhd	(revision 101)
+++ PROJECT_CORE_MPI/MPI_HCL/BRANCHES/v2.0/NOC/INPUT_PORT_MODULE.vhd	(revision 139)
@@ -40,6 +40,10 @@
 entity INPUT_PORT_MODULE is
     generic(number_of_ports : positive := 4;
-	 
-	 Port_num: natural:=1);  -- port_num est l'id du port
+				adr_mask : natural := 0;--le nombre de'1' en partant le la gauche de l'adresse
+				adr_len: positive:=10; --la taille en bit de l'adresse 10 bits --> 1024 hotes
+				tot_ports: positive :=8; --Nomnre de ports total du réseau
+				adr_sub_net : std_logic_vector(9 downto 0) := (others=>'0');--l'adresse du sous-réseau
+				Port_num: natural:=1;  -- port_num est l'id du port
+				nbyte : positive:=2); -- le nombre de Byte dans chaque mot du port par défaut 2
     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
@@ -52,5 +56,5 @@
 			  fifo_empty : out  STD_LOGIC; -- le tampon d'entrée est vide
 			  priority_rotation : out std_logic;  -- reserver le canal de transmission
-           data_out : out  STD_LOGIC_VECTOR (Word-1 downto 0); --données vers le réseau crossbar
+           data_out : out  STD_LOGIC_VECTOR (7 downto 0); --données vers le réseau crossbar
 			  data_out_pulse : out std_logic); -- permet de ...
        
@@ -73,6 +77,6 @@
 
 --definition du type etat pour les fsm
-type fsm_states is (state0, CmdOn, WaitGrant, ReqPort, state1, state2,strecover,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);
+type fsm_states is (state0, CmdOn, WaitGrant, ReqPort,addhead,addheadn, state1,state1n, state2,state2n,strecover,stpulse,stpulsen,stateErr, state3);-- definition du type etat pour le codage des etats des fsm
+type fsm_states2 is(cmdstart,cmdwait,cmdread,cmdSetDest,cmdSetCount,cmdSetId,cmdSetDestn,cmdSetCountn,cmdSetIdn,cmdpulse,cmdpulsen,CmdEnd);
 signal pop_state : fsm_states;
 signal cmdstate : fsm_states2;
@@ -81,4 +85,10 @@
 signal dat_Err :std_logic:='0'; -- signal une erreur pendant l'exécution 
 signal wrok,readOk,CmdReadOk : std_logic:='0'; --indique s'il est possible de lire les données
+--
+signal rt_err : std_logic;--erreur sur la route
+signal route :std_logic_vector(9 downto 0);
+signal dest_port:std_logic_vector(Word/2-1 downto 0);
+signal nib,cnib:natural range 0 to 4:=1;--indique le sous-octet à traiter
+signal pulseOn :std_logic:='0';--indique que le prochain état est celui de l'impulsion 
 -- signaux utilisés dans les fsm
 signal request_decoder,req_grant : STD_LOGIC_VECTOR(number_of_ports  downto 1);
@@ -86,5 +96,5 @@
 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);
+signal pipeline_latch : std_logic_vector(7 downto 0);
 signal pipeline_latch_en : std_logic;
 signal request_word :  std_logic_vector(5 downto 1);
@@ -110,11 +120,57 @@
 signal fifo_empty_signal : std_logic;
 signal fifo_read_signal : std_logic;
-signal fifo_out_signal,cmd_data_signal : std_logic_vector(Word-1 downto 0);
-signal push_dout : std_logic_vector(Word-1 downto 0);
+signal fifo_out_signal,fifo_out2,cmd_data_signal : std_logic_vector(Word-1 downto 0);
+signal push_dout : std_logic_vector(7 downto 0);
 signal empty_latch : std_logic ;
-signal PORT_ID :std_logic_vector(Word-1 downto 0):=STD_LOGIC_VECTOR(to_unsigned(number_of_ports-1,4))& STD_LOGIC_VECTOR(to_unsigned(port_num-1,4));
+
 -- signaux du compteur de données
 signal data_counter : std_logic_vector(Word-1 downto 0);
 
+function count_bits(param:natural) return natural is
+
+  variable p : natural range 0 to 127:=0;
+begin
+n1: for i in 0 to 127 loop
+    if param<=2**i then
+      p:=i;
+      exit n1;
+  end if;
+  end loop n1;
+  return p;
+end function;
+
+function Get_Port_ID(adr_sub_net:std_logic_vector;adr_mask:natural;n_ports:positive;numport:positive) return std_logic_vector is
+--cette fonction permet de calculer le port_id ou l'adresse de sous réseau en fonction du masque
+variable tport_id:std_logic_vector(adr_len-1 downto 0):=(others=>'0'); --
+variable p : natural range 0 to 9:=0;
+begin
+--n1: for i in 0 to 9 loop
+--    if n_ports-1<2**i then
+--      p:=i;
+--      exit n1;
+--  end if;
+--  end loop n1;
+  p:=count_bits(n_ports-1);
+    tport_id:=adr_sub_net(adr_len-1 downto p) & std_logic_vector(to_unsigned(numport-1,p));
+    return tport_id;
+end function;
+--case n_ports is 
+--when 1|2|3 =>tport_id(adr_len-1 downto adr_len-adr_mask-1):=adr_sub_net(adr_len-1 downto adr_len-adr_mask-1); 
+--tport_id(adr_len-adr_mask-2 downto adr_len-adr_mask-2):= std_logic_vector(to_unsigned(numport,1));
+--when 4|5 =>tport_id(adr_len-1 downto adr_len-adr_mask-1):=adr_sub_net(adr_len-1 downto adr_len-adr_mask-1); 
+--tport_id(adr_len-adr_mask-2 downto adr_len-adr_mask-3):= std_logic_vector(to_unsigned(numport,2));
+--when 6|9 =>tport_id(adr_len-1 downto adr_len-adr_mask-1):=adr_sub_net(adr_len-1 downto adr_len-adr_mask-1); 
+--tport_id(adr_len-adr_mask-2 downto adr_len-adr_mask-4):= std_logic_vector(to_unsigned(numport,3));
+--
+--when others => --10 to 16
+--tport_id(adr_len-1 downto adr_len-adr_mask-1):=adr_sub_net(adr_len-1 downto adr_len-adr_mask-1) ;
+--tport_id(adr_len-adr_mask-2 downto adr_len-adr_mask-5):= std_logic_vector(to_unsigned(numport,4));
+--
+--end case;
+--  return tport_id;
+--end function;
+signal PORT_ID :std_logic_vector(adr_len-1 downto 0):=GET_PORT_ID(adr_sub_net,adr_mask,number_of_ports,port_num);
+constant n_ports_bits:natural:=count_bits(number_of_ports-1);--compte le nombre de bit par port
+constant pid_bits:natural:=count_bits(tot_ports); --donne le nombre de bits utiles dans une adresse 
 begin
 -- instantiation du FIFO_256
@@ -471,26 +527,61 @@
 		  pipeline_latch <= push_dout;
 		  elsif pipeline_latch_en = '1' and cmd_exec='1' then
-		  pipeline_latch <= cmd_data_signal;
+		  pipeline_latch <= cmd_data_signal(8*cnib-1 downto 8*(cnib-1));
 	  end if;
 	end if;
 end process;
 
+
 --latch qui memorise l'adresse de destination du packet
 
 request_latch_process : process(clk)
+variable rt:std_logic_vector(9 downto 0):=(others=>'0');--route
+variable reql:std_logic_vector(4 downto 1):=(others=>'0');--request_latch
+--variable adr_e,p:natural range 0 to 15:=0;
+
 begin
 	if rising_edge(clk) then
 		if reset_signal = '1' then
-		  request_latch <= (others => '0');
+		  reql := (others => '0');
 		  elsif request_latch_en = '1' and cmd_in_en='0' then  --si la lecture de la destination est autorisée
-		  request_latch <=fifo_out_signal(3 downto 0); --fifo_out_signal(3) & fifo_out_signal(2) & fifo_out_signal(1) & fifo_out_signal(0);
-		assert (unsigned(fifo_out_signal(3 downto 0))<number_of_ports) 
-	report "Input_port_module n° " & integer'image(port_num) & " Le port sollicité n'existe pas le NoC va être bloqué !"
-	severity failure;
-		  elsif cmd_in_en='1' and request_latch_en='1' then  --c'est une commande le port de dest est le même que le port d'entrée
+		  rt:=(others=>'0');
+		 
+		  if adr_mask=0 then
+		    reql(n_ports_bits downto 1):=fifo_out_signal(pid_bits-adr_mask-1 downto pid_bits-adr_mask-n_ports_bits);
+		    request_latch(n_ports_bits downto 1)<=fifo_out_signal(pid_bits-adr_mask-1 downto pid_bits-adr_mask-n_ports_bits);
+		    report "Route racine:";
+		  else
+		  rt(pid_bits-1 downto pid_bits-adr_mask):=fifo_out_signal(pid_bits-1 downto pid_bits-adr_mask);
+		  if rt=adr_sub_net then
+		    report "Route trouvé:" & integer'image(to_integer(unsigned(rt))) & " adr_sub_net=" & integer'image(to_integer(unsigned(adr_sub_net))) & " fifo_out_sig:=" & image(fifo_out_signal) & " sur le port " & integer'image(to_integer(unsigned(port_id))+1);
+		    reql(n_ports_bits downto 1):=fifo_out_signal(pid_bits-adr_mask-1 downto pid_bits-adr_mask-n_ports_bits);
+		    request_latch(n_ports_bits downto 1)<=fifo_out_signal(pid_bits-adr_mask-1 downto pid_bits-adr_mask-n_ports_bits);
+		   
+		  else
+			 if number_of_ports=Port_num then --si c'est un paquet descendant alors le détruire
+			     report "Input_port_module n°" & integer'image(to_integer(unsigned(port_id))) & " La route sollicité n'existe pas dans ce sous réseau le paquet va être détruit ! fifo_out_sig:=" & image(fifo_out_signal);
+			     request_latch<="0000"; --à revoir il faut empêcher le routeur de se bloquer
+			     rt_err<='1'; --il faut activer la destruction du paquet
+			 else --faire monter les données vers le ports supérieur
+				  request_latch<=std_logic_vector(to_unsigned(number_of_ports-1,4));
+				  reql:=std_logic_vector(to_unsigned(number_of_ports-1,4));
+				  rt_err<='0';
+			 end if;
+		  
+		  end if;
+		 end if;
+		  report  "fifo_out=" & image(fifo_out_signal) & " pid_bits:=" & integer'image(pid_bits) & " adr_mask:=" & integer'image(adr_mask) & " rt:=" & image(rt) & " adr_sub_net=" & image(adr_sub_net) & " reql:=" & image(reql) & " sur le port "  & integer'image(to_integer(unsigned(port_id))+1);
+	  
+		        assert (unsigned(reql)<number_of_ports-1) 
+	         report "Input_port_module n° " & integer'image(port_num) & " Le port sollicité n'est pas dans la branche !"
+	         severity warning;
+		elsif cmd_in_en='1' and request_latch_en='1' then  --c'est une commande le port de dest est le même que le port d'entrée
 		   request_latch<=Port_ID(3 downto 0);  --car les ports commencent à 0
 		end if;
-	
-	end if;
+	 	end if;
+	--request_latch<=reql;
+	route<=rt; --pour le débogage uniquement pas besoin de conserver ce paramètre en principe
+
+
 end process;
 
@@ -515,4 +606,5 @@
 									pop_state <= CmdOn;
 								end if;
+								nib<=nbyte;
 			when CmdOn => if empty_latch='1' and cmd_in_en='0' then
 								pop_state <= state0;
@@ -533,7 +625,9 @@
 										--
 										pop_state <= state1;
-										
+										fifo_out2<=fifo_out_signal;
 								--end if;
-		
+			when addhead =>
+									pop_state <= addheadn;
+			when addheadn =>  pop_state <= state1;
 			when state1 => if port_granted ='1' then --lecture de la longueur des données
 										data_counter <= fifo_out_signal;
@@ -543,20 +637,32 @@
 												readOk<='1';
 										end if;
-										pop_state <= state2;
+										pop_state <= state1n;
+										nib<=nib-1;
 										wrok<='1';
 										else
 										  wrok<='0';
 							      end if;
-										
+							     
+			when state1n =>  		if nib=1 then
+												pop_state <= state2;
+												nib<=nbyte;
+										else
+											nib<=nib-1;
+										end if;
+										wrok<='1';
+										fifo_out2<=fifo_out_signal;
 			when state2 => if port_granted='1' then 
 			               wrok<='1';
 										if fifo_empty_signal ='0'  then
-										  if rd_en_signal ='1' and unsigned(data_counter)<= 3 then
+										  if rd_en_signal ='1' and unsigned(data_counter)<= 2 then
 											data_counter <= data_counter - 1;
-											pop_state <= stpulse;
+											pop_state <= state2n;
+											nib<=nib-1;
 											ReadOk<='1';
+											pulseon<='1';
 										elsif rd_en_signal ='1' then
 										  data_counter <= data_counter - 1;
-										  pop_state <= state2;
+										  pop_state <= state2n;
+										  nib<=nib-1;
 										  ReadOk<='1';
 										else --fifo_empty_signal='1' fin prématurée de la lecture
@@ -580,4 +686,17 @@
 										data_counter <= data_counter + 1;
 									end if;
+							 
+			when state2n => if nib=1 then
+			                 if pulseon='1' then
+												pop_state <= stpulse;
+												else
+												 pop_state <= state2;
+												end if;
+												nib<=nbyte;
+										else
+											nib<=nib-1;
+										end if;
+										wrok<='1';
+										 fifo_out2<=fifo_out_signal;
 			when strecover => if fifo_empty_signal='0' and port_granted='1' then
 			             pop_state<=state2;
@@ -591,9 +710,21 @@
 			            
 			when stpulse =>	if port_granted='1' then 
-											pop_state <= state3;		--pousser la dernière donnée dehors		
+											pop_state <= state3;--stpulsen;		--pousser la dernière donnée dehors		
+											--nib<=nib-1;
 											data_counter <= data_counter - 1;
 											wrok<='1';
-									end if;
-			                 wrok<='0';
+											pulseon<='0';
+									else
+											wrok<='0';
+									end if;  
+								  
+			when stpulsen => 	wrok<='0';
+									if nib=1 then
+												pop_state <= state3;
+												nib<=nbyte;
+										else
+											nib<=nib-1;
+										end if;
+										 fifo_out2<=fifo_out_signal;
 			when state3 => 	wrok<='0';
 										data_counter <= data_counter - 1;
@@ -611,5 +742,5 @@
 
 -- actions associées à chaque etat de la fsm de mealy
-pop_fsm_action : process(pop_state, fifo_out_signal,empty_latch, rd_en_signal,readok, port_granted )
+pop_fsm_action : process(pop_state, fifo_out_signal,fifo_out2,empty_latch, rd_en_signal,readok, port_granted,nib )
   begin   
 -- code fonctionnel	
@@ -623,5 +754,5 @@
 								dat_exec<='0';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
 								
 		when CmdOn =>		dat_request_latch_en <= '0';  
@@ -633,5 +764,5 @@
 								dat_exec<='0';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
 		when WaitGrant =>	
 								dat_request_latch_en <='1'; --autoriser l'identification du port de destination
@@ -643,8 +774,9 @@
 								dat_exec<='1';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal(7 downto 4) & PORT_ID(3 downto 0);
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
+								--push_dout<=fifo_out_signal(Word-1 downto Word/2)  & PORT_ID(Word/2-1 downto 0);
 		when ReqPort =>	
 								dat_request_latch_en <='1'; --autoriser l'identification du port de destination
-								dat_pipeline_latch_en <= '1'; --pour le transmettre à travers le réseau
+								dat_pipeline_latch_en <= '0'; --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
@@ -653,9 +785,29 @@
 								dat_exec<='1';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal(7 downto 4) & PORT_ID(3 downto 0);
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
+								--push_dout<=fifo_out_signal(Word-1 downto Word/2) & PORT_ID(Word/2-1 downto 0);
+		when addhead =>	
+								dat_request_latch_en <='0'; --autoriser l'identification du port de destination
+								dat_pipeline_latch_en <= '1'; --pour le transmettre à travers le réseau
+								dat_fifo_read_signal <= '0';
+								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(8*nib-1 downto 8*(nib-1));
 							
 		when state1 =>    dat_request_latch_en <= '0';
 								dat_pipeline_latch_en <= rd_en_signal and port_granted;   
-								dat_fifo_read_signal <= rd_en_signal and port_granted;
+								dat_fifo_read_signal <= '0';--rd_en_signal and port_granted;
+								dat_request_decoder_en <= '1';
+								dat_data_out_pulse <= '0';--port_granted;
+								dat_priority_rotation <= '0';
+								dat_exec<='1';
+								dat_Err<='0';
+								push_dout<=fifo_out2(8*nib-1 downto 8*(nib-1));
+		when state1n =>    dat_request_latch_en <= '0';
+								dat_pipeline_latch_en <= '1'; -- toujours actif pour cet octet
+								dat_fifo_read_signal <= '0';
 								dat_request_decoder_en <= '1';
 								dat_data_out_pulse <= port_granted;
@@ -663,5 +815,5 @@
 								dat_exec<='1';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out2(8*nib-1 downto 8*(nib-1));
 								
 	  when state2 |strecover =>    dat_request_latch_en <= '0';
@@ -669,12 +821,21 @@
 								dat_fifo_read_signal <= port_granted and readok;   
 								dat_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
-								dat_data_out_pulse <= port_granted and wrOk and not(fifo_empty_signal);
+								dat_data_out_pulse <= port_granted and wrOk ;--and not(fifo_empty_signal);
 								dat_priority_rotation <= '0';
 								dat_exec<='1';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
-								
-	  when stpulse =>    dat_request_latch_en <= '0'; --pousser la dernière donnée 
-								dat_pipeline_latch_en <= '0';  --autoriser la lecture du fifo en sortie
+								push_dout<=fifo_out2(8*nib-1 downto 8*(nib-1));
+		 
+		 when state2n  =>    dat_request_latch_en <= '0';
+								dat_pipeline_latch_en <= '1';  --autoriser la lecture du fifo en sortie
+								dat_fifo_read_signal <= '0';   
+								dat_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
+								dat_data_out_pulse <= port_granted and wrOk ;--and not(fifo_empty_signal);
+								dat_priority_rotation <= '0';
+								dat_exec<='1';
+								dat_Err<='0';
+								push_dout<=fifo_out2(8*nib-1 downto 8*(nib-1));						
+	  when stpulse|stpulsen =>    dat_request_latch_en <= '0'; --pousser la dernière donnée 
+								dat_pipeline_latch_en <= wrok;  --autoriser la lecture du fifo en sortie
 								dat_fifo_read_signal <='0';   
 								dat_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
@@ -683,5 +844,6 @@
 								dat_exec<='1';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out2(8*nib-1 downto 8*(nib-1));
+	
 								
 		when state3 =>    dat_request_latch_en <= '0';
@@ -693,5 +855,5 @@
 								dat_exec<='0';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
 		when stateErr =>    dat_request_latch_en <= '0';
 								dat_pipeline_latch_en <= '0';
@@ -702,5 +864,5 @@
 								dat_exec<='1';
 								dat_Err<='1';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
 		when others =>    dat_request_latch_en <= '0';
 								dat_pipeline_latch_en <= '0';
@@ -711,10 +873,10 @@
 								dat_exec<='0';
 								dat_Err<='0';
-								push_dout<=fifo_out_signal;
+								push_dout<=fifo_out_signal(8*nib-1 downto 8*(nib-1));
 										
 		end case;
  end process; 
  -- traitement des commandes reçues par le switch
-fsm_cmd:process(clk,cmd_in_en)
+fsm_cmd:process(clk)
 variable timeout : natural:=0;
 variable cmdcode : natural range 0 to 255;
@@ -731,4 +893,5 @@
 				end if;
 				cmdReadOk<='0';
+				cnib<=nbyte;
 		when cmdwait => if port_granted='1' then  -- demande du port de sortie
 								
@@ -754,25 +917,55 @@
 --				end if;
 		when cmdsetdest =>
+				
 				if port_granted='1' then
+					cmdstate<=cmdsetdestn;
+					cnib<=cnib-1;
+				end if;
+				cmdReadOk<='0';
+		when cmdsetdestn =>  	if cnib=1 then
+												cmdstate<=cmdsetcount;
+												cnib<=nbyte;
+										else
+											cnib<=cnib-1;
+										end if;
+		when cmdsetcount =>
+				if port_granted='1' then
+					cmdstate<=cmdsetcountn;
+					cnib<=cnib-1;
+				else
 					cmdstate<=cmdsetcount;
 				end if;
 				cmdReadOk<='0';
-		when cmdsetcount =>
-				if port_granted='1' then
-					cmdstate<=cmdsetID;
-				else
-					cmdstate<=cmdsetdest;
-				end if;
-				cmdReadOk<='0';
+				
+		when cmdsetcountn =>  	if cnib=1 then
+												cmdstate<=cmdsetID;
+												cnib<=nbyte;
+										else
+											cnib<=cnib-1;
+										end if;
 		when cmdsetID=>
 			if port_granted='1' then
-			cmdstate <=cmdpulse;
+			cmdstate <=cmdsetIDn;
+			cnib<=cnib-1;
 			end if;
 			cmdReadOk<='0';
+		when cmdsetIDn =>  	if cnib=1 then
+												cmdstate<=cmdpulse;
+												cnib<=nbyte;
+										else
+											cnib<=cnib-1;
+										end if;
 		when cmdpulse =>
 			if port_granted='1' then
-			cmdstate <=cmdEnd;
+			cmdstate <=cmdpulsen;
+			cnib<=cnib-1;
 			end if;
 			cmdReadOk<='0';
+		when cmdpulsen => if cnib=1 then
+												cmdstate<=cmdEnd;
+												cnib<=nbyte;
+										else
+											cnib<=cnib-1;
+										end if;
 		when cmdend  =>
 			if cmd_in_en='0' then --éviter l'exécution en boucle
@@ -808,5 +1001,5 @@
 						cmd_data_out_pulse <= '0';
 						cmd_priority_rotation <= '1';                    --sans priorité
-						cmd_data_signal<=Port_ID;  
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID;  
 		when cmdwait =>
 						cmd_exec<='1';
@@ -816,5 +1009,5 @@
 						cmd_priority_rotation <= '0';    --avec priorité
 						cmd_request_decoder_en <= '1';   --demande d'émission
-						cmd_data_signal<=Port_ID;
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID;
 						cmd_data_out_pulse <= '0';					
 	when cmdsetdest  =>
@@ -827,6 +1020,17 @@
 						cmd_data_out_pulse <= '0';
 						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_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID;    -- le numéro du port et le nombre total des ports est envoyé
+		when cmdsetdestn  =>
+						--cmd_request_decoder_en <= '1';
+						cmd_exec<='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';
+						cmd_request_decoder_en <= '1';          --autoriser le decodeur à activer le dernier bit de request
+						cmd_data_out_pulse <= '1';
+						cmd_priority_rotation <= '0';
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID;    -- le numéro du port et le nombre total des ports est envoyé
+
+	when cmdsetcount|cmdsetcountn=>
 								 
 						cmd_exec<='1';   
@@ -837,6 +1041,6 @@
 						cmd_data_out_pulse <= port_granted;
 						cmd_priority_rotation <= '0';
-						cmd_data_signal<=STD_LOGIC_VECTOR(to_unsigned(3,8));					
-	when cmdSetId =>
+						cmd_data_signal<=STD_LOGIC_VECTOR(to_unsigned(3,Word));					
+	when cmdSetId| cmdSetIdn=>
 						--cmd_request_decoder_en <= '1';
 						cmd_exec<='1';
@@ -847,8 +1051,8 @@
 						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é
-											
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID;    -- le numéro du port et le nombre total des ports est envoyé
+						report "Le nombre de port est" & integer'image(tot_ports) & " l'id du port est : " & image(port_id);					
 	when cmdpulse =>	cmd_exec<='1';
-						cmd_pipeline_latch_en <='0';
+						cmd_pipeline_latch_en <='1';
 						cmd_fifo_read_signal <='0';
 						cmd_request_latch_en<='0';
@@ -856,6 +1060,15 @@
 						cmd_data_out_pulse <= '1';--port_granted;     --s'assurer que la dernière donnée est bien lue
 						cmd_priority_rotation <= '0';
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID; 
+						
+	when cmdpulsen  =>	cmd_exec<='1';
+						cmd_pipeline_latch_en <='0';
+						cmd_fifo_read_signal <='0';
+						cmd_request_latch_en<='0';
+						cmd_request_decoder_en <= '1';          --autoriser le decodeur activer le dernier bit de request
+						cmd_data_out_pulse <= '0';--port_granted;     --s'assurer que la dernière donnée est bien lue
+						cmd_priority_rotation <= '0';
 								--cmd_data_signal<=Port_ID ;
-						cmd_data_signal<=Port_ID; 
+						cmd_data_signal<=std_logic_vector(to_unsigned(tot_ports,Word-adr_len)) & Port_ID; 
 						
 	when cmdend =>
