Index: PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v1.00/MPI_RMA.vhd
===================================================================
--- PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v1.00/MPI_RMA.vhd	(revision 70)
+++ PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v1.00/MPI_RMA.vhd	(revision 72)
@@ -33,5 +33,6 @@
 procedure pMPI_Win_start( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
 procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
-
+procedure pMPI_Win_post( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
+procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
 procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;  
 command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural;  
@@ -61,5 +62,5 @@
   Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
   Target_Datatype :natural; Win : natural) is
-variable i,dcount : natural:=0;
+variable i,dcount,wr_state : natural:=0;
 variable adresse :natural;
 variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
@@ -69,5 +70,5 @@
 constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
 	begin   
-				put_adr:=Std_logic_vector(to_unsigned(Core_put_adr,ADRLEN));
+				put_adr:=conv_Std_logic_vector(Core_put_adr,ADRLEN);
 				
 				addr1:=Orig_Addr;
@@ -79,5 +80,8 @@
 					
 				if rising_edge(clkin) then		
-							if dcount>=0 and dcount <=3 then 
+				  if dcount= 0 then
+				      dcount:=dcount+1;
+				      Interf.S.Intstate1<=0;
+					elsif dcount>=1 and dcount <=3 then 
 									if interf.I.ramsel='0' then
 											Interf.O.membusy<='0';
@@ -85,7 +89,10 @@
 											SysRam.O.ena<='1';
 											SysRam.O.enb<='0';
-											WritePtr (put_adr,dcount,SysRam);
-											if dcount =4 then 
+											wr_state:=interf.S.Intstate1;
+											WritePtr (put_adr,wr_state,SysRam);
+											interf.S.Intstate1<=wr_state;
+											if wr_state =4 then 
 												-- fin de l'écriture du pointeur en mémoire 
+											dcount:=4;
 											end if;								
 									end if;
@@ -97,6 +104,9 @@
 								SysRam.O.enb<='0';
 								Interf.O.membusy<='1';
+								if target_rank <=15 then --limitation de cete version à 16 rang
+								Interf.S.Gstart(Target_rank)<='1';
+								end if;
 								adresse:=core_put_adr;
-								SysRam.O.Data_in<=MPI_PUT & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
+								SysRam.O.Data_in<=MPI_PUT & conv_std_logic_vector(Target_Rank,4); --code fonction
 								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 								dcount:=dcount+1;
@@ -199,5 +209,5 @@
 										if SysRam.I.Data_out(0)='1' then --fin du MPI PUT ici pour l'envoie !
 											dcount:=dcount+1;
-											SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
+											SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
 										  Interf.S.Intstate2<=255; --timer pour la réception
 										end if;
@@ -215,8 +225,8 @@
 									Interf.O.membusy<='0';
 									if interf.I.ramsel='0' then 
-										SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
+										SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
 										if SysRam.I.Data_out(5)='1' then --Message  du MPI PUT bien reçu !
 											dcount:=dcount+1;
-											SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
+											SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
 										elsif Interf.S.Intstate2>0 then 
 										  Interf.S.Intstate2<=Interf.S.Intstate2-1;
@@ -269,6 +279,7 @@
 											Interf.S.IntState1<=wcount;
 											Interf.O.membusy<='1';
-											if wcount =0 then 
+											if wcount =4 then 
 												dcount:=4;
+												Interf.S.Intstate1<=1;
 											end if;								
 									end if;
@@ -279,7 +290,9 @@
 								SysRam.O.ena<='1';
 								SysRam.O.enb<='0';
-								
+								if target_rank <=15 then --limitation de cete version à 16 rang
+								Interf.S.Gstart(Target_rank)<='1';
+								end if;
 								adresse:=core_get_adr;
-								SysRam.O.Data_in<=MPI_GET & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
+								SysRam.O.Data_in<=MPI_GET & conv_Std_logic_vector(Target_Rank,4); --code fonction
 								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 								Interf.O.membusy<='1';
@@ -348,5 +361,5 @@
 									SysRam.O.enb<='1';
 									adresse:=core_base_adr+1;
-									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
+									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
 									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 									SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
@@ -469,4 +482,5 @@
 			if interf.I.ramsel='0' then
 				Rank<=SysRam.I.Data_out(3 downto 0);
+				Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
 				NextCtx:=3;
 				Interf.O.membusy<='1';
@@ -605,5 +619,5 @@
 	--cette étape consiste à envoyer le message WINCREATE Sur le réseau et à récupérer
 	-- les informations donnant le numéro de la fenêtre
-		W0:=MPI_WINCREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
+		W0:=MPI_WIN_CREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
 		count:=Interf.S.IntState1;
 		Writemem(count,interf,SysRam,wcreate_adr,w0);
@@ -693,10 +707,10 @@
 					SysRam.O.ena<='1';
 					SysRam.O.enb<='0';
-					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
 					SysRam.O.Data_in<=x"01"; --mise à 1 du bit WSTART et remise à zero de tous les autres Bits	
 							
 					NextCtx:=NextCtx+1;
 					Interf.O.membusy<='1';		
-									
+					Interf.S.GStart<=(others=>'0');				
 			end if;
 	elsif NextCtx=2 then
@@ -705,5 +719,5 @@
 					SysRam.O.ena<='1';
 					SysRam.O.enb<='0';
-					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
 					SysRam.O.Data_in<=x"01";
 					NextCtx:=NextCtx+1;
@@ -718,5 +732,155 @@
  end procedure;
 procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
+variable adresse :natural;
+variable wcount: natural range 0 to 255:=0;
+variable LRam : typ_dpRam;
+variable SyncDest : natural range 0 to 15; --destination du message de synchronisation
+variable W0 :std_logic_vector(Word-1 downto 0);
+variable wcompl_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
+
 begin
+  --
+  --pMPI_Win_Wait(NextCtx, Interf, SysRam, Win );
+  				wcompl_adr:=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
+				LRam:=SysRam; -- nécessaire pour le débogage
+				if NextCtx =0 then
+					
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.S.IntState1<=0;
+					NextCtx:=1;
+					adresse:=core_wcompl_adr;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					
+				elsif NextCtx=1 then --écriture du ptr d'intruction
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					if interf.I.ramsel='0' then
+					
+					adresse:=core_wcompl_adr;
+				
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					Interf.O.membusy<='1';
+					
+				  wcount:=Interf.S.IntState1;
+          WritePtr (wcompl_adr,wcount,SysRam);
+          Interf.S.IntState1<=wcount;
+          
+            if wcount =4 then 
+                  NextCtx:=2;
+                  Interf.S.IntState1<=0;
+                  Interf.S.IntState2<=0;
+                  Interf.S.tmem(0)<=Interf.S.GStart(7 downto 0); --cibles impactées
+                  Interf.S.tmem(1)<=Interf.S.GStart(15 downto 8); --cibles impactées
+                  adresse:=core_wcompl_adr;
+                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+            end if;		
+         end if;       
+				elsif NextCtx=2 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_wcompl_adr;
+				  NextCtx:=9; --aller à la fin de la fonction
+				  for i in interf.s.intState2 to 7 loop
+				  if interf.s.gstart(i)='1' then
+					SysRam.O.Data_in<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.S.tmem(0)(i)<='0'; --ce dest a été traité !
+					NextCtx:=3;
+					Interf.S.IntState2<=i+1;
+					exit;
+					end if;
+					end loop;
+				elsif NextCtx=3 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_wcompl_adr+1;
+					SysRam.O.Data_in<= x"04" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=NextCtx+1;
+				elsif NextCtx=4 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					adresse:=core_wcompl_adr+2;
+				  Interf.O.Instruction<=x"04";--longueur de l'instruction
+					SysRam.O.Data_in<=x"00" ;--
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=5;
+				elsif NextCtx=5 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_wcompl_adr+3;
+					SysRam.O.Data_in<= SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=6;
+				elsif NextCtx=6 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_wcompl_adr+3;
+					SysRam.O.Data_in<=SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=7;
+
+				elsif NextCtx=7 then --fin de la fonction
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							--dcount:=0;
+							Interf.O.membusy<='0';
+							Interf.O.Instr_En<='1';
+							SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr+5,AdrLen));
+							NextCtx:=8;
+				elsif NextCtx=8 then --acquittement de la copie des données dans le tampon
+							if Interf.I.Instr_ack='1' then
+								Interf.O.Instr_En<='0';
+								NextCtx:=9;
+							end if;
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							
+				elsif NextCtx=9 then --lecture de la fin de WComplete
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							
+							if interf.S.IntState2=0 then --aucune instruction MPI exécutée ?
+							  
+							elsif Interf.S.tmem(0)/=0 then --plus de message compl à envoyer
+							   NextCtx:=2;
+							 elsif Interf.S.tmem(0)=0 then
+							   if interf.I.ramsel='0' then
+							       NextCtx:=10;
+          							   SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+							   end if;
+							 end if; 
+				elsif NextCtx=10 then --test de la fin des transferts
+					if interf.I.ramsel='0' then
+        					SysRam.O.we<='0';
+        					SysRam.O.ena<='0';
+        					SysRam.O.enb<='1';
+        					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+        							if SysRam.I.Data_out(0)='1' and  SysRam.I.Data_out(6)='0' then --si WStart=1 et Wbusy=0
+        							  --il faut un DSent=1 pour Put ou un DSending pour Get
+										if SysRam.I.Data_out(5)='1' or  (SysRam.I.Data_out(4)='1' and SysRam.I.Data_out(1)='1')  then 
+												NextCtx:=NextCtx+1;
+										end if;	
+									end if;									
+				
+					end if;	
+				elsif NextCtx=11 then
+									Interf.S.IntState1<=0; -- initialisation du compteur d'état
+								Interf.S.IntState2<=0;
+								NextCtx:=0; --fin de la fonction			
+      end if;
 
 end procedure;
@@ -725,5 +889,84 @@
 -- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
 --chacune de ces cibles
+ variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire 
+ variable dcount : natural range 0 to 255:=0;
+ variable cstatus : std_logic_vector(Word-1 downto 0);
  begin
+
+ -- retour de l'adresse de de la fenêtre dans la structure Win
+ -- initialisation des bits concernant 
+ if Win.id =0 then
+   W_ptr:=Core_Base_Adr+4;
+ end if;
+ if NextCtx =0 then 
+			NextCtx:=NextCtx+1;
+			if pgroup.grp=0 then --rien à faire
+			  nextCtx:=5;
+			  Interf.S.GPost<=(others=>'0');
+			end if;
+		elsif NextCtx=1 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+					SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits	
+							
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';		
+									
+			end if;
+			 --limitation de cete version à 16 rang
+				Interf.S.GPost<=pgroup.grp;
+	elsif NextCtx=2 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+					SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits	
+							
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';		
+									
+			end if;						
+	elsif NextCtx=3 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_Ptr+W_Gpost,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(7 downto 0);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+elsif NextCtx=4 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(15 downto 8);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+elsif NextCtx=6 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(15 downto 8);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+	elsif NextCtx=5 then
+	         SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='0';
+		NextCtx:=0;
+		Interf.O.membusy<='0';
+	end if;
+
  
  end procedure;
@@ -733,9 +976,7 @@
 variable dcount : natural range 0 to 255:=0;
 variable cstatus : std_logic_vector(Word-1 downto 0);
-
+variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
 begin
-
-	
-	
+	W_Ptr:=Core_base_adr+4;--adresse du reg status de la première fenêtre
 		if NextCtx =0 then 
 			NextCtx:=NextCtx+1;
@@ -745,13 +986,46 @@
 					SysRam.O.ena<='0';
 					SysRam.O.enb<='1';
-					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
-							if (SysRam.I.Data_out(5)='1' and  SysRam.I.Data_out(4)='1') and SysRam.I.Data_out(2)='0' and  SysRam.I.Data_out(1)='0' then 
-									NextCtx:=NextCtx+1;
-							end if;							
+					NextCtx:=NextCtx+1;
 			end if;
+			     SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
+            If Interf.S.Gpost=0 then
+             NextCtx:=9; --rien à synchroniser
+          end if;
+  elsif (NextCtx>=2) and (NextCtx <=7) then
+    if interf.I.ramsel='0' then
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='1';
+					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+					NextCtx:=NextCtx+1;
+		else
+		    NextCtx:=1;
+		   end if;
+		elsif NextCtx=8 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='1';
+					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+								
+							if SysRam.I.Data_out(3)='1' and SysRam.I.Data_out(6)='0' then --si WPost=1 et WBusy=0
+							  --il faut un DSent=1 pour Put ou un DSending pour Get
+  							   if SysRam.I.Data_out(4)='1' or  (SysRam.I.Data_out(5)='1' and SysRam.I.Data_out(2)='1')  then 
+  									   NextCtx:=NextCtx+1;
+  									   Interf.S.GPost<=(others=>'0');
+  							   end if;	
+							elsif SysRam.I.Data_out(3)='0' then 
+              							  NextCtx:=NextCtx; --pas d'opérations en attente
+							else
+							  NextCtx:=NextCtx; --on attend
+							end if;				
+			end if;	
 	
-	elsif NextCtx=2 then
-		
-		NextCtx:=0;
+	elsif NextCtx=9 then
+		      SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='0';
+		      NextCtx:=0;
 	end if;
 
@@ -952,49 +1226,64 @@
          end if;       
 				elsif NextCtx=2 then 
-					SysRam.O.we<='1';
-					SysRam.O.ena<='1';
-					SysRam.O.enb<='0';
-				  adresse:=core_init_adr;
-					SysRam.O.Data_in<=MPI_INIT & x"0" ;
-					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
-					NextCtx:=3;
+				  if interf.I.ramsel='0' then
+					   SysRam.O.we<='1';
+					   SysRam.O.ena<='1';
+					   SysRam.O.enb<='0';
+				      adresse:=core_init_adr;
+					   SysRam.O.Data_in<=MPI_INIT & x"0" ;
+					   SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					   NextCtx:=3;
+					   Interf.O.membusy<='1';
+					end if;
 				elsif NextCtx=3 then 
-					SysRam.O.we<='1';
-					SysRam.O.ena<='1';
-					SysRam.O.enb<='0';
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
 				  adresse:=core_init_adr+1;
 					SysRam.O.Data_in<= x"04" ;
 					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 					NextCtx:=NextCtx+1;
+					end if;
 				elsif NextCtx=4 then 
-					SysRam.O.we<='1';
-					SysRam.O.ena<='1';
-					SysRam.O.enb<='0';
-					adresse:=core_init_adr+2;
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					Interf.O.membusy<='1';
+					SysRam.O.enb<='0';
+					adresse:=core_init_adr+1;
 				  Interf.O.Instruction<=x"04";
-					SysRam.O.Data_in<=x"00" ;--longueur de l'instruction
+					SysRam.O.Data_in<=x"04" ;--longueur de l'instruction
 					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 					NextCtx:=5;
+					end if;
 				elsif NextCtx=5 then 
-					SysRam.O.we<='1';
-					SysRam.O.ena<='1';
-					SysRam.O.enb<='0';
-				  adresse:=core_init_adr+3;
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					Interf.O.membusy<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_init_adr+2;
 					SysRam.O.Data_in<= x"00" ;
 					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 					NextCtx:=6;
+					end if;
 				elsif NextCtx=6 then 
-					SysRam.O.we<='1';
-					SysRam.O.ena<='1';
-					SysRam.O.enb<='0';
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
 				  adresse:=core_init_adr+3;
 					SysRam.O.Data_in<=x"00" ;
 					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
 					NextCtx:=7;
-
+        end if;
 				elsif NextCtx=7 then --fin de la fonction
 							SysRam.O.we<='0';
 							SysRam.O.ena<='0';
 							SysRam.O.enb<='1';
+							Interf.O.membusy<='0';
 							dcount:=0;
 							Interf.O.membusy<='0';
