Ignore:
Timestamp:
Dec 20, 2013, 7:55:55 PM (11 years ago)
Author:
rolagamo
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v1.00/EX2_FSM.vhd

    r64 r70  
    11----------------------------------------------------------------------------------
    2 -- Company: GRIIA - ETIS
     2-- Company: GRIIA - ETIS  -  LIP6
    33-- Engineer: GAMOM, KIEGAING
    44--
     
    4848                        ram_wr : out std_logic;
    4949                        ram_address : out std_logic_vector(ADRLEN-1 downto 0);
    50                         Ram_data_in : in STD_LOGIC_VECTOR (Word-1 downto 0);
    51                         Ram_data_out : out STD_LOGIC_VECTOR (Word-1 downto 0);
     50                        Ram_data_in : out STD_LOGIC_VECTOR (Word-1 downto 0);
     51                        Ram_data_out : in STD_LOGIC_VECTOR (Word-1 downto 0);
    5252                         
    5353                        fifo_data : out  STD_LOGIC_VECTOR (Word-1 downto 0);
    5454                        fifo_wr_en : out  STD_LOGIC;
    5555                        fifo_full : in  STD_LOGIC;
    56                          
     56                          Rec_Rdy : OUT std_logic;
     57                    Rec_Data : OUT Typ_PortIO(0 to 3);
     58                    Rec_Ack : IN std_logic;   
    5759                        AppRank : in  STD_LOGIC_VECTOR(3 downto 0);
    5860                        AppSize : in  STD_LOGIC_VECTOR(3 downto 0);
     
    6466                          AppInitAck :in  STD_LOGIC; -- Acquitement d'initialisation
    6567                          Initialized:in std_logic ; -- état de la Lib
    66                          
     68                          Result : out STD_LOGIC_VECTOR (Word-1 downto 0):=(others=>'0'); -- le résultat de l'exécution de ce module
    6769           switch_data_available : in  STD_LOGIC;                         
    6870           switch_port_out_data : in  STD_LOGIC_VECTOR (Word-1 downto 0);
     
    7577
    7678architecture Behavioral of EX2_FSM is
     79--module pour la lecture des données sur le réseau
     80CONSTANT MSIZE : natural :=4; --taille de la mémoire tampon pour les messages reçu
     81component Proto_receiv is
     82 generic (sizemem : natural := 64);
     83 port (
     84 clk,reset : in std_logic;
     85 fifo_empty,fifo_full : in std_logic;
     86 rcv_start : in std_logic; --début de la réception
     87 rcv_ack :in std_logic;   -- acquittement de la réception
     88 rcv_comp : out std_logic; -- fin de la réception
     89  pop : out std_logic:='0';
     90 fifo_out : in std_logic_vector(Word-1 downto 0);
     91 mem :out memory(0 to sizemem-1));
     92end component Proto_receiv;
     93
     94COMPONENT SetBit
     95        PORT(
     96                clk : IN std_logic;
     97                reset : IN std_logic;
     98                BitMask : IN std_logic_vector(7 downto 0);
     99                BitVal : IN std_logic;
     100                start : in std_logic;
     101                done :  out std_logic;
     102                dma_wr_grant : IN std_logic;
     103                dma_rd_grant : IN std_logic;
     104                Ram_data_in : out std_logic_vector(7 downto 0);         
     105                dma_wr_request : OUT std_logic;
     106                dma_rd_request : OUT std_logic;
     107                ram_rd : OUT std_logic;
     108                ram_wr : OUT std_logic;
     109                ram_address : IN std_logic_vector(15 downto 0);
     110                Ram_data_out : in std_logic_vector(7 downto 0)
     111                );
     112                End component SetBit;
    77113-- définition du type etat de la machine à etat
    78 type fsm_states is (fetch_packet_type, decode_packet_type, decode_packet_type2,
    79 fetch_addresses,execute_spawn,execute_put1,execute_put2,execute_put3 ,execute_put4,
    80 execute_put5,execute_get1, execute_get2,execute_get3,execute_get4,
    81  execute_barrier1, execute_barrier2, execute_barrier3, execute_barrier4,
    82   execute_barrier5, execute_barrier6, execute_barrier7,execute_init1,execute_init2);
    83 signal ex2_state_mach :fsm_states;
     114type fsm_states is (Ex2_Ready,fetch_packet_type, decode_packet_type, decode_packet_type2,
     115fetch_addresses,ex2_spawn,ex2_put1,ex2_put2,ex2_put3 ,ex2_put4,
     116ex2_put5,ex2_get1, ex2_get2,ex2_get3,ex2_get4,ex2_ack,
     117 ex2_barrier1, ex2_barrier2, ex2_barrier3, ex2_barrier4,
     118  ex2_barrier5, ex2_barrier6, ex2_barrier7,ex2_init1,ex2_init2);
     119type fsm_ack is(ack0,ack1,ack2,ack3,ack4,ack5,ack6);
     120signal Next_Ex2_state,ex2_state :fsm_states;
     121signal ack_state,next_ack_state : fsm_ack;
    84122-- machine a etat du module
    85123signal packet_type : std_logic_vector(3 downto 0);
    86 signal packet_length : std_logic_vector(Word-1 downto 0);
     124signal P_len_i,P_len : std_logic_vector(Word-1 downto 0);
    87125signal barrier_counter : std_logic_vector(3 downto 0);
    88126signal pading_data,data_to_ram :  std_logic_vector(Word-1 downto 0):=(others=>'0');
    89 signal n : std_logic_vector(3 downto 0);
    90 signal dest_address : std_logic_vector(ADRLEN-1 downto 0):=(others=>'Z');
     127signal n,n_i : natural range 0 to 15;
     128signal dest_address,dest_address_i : std_logic_vector(ADRLEN-1 downto 0):=(others=>'-');
    91129signal data_to_write_fifo :  std_logic_vector(Word-1 downto 0);
     130--*******************************************
     131--signaux pour la fonction SetBit
     132signal          sb_BitMask : std_logic_vector(7 downto 0):=(others=>'0');
     133signal          sb_BitVal,sb_start,sb_done : std_logic:='0';
     134signal          sb_Ram_data_in : std_logic_vector(7 downto 0);         
     135signal          sb_dma_wr_request :  std_logic;
     136signal          sb_dma_rd_request :  std_logic;
     137signal          sb_ram_rd : std_logic;
     138signal          sb_ram_wr : std_logic;
     139signal          sb_ram_address : std_logic_vector(15 downto 0):=(others=>'0');
     140signal          sb_Ram_data_out : std_logic_vector(7 downto 0):=(others=>'0');
     141--*********************************************
    92142signal Ex2_on : std_logic:='0';
    93143signal dma_rd,dma_wr,rd_ok ,wr_ok:std_logic:='0';
     144signal sent_ack, sent_ack_i,wr_ack,instr_ack,Instr_ack_i:std_logic:='0'; --signaux pour la gesion de l'acquittement
     145signal  dest_ack:std_logic_vector(3 downto 0) :=(others=>'0');
     146signal  to_fifo_ack :std_logic_vector(Word-1 downto 0):=(others=>'0');
     147signal Result_i :  STD_LOGIC_VECTOR (Word-1 downto 0):=(others=>'0');
     148--signaux pour l'untilisation du composant de réception
     149signal rfifo_empty,rfifo_full:std_logic;
     150signal rcv_start,rcv_comp,rcv_ack:std_logic;
     151signal rpop:std_logic;
     152--signal mem:memory(0 to Msize-1));
     153begin
     154ram_address <= dest_address;
     155--fifo_data <= data_to_write_fifo;
     156Result<=Result_i;
     157p_instr_fifo:process(ack_state,data_to_write_fifo,wr_ack,to_fifo_ack,instr_ack)
     158begin
     159  if instr_ack='1' then
     160    fifo_data<=to_fifo_ack;
     161else
     162  fifo_data<=data_to_write_fifo;
     163end if;
     164end process p_instr_fifo;
     165
     166
     167
     168R0:proto_receiv generic map (sizemem =>4)
     169        port map (
     170        clk=>clk,
     171        reset=>reset,
     172        rcv_start=>rcv_start,
     173        rcv_comp=>rcv_comp,
     174        rcv_ack=>rcv_ack,
     175        fifo_empty=>rfifo_empty,
     176        fifo_full=>rfifo_full,
     177        fifo_out=>switch_port_out_data,
     178        pop=>rpop,
     179        mem=>open
     180       
     181        );
     182--envoie de l'acquittement
     183setbit1:SetBit
     184        PORT MAP (
     185                clk =>clk,
     186                reset =>reset,
     187                BitMask =>sb_bitMask,
     188                BitVal =>sb_bitval,
     189                dma_wr_grant =>dma_wr_grant,
     190                dma_rd_grant =>dma_rd_grant,
     191                Ram_data_in => sb_Ram_data_in,         
     192                dma_wr_request =>sb_dma_wr_request,
     193                dma_rd_request =>sb_dma_rd_request,
     194                ram_rd =>sb_ram_rd,
     195                ram_wr =>sb_ram_wr,
     196                ram_address =>dest_address,
     197                Ram_data_out =>sb_ram_data_out,
     198                Start =>sb_start,
     199                done =>sb_done
     200                );
     201               
     202-- processus de transistion entre les etats
     203ex2_fsm_logic : process(Ex2_state, Instruction_En,fifo_full,dma_rd_grant,dma_wr_grant,AppinitAck,Initialized,
     204 switch_data_available,switch_port_out_data,sb_ram_data_in,Ram_data_out,sb_done,sb_dma_rd_request,n,P_len,
     205 sent_ack,wr_ack,to_fifo_ack,dest_address)
     206variable delai : natural range 0 to 1:=0; --permet de détecter que l'écriture en RAM doit être décalée
     207variable tempval : std_logic_vector(Word-1 downto 0);
     208variable n_e:natural range 0 to 15 :=0;
     209procedure read_nocdat_fsm(sdata_avail: std_logic;
     210signal rd,wr:out std_logic;
     211signal Plen : inout std_logic_vector(Word-1 downto 0);
     212variable n:out natural range 0 to 15;signal n_e:in natural range 0 to 15) is
     213--lit la suite des données qui sont dans le NoC et identifie le paramètre important
     214begin
     215if n_e<3 then
     216                                         wr<='0';
     217                                                                                        if sdata_avail='1' then
     218                                                                                                n:=n_e+1;
     219                                                                                                rd<='1';
     220                                                                                                plen <=plen-1;
     221                                                                                        else
     222                                                                                                rd<='0';
     223                                                                                        end if;
     224                                                                                        --result_i<=(others=>'0');
     225                                                                                elsif n_e=3 then
     226                                                                                        if sdata_avail='1' then
     227                                                                                                n:=n_e+1;
     228                                                                                                rd<='0';
     229                                                                                                --P_len <=P_len_i -1;
     230                                                                                                --data_to_ram<=sportdout;
     231                                                                                                --Result_i<=sport_out_data;
     232                                                                                        else
     233                                                                                                rd<='0';       
     234                                                                                        end if;
     235                                                                                end if;
     236end procedure;
    94237
    95238begin
    96 ram_address <= dest_address;
    97 fifo_data <= data_to_write_fifo;
    98 
    99 -- processus de transistion entre les etats
    100 fsm_nst_logic : process(clk)
    101 variable delai : natural range 0 to 1:=0; --permet de détecter que l'écriture en RAM doit être décalée
    102 variable tempval : std_logic_vector(Word-1 downto 0);
    103 begin
    104  if rising_edge(clk) then
    105         if reset = '1' then
    106         ex2_state_mach <= fetch_packet_type;
     239 
     240        Next_Ex2_state <= Ex2_state;
    107241        Ex2_on<='0';
    108242        barrier_counter <= "0000";
    109          else
     243        --n_i<=n;
     244  dest_address_i<=dest_address;
     245--       else
    110246                Ex2_on<=Instruction_en; --détermine si le module peut être activer ou non
    111                   case ex2_state_mach is
    112                          when fetch_packet_type => if switch_data_available ='1' and Ex2_on='1'  then   --and initialized ='1'                                         
    113                                                                                               ex2_state_mach  <= decode_packet_type;
     247                  n_i<=n; --valeur par défaut de n_i
     248                  P_len_i<=P_len;
     249                  case ex2_state is
     250                   when Ex2_ready => if Instruction_en='1' then
     251                                Next_Ex2_state  <= fetch_packet_type;
     252                                     end if;
     253                                     rd_ok<='0';wr_ok<='0';
     254                         when fetch_packet_type => if switch_data_available ='1' and Instruction_en='1'  then   --and initialized ='1'                                         
     255                                                                                              Next_Ex2_state  <= decode_packet_type;
    114256                                                                                              packet_type<=switch_port_out_data(7 downto 4);
     257                                                                                              Dest_ack<=switch_port_out_data(3 downto 0);
     258                                                                                              Rec_Data(0)<=switch_port_out_data; --récupérer la première donnée reçue !
     259                                                                                              rd_ok<='1';
    115260                                                                                 else
    116                                                                                               ex2_state_mach <= fetch_packet_type;
     261                                                                                              Next_Ex2_state <= Ex2_Ready;
     262                                                                                              rd_ok<='0';
    117263                                                                           end if;
    118                         when decode_packet_type => if switch_data_available ='0' then
    119                                                                                                         ex2_state_mach <= decode_packet_type;
     264                                                                           n_i<=0;
     265                        when decode_packet_type => rd_ok<='0';
     266                                         if switch_data_available ='0' then
     267                                                                                                        Next_Ex2_state <= decode_packet_type;
    120268                                                                                                else
     269                                                                                                    rd_ok<='1';
    121270                                                                                                         if packet_type = MPI_PUT then
    122                                                                                                             packet_length <= switch_port_out_data - 2;
    123                                                                                                                  n <="0000";
    124                                                                                                                  ex2_state_mach <= decode_packet_type2;
     271                                                                                                            P_len_i <= switch_port_out_data - 2;
     272                                                                                                                  n_i<=0;
     273                                                                                                                 Next_Ex2_state <= decode_packet_type2;
    125274                                                                                                          elsif packet_type = MPI_GET then
    126                                                                                                             packet_length <=switch_port_out_data-2;
    127                                                                                                                  ex2_state_mach <= decode_packet_type2;
     275                                                                                                            P_len_i <=switch_port_out_data-2;
     276                                                                                                                 Next_Ex2_state <= decode_packet_type2;
    128277                                                                                                          elsif packet_type = MPI_BARRIER_REACHED or packet_type = MPI_BARRIER_COMPLETED then
    129                                                                                                             packet_length <= switch_port_out_data;
    130                                                                                                                  n <= "0000";
    131                                                                                                                  ex2_state_mach <= execute_barrier1;
     278                                                                                                            P_len_i <= switch_port_out_data;
     279                                                                                                                 n_i<=0;
     280                                                                                                                 Next_Ex2_state <= ex2_barrier1;
    132281                                                                                                          elsif packet_type = MPI_INIT or packet_type =INIT_SETRANK or packet_type =INIT_SEEKMAIN then
    133                                                                                                             ex2_state_mach <= execute_init1;
     282                                                                                                           n_i<=0;
     283                                                                                                           wr_ok<='0';
     284                                                                                                           --rd_ok<='1';
     285                                                                                                                P_len_i <= switch_port_out_data-2;
     286                                                                                                                Rec_Data(1)<=switch_port_out_data;
     287                                                                                                                Next_Ex2_state <= ex2_init1;
     288                                                                                                                 elsif packet_type = MPI_ACK then
     289                                                                                                           n_i<=0;
     290                                                                                                           wr_ok<='0';
     291                                                                                                           rd_ok<='0';
     292                                                                                                                P_len_i <= switch_port_out_data-2;
     293                                                                                                                Next_Ex2_state <= ex2_ack;
     294                                                                                                          elsif packet_type = MPI_SPAWN  then
     295                                                                                                            Next_Ex2_state <= ex2_spawn;
    134296                                                                                                          else
    135                                                                                                                   ex2_state_mach <= decode_packet_type;
     297                                                                                                                  Next_Ex2_state <= decode_packet_type;
     298                                                                                                                  rd_ok<='0';
    136299                                                                                                         end if;
    137300                                                                                                end if;
    138301                        when decode_packet_type2 => if packet_type = MPI_PUT then
    139                                                                                                         ex2_state_mach <= fetch_addresses;
     302                                                                                                        Next_Ex2_state <= fetch_addresses;
    140303                                                                                                  else
    141                                                                                                         ex2_state_mach <= execute_get1;                                                   
     304                                                                                                        Next_Ex2_state <= ex2_get1;                                                       
    142305                                                                       end if;                                                                         
    143          when fetch_addresses => if  switch_data_available = '1' and n = 0 then
    144                                                                                                   dest_address(15 downto 8) <= switch_port_out_data;
    145                                                                                                   n <= n + 1;
    146                                                                                                   ex2_state_mach <= fetch_addresses;
    147                                                                                                 elsif switch_data_available = '1' and n = 1 then
    148                                                                                                   dest_address(Word-1 downto 0) <= switch_port_out_data;
    149                                                                                                   packet_length <= packet_length - 2;   
    150                                                                                                   ex2_state_mach <= execute_put1;
     306         when fetch_addresses => if  n=0 then
     307                               if switch_data_available = '1'  then
     308                                                                                                            dest_address_i(15 downto 8) <= switch_port_out_data;
     309                                                                                                              n_i <= n + 1;
     310                                                                                                                  rd_ok<='1';
     311                                                                                                        else
     312                                                                                                                  rd_ok<='0';                                                                                                                                                                                                               
     313                                                                                                        end if;                                                                                               
     314                                                                                                       elsif n=1 then
     315                                                                                                            if switch_data_available = '1'  then
     316                                                                                                              dest_address_i(Word-1 downto 0) <= switch_port_out_data;
     317                                                                                                                P_len_i <= P_len - 2;   
     318                                                                                                                Next_Ex2_state <= ex2_put1;
     319                                                                                                                n_i<=0;
     320                                                                                                                rd_ok<='1';
     321                                                                                                                else
     322                                                                                                                  rd_ok<='0';
     323                                                                                                                    Next_Ex2_state <= fetch_addresses;
     324                                                                                        end if;
     325                                                                               end if;                 
     326
     327    when ex2_ack =>  rd_ok<='0';
     328                  if n<2 then --réception de l'acquittement.
     329                    n_e:=n_i;
     330                           read_nocdat_fsm(switch_data_available,rd_ok,wr_ok,P_len_i,n_e,n);
     331                           n_i<=n_e;
     332                   elsif n=2  then
     333                        if switch_data_available='1' then
     334                                                                                                n_i<=n+1;
     335                                                                                                rd_ok<='1';
     336                                                                                               
     337                                                                                                data_to_ram<=switch_port_out_data;
     338                                                                                                Result_i<=switch_port_out_data;
     339                                                                                        end if;
     340                     
     341              elsif n=3 then
     342                     n_i<=n+1;
     343                    if data_to_ram(7 downto 4)=MPI_PUT then
     344                                                                                                                Result_i<=data_to_ram;
     345                                                                                                                dest_address_i<=std_logic_vector(to_unsigned(Core_Put_adr+7,16));
     346                                                                                                                wr_ok<='1';
     347                                                                                                elsif   data_to_ram(7 downto 4)=MPI_GET then
     348                                                                                                                Result_i<=data_to_ram;
     349                                                                                                                wr_ok<='1'; --
     350                                                                                                                dest_address_i<=std_logic_vector(to_unsigned(Core_Get_adr+7,16));
     351                                                                                                elsif data_to_ram(7 downto 4)=MPI_SPAWN then
     352                                                                                                                Result_i<=data_to_ram;
     353                                                                                                                wr_ok<='1'; --
     354                                                                                                                dest_address_i<=std_logic_vector(to_unsigned(Core_Spawn_adr+7,16));
     355                                                                                                elsif data_to_ram(7 downto 4)=MPI_INIT then
     356                                                                                                                Result_i<=data_to_ram;
     357                                                                                                                dest_address_i<=std_logic_vector(to_unsigned(Core_Init_adr+7,16));             
     358                                                                                                                wr_ok<='1'; --
     359                                                                                                                --
     360                                                                                                else
     361                                                                                                                Result_i<="00000000";
     362                                                                                                                wr_ok<='0'; --
     363                                                                                                end if;
     364          elsif n=4 then --set acknowlege bit of the instruction
     365                     sb_start<='1';
     366                     sb_bitMask<=x"20";--cinquième bit à un
     367                     sb_bitval<='1';
     368                     if sb_done='1' then
     369                       n_i<=5;
     370                       sb_start<='0';
     371                       sb_bitval<='0';
     372                       end if;
     373               elsif n=5 then
     374                     Next_Ex2_state<=Ex2_Ready;
     375                     n_i<=0;
     376            end if;
     377                        when ex2_init1 => if n<2 then   -- execution du mpi Init
     378                                         wr_ok<='0';
     379                                                                                        if switch_data_available='1' then
     380                                                                                                n_i<=n+1;
     381                                                                                                rd_ok<='1';
     382                                                                                                P_len_i <=P_len-1;
     383                                                                                                Rec_Data(n+2)<=switch_port_out_data;
     384                                                                                                data_to_ram<=switch_port_out_data;
     385                                                                                                Result_i<=switch_port_out_data;
     386                                                                                        else
     387                                                                                                rd_ok<='0';
     388                                                                                                n_i<=n;
     389                                                                                        end if;
     390                                                                                        result_i<=(others=>'0');
     391                                                                                elsif n=2 then
     392                                                                                        --if switch_data_available='1' then
     393                                                                                                n_i<=n+1;
     394                                                                                                rd_ok<='0';
     395--                                                                                              --P_len <=P_len -1;
     396--                                                                                             
     397--                                                                                      else
     398--                                                                                              rd_ok<='0';     
     399--                                                                                      end if;
     400                                                                                elsif n=3 then
     401                                                                                  rd_ok<='0'; -- normalement plus rien à lire
     402                                                                                  n_i<=n+1;
     403                                                                                        if Initialized='1' then
     404                                                                                                if data_to_ram(7 downto 4)=INIT_SEEKMAIN then
     405                                                                                                                Result_i<=data_to_ram;
     406                                                                                                                wr_ok<='1'; --permet d'activer Init de Ex_4
     407                                                                                                elsif   data_to_ram(7 downto 4)=INIT_STAT then
     408                                                                                                                Result_i<=data_to_ram;
     409                                                                                                                wr_ok<='1'; --permet d'activer Init de Ex_4
     410                                                                                                elsif data_to_ram(7 downto 4)=INIT_REGISTER then
     411                                                                                                                Result_i<=data_to_ram;
     412                                                                                                                wr_ok<='1'; --permet d'activer Init de Ex_4
     413                                                                                                elsif data_to_ram(7 downto 4)=INIT_SPAWN then
     414                                                                                                                Result_i<=data_to_ram;
     415                                                                                                                wr_ok<='1'; --permet d'activer Init de Ex_4
     416                                                                                                                -- il faut mettre à jour l'état de Spawn
     417                                                                                                else
     418                                                                                                                Result_i<="00000000";
     419                                                                                                                wr_ok<='0'; --permet d'activer Init de Ex_4
     420                                                                                                end if;
     421                                                                                        end if;
     422                                                                                        elsif n=4 then
     423                                                                                    n_i<=n+1;
     424                                                                                  elsif n=5 then
     425                                                                                                if p_len=0 then
     426                                                                                                        Next_Ex2_state<=ex2_init2;
     427                                                                                                        rd_ok<='0';
    151428                                                                                                else
    152                                                                                                   ex2_state_mach <= fetch_addresses;
    153                                                                          end if;                               
    154                                                                                                  -- execution du mpi Init
    155                         when execute_init1 =>if Initialized='1' then
    156                                                                                         ex2_state_mach<=execute_init2;
     429                                                                                                        p_len_i <=p_len -1;
     430                                                                                                        rd_ok<='1'; --vider le tampon de lecture pour ce paquet !
     431                                                                                                end if;
     432                                                                                       
    157433                                                                                end if;
    158                         when execute_init2=>  if AppInitAck='1' then
    159                                                                                         ex2_state_mach<=fetch_packet_type;
    160                                                                                 end if;
    161                         when execute_put1 => if dma_wr_grant = '1' then
    162                                                                                   ex2_state_mach <= execute_put2;
    163                                                                                   data_to_ram<=switch_port_out_data;
    164                                                                                   rd_ok<='1';
    165                                                                                   n<="0000";
    166                                                                                   delai:=0;
    167                                                                                  else
    168                                                                                   ex2_state_mach <= execute_put1;
    169                                                                       end if;   
    170                         when execute_put2 =>    if unsigned( packet_length) > 1  then
     434                        when ex2_init2=>  if n=5 then
     435                                                 if AppInitAck='1' then
     436                                                                                                     n_i<=n+1;
     437                                                                                                     Result_i<="00000001"; -- cette valeur permet d'acquitter la fonction Init
     438                                                                                                 end if;
     439                                                                                             elsif n=6 then
     440                                                                                                        Next_Ex2_state<=Ex2_Ready;
     441                                                                                                        n_i<=0;
     442                                                                                             end if;
     443                                                                               
     444                        when ex2_put1 => rd_ok<='0'; --ne  pas autoriser la lecture du switch
     445                                         wr_ok<='0';
     446                                         if n=0 then
     447                                                 instr_ack_i<='1'; --activer  l'envoie de l'accusé de réception
     448                                                 data_to_write_fifo<=to_fifo_ack;
     449                                                 wr_ok<=wr_ack;
     450                                                 if sent_ack='1' then
     451                                                   n_i<=1;
     452                                                   instr_ack_i<='0';
     453                                                  end if;
     454                                                 
     455                                                elsif n=1 then
     456                                                if dma_wr_grant = '1' then
     457                                                                                          Next_Ex2_state <= ex2_put2;
     458                                                                                          data_to_ram<=switch_port_out_data;
     459                                                                                          rd_ok<='1';
     460                                                                                          n_i<=0;
     461                                                                                          delai:=0;
     462                                                                                           else
     463                                                                                          Next_Ex2_state <= ex2_put1;
     464                                                                          end if;
     465                                                                          end if;       
     466                        when ex2_put2 =>        if unsigned( P_len) > 1  then
    171467                                                                                               
    172468                                                                                        if switch_data_available = '1' and dma_wr_grant='1'  then
    173469                                                                                                         
    174                                                                                                                  packet_length <= packet_length - 1;
    175                                                                                                                  dest_address <= dest_address + 1;
    176                                                                                                                  ex2_state_mach <= execute_put2;
     470                                                                                                                 P_len_i <= P_len - 1;
     471                                                                                                                 dest_address_i <= dest_address + 1;
     472                                                                                                                 Next_Ex2_state <= ex2_put2;
    177473                                                                                                                 rd_ok<='1';
    178474                                                                                                                 wr_ok<='1';
     
    186482                                                                                                                --nécessaire pour écrire la donnée en RAM
    187483                                                                                                        end if;
    188                                                                                                         ex2_state_mach <= execute_put2;
     484                                                                                                        Next_Ex2_state <= ex2_put2;
    189485                                                                                                        rd_ok<='0'; --bloaque la lecture du switch pour ne pas perdre les données
    190486                                                                                        end if;
    191487                                                                                else
    192                                                                                         if switch_data_available = '1' then
     488                                                                                 
     489                                                                                        if switch_data_available = '1' and n=0 then
    193490                                                                                                --la dernière donnée à écrire en RAM
    194491                                                                                                data_to_ram<=switch_port_out_data;
    195492                                                                                                rd_ok<='0';
    196493                                                                                                wr_ok<='1';
     494                                                                                                n_i<=n+1;
    197495                                                                                        else
    198496                                                                                                rd_ok<='1';
    199497                                                                                                wr_ok<='0';
    200498                                                                                        end if;
    201                                                                                         if dma_wr_grant='1' then
     499                                                                                        if dma_wr_grant='1' and n=1 then
    202500
    203                                                                                                  ex2_state_mach <= execute_put3;
     501                                                                                                 Next_Ex2_state <= ex2_put3;
    204502                                                                                                Wr_ok<='0';
    205                                                                                                  
     503                                                                                                 n_i<=0;
    206504                                                                                         end if;
    207505                                                                            end if;
    208506                                                                       
    209                         when execute_put3 =>                    if dma_rd_grant='1' then
    210                                                                                                         dest_address<=std_logic_vector(to_unsigned(core_base_adr+4,16));
    211                                                                                                         ex2_state_mach <= execute_put4;
    212                                                                                                         n<="0000";
     507                        when ex2_put3 =>                        if dma_rd_grant='1' then
     508                                                                                                        dest_address_i<=std_logic_vector(to_unsigned(core_base_adr+4,16));
     509                                                                                                        Next_Ex2_state <= ex2_put4;
     510                                                                                                        n_i<=0;
    213511                                                                                                        rd_ok<='1';
    214512                                                                                                        wr_ok<='0';
    215513                                                                                                end if;
    216514                       
    217                         when execute_put4 => if n <=4 then     
     515                        when ex2_put4 => if n<=4 then     
    218516                       
    219517                                                                                                dma_wr<='1';  --demander un accès exclusif au bus
     
    225523                                                                                if n=0 then
    226524                                                                                        if dma_rd_grant='1' then
    227                                                                                                 n<=n+1;
     525                                                                                                n_i<=n+1;
    228526                                                                                        else
    229527                                                                                        rd_ok<='1';
     
    232530                                                                                        elsif n=1 then
    233531                                                                                                if dma_rd_grant='1' then
    234                                                                                                         n<=n+1;
     532                                                                                                        n_i<=n+1;
    235533                                                                                                else
    236534                                                                                                rd_ok<='1';
     
    239537                                                                                        elsif n=2 then
    240538                                                                                                if dma_rd_grant='1' then
    241                                                                                                         n<=n+1;
    242                                                                                                         tempval:=Ram_data_in;
     539                                                                                                        n_i<=n+1;
     540                                                                                                        tempval:=Ram_data_out;
    243541                                                                                                        tempval(4):='1';                        --SET du bit DReceived
    244542                                                                                                        tempval(1):='0';        --reset du bit DRING !!
     
    249547                                                                                                rd_ok<='1';
    250548                                                                                                wr_ok<='0';
    251                                                                                                 n<=n-1;
     549                                                                                                n_i<=n-1;
    252550                                                                                                end if;
    253551                                                                                        elsif n=3 then
     
    255553                                                                                                        rd_ok<='0';
    256554                                                                                                        wr_ok<='1';
    257                                                                                                         n<=n+1;
     555                                                                                                        n_i<=n+1;
    258556                                                                                                end if;
    259557                                                                                        elsif n=4 then
     
    261559                                                                                                        rd_ok<='0';
    262560                                                                                                        wr_ok<='1';
    263                                                                                                         ex2_state_mach <= execute_put5;
    264                                                                                                         n<="0000";
     561                                                                                                        Next_Ex2_state <= ex2_put5;
     562                                                                                                        n_i<=0;
    265563                                                                                                end if;
    266564                                                                                        end if;
     
    268566                                                                                 
    269567                                                                 
    270                                                                                 dest_address<=std_logic_vector(to_unsigned(core_base_adr+4,16));--Adr de gest de la transaction
    271                         when execute_put5 =>
    272                                                                                    ex2_state_mach <= fetch_packet_type; -- fin du mpi_put
     568                                                                                dest_address_i<=std_logic_vector(to_unsigned(core_base_adr+4,16));--Adr de gest de la transaction
     569                        when ex2_put5 =>
     570                                                                                   Next_Ex2_state <= Ex2_Ready; -- fin du mpi_put
    273571                                                                               
    274                                                                                  
    275                         when execute_get1 =>  if switch_data_available = '1' then  -- conversion du get en put en empilement dans le fifo
    276                                                                                      data_to_write_fifo <= MPI_PUT & switch_port_out_data(3 downto 0);
    277                                                                                           packet_length <= packet_length - 1;
    278                                                                                           ex2_state_mach <= execute_get2;
    279                                                                                           wr_ok<='1';
    280                                                                       end if;   
    281                         when execute_get2 => if fifo_full = '0' and switch_data_available ='1' and packet_length > 0 then
    282                                                                                    data_to_write_fifo <= switch_port_out_data;
    283                                                                                         packet_length <= packet_length - 1;
    284                                                                                    ex2_state_mach <= execute_get2;
    285                                                                                         wr_ok<='1';
    286                                                                                 elsif packet_length = 0 and  switch_data_available ='1' then--
    287                                                                                    ex2_state_mach <= fetch_packet_type;
    288                                                                                         wr_ok<='0';
     572                        when ex2_spawn =>
     573                                                                                       
     574                                                                                        if n<2 then
     575                                                                                         n_e:=n;
     576                                                                                        read_nocdat_fsm(switch_data_available,rd_ok,wr_ok,P_len_i,n_e,n);       
     577                                                                                        n_i<=n_e;
     578                                                                                        elsif n=2 then
     579                                                                                                        Result_i<=Switch_port_out_data;
     580                                                                                                        Data_to_ram<=Switch_port_out_data;
     581                                                                                                        n_i<=n+1;
     582                                                                                        elsif n=3 then
     583                                                                                                if data_to_ram(7 downto 4)=SPAWN_LOAD then
     584                                                                                                                Result_i<=data_to_ram;
     585                                                                                                                wr_ok<='1'; --permet d'activer Init de Ex_4
     586                                                                                                elsif   data_to_ram(7 downto 4)=SPAWN_ERR then
     587                                                                                                                Result_i<=data_to_ram;
     588                                                                                                                wr_ok<='0'; --permet d'activer Init de Ex_4
     589                                                                                                else
     590                                                                                                                Result_i<=(others=>'0');
     591                                                                                                       
     592                                                                                                end if;
     593                                                                                                n_i<=n+1;
     594                                                                                        elsif n=4 then 
     595                                                                                                                if AppInitAck='1' then
     596                                                                                                                        wr_ok<='1';
     597                                                                                                                        rd_ok<='0';
     598                                                                                                                        n_i<=n+1;
     599                                                                                                                end if;
     600                                                                                        elsif n=5 then
     601                                                                                                                        wr_ok<='0';
     602                                                                                                                        rd_ok<='0';
     603                                                                                                                        n_i<=0;
     604                                                                                                Next_Ex2_state <=Ex2_Ready;
     605                                                                                        end if;
     606                       
     607                        when ex2_get1 =>  rd_ok<='0'; --ne  pas autoriser la lecture du switch
     608                                         --ack_state<=next_ack_state; --MAE d'envoie de AR
     609                                         if n=0 then
     610                                                 instr_ack_i<='1'; --activer  l'envoie de l'accusé de réception
     611                                                 data_to_write_fifo<=to_fifo_ack;
     612                                                 wr_ok<=wr_ack;
     613                                                if sent_ack='1' then
     614                                                   n_i<=1;
     615                                                   instr_ack_i<='0';
     616                                                   wr_ok<='0';
     617                                                   --if switch_data_available='1' then
     618                                                   rd_ok<='0';--
     619                                                   --P_len<=P_len-1;
     620                                                   --end if;
     621                                                  end if;
     622                                                 
     623                                                elsif n=1 then
     624                                                if   switch_data_available='1' then
     625                                                if fifo_full = '0' then  -- conversion du get en put en empilement dans le fifo
     626                                                                                             data_to_write_fifo <= MPI_PUT & switch_port_out_data(3 downto 0);--la destination du Put                                                   
     627                                                                                                 wr_ok<='1';
     628                                                                                                 rd_ok<='1'; --autoriser la lecture du crossbar
     629                                                                                                 P_len_i<=P_len-1;
     630                                                                                                 n_i<=n+1;
     631                                                                                             else
     632                                                                                               Wr_ok<='0';
     633                                                                                               Rd_ok<='0';
     634                                                                                  end if;       
     635                                                                                  else
     636                                                                                    Wr_ok<='0';
     637                                                                                    rd_ok<='0';
     638                                                                                  end if;
     639                                                                                 elsif n=2 then
     640                                                                                  if   switch_data_available='1' then
     641                                                                                   if fifo_full = '0' then  -- conversion du get en put en empilement dans le fifo
     642                                                                                             --data_to_write_fifo <= MPI_PUT & switch_port_out_data(3 downto 0);--la destination du Put                                                 
     643                                                                                                --P_len_i <= P_len-1;--le nombre d'octet qui restent à copier
     644                                                                                                 Next_Ex2_state <= ex2_get2;
     645                                                                                                 wr_ok<='0';
     646                                                                                                 rd_ok<='0'; --autoriser la lecture du crossbar
     647                                                                                                 n_i<=0;
     648                                                                                               else
     649                                                                                                 rd_ok<='0';
     650                                                                                                 wr_ok<='0';
     651                                                                                              end if;
     652                                                                                             else
     653                                                                                                 rd_ok<='0';
     654                                                                                                 wr_ok<='0';
     655                                                                                  end if;       
     656                                                                      end if;
     657                        when ex2_get2 => if P_len>0 then
     658                                         if fifo_full = '0' and switch_data_available ='1' then
     659                                                                                        data_to_write_fifo <= switch_port_out_data;--la longueur initiale du GET
     660                                                                                             p_len_i <= P_len - 1;
     661                                                                                        Next_Ex2_state <= ex2_get2;
     662                                                                                             wr_ok<='1';
     663                                                                                             Rd_ok<='1';
     664                                                                                    elsE
     665                                                                                         
     666                                                                                                 wr_ok<='0';
     667                                                                                                 Rd_ok<='0';
     668                                                                                         END IF;
    289669                                                                                  else
    290                                                                                    ex2_state_mach <= execute_get3;
    291                                                                                         wr_ok<='0';
     670                                                                                  if n=0 then
     671                                                                                   if fifo_full='0' then
     672                                                                                         wr_ok<='0';--une impulsion en plus
     673                                                                                         n_i<=n+1;
     674                                                                                         Next_Ex2_state <= ex2_get2;
     675                                                                                         else
     676                                                                                          wr_ok<='0';
     677                                                                                        end if;
     678                                                                                       
     679                                                                                        else
     680                                                                                          Next_Ex2_state <= ex2_get3;
     681                                                                                          n_i<=0;
     682                                                                                          wr_ok<='0';
     683                                                                                         end if;
     684                                                                                        rd_ok<='0';
    292685                                                                    end if;
    293                    when execute_get3 => if dma_rd_grant='1' then -- fin du mpi_put
    294                                                                                    ex2_state_mach <= execute_get4;
    295                                                                                         n<="0000";
     686                   when ex2_get3 => wr_ok<='0';
     687                                    if dma_rd_grant='1' then -- fin du mpi_get
     688                                                                                   Next_Ex2_state <= ex2_get4;
     689                                                                                        n_i<=0;
    296690                                                                                        --activer le bit sending du registre de transfert
    297691                                                                                  else
    298                                                                                         ex2_state_mach <= execute_get3;
     692                                                                                        Next_Ex2_state <= ex2_get3;
    299693                                                                      end if;
    300694                                                                                       
    301                                                                                 dest_address<=std_logic_vector(to_unsigned(core_base_adr+4,16));
    302                         when execute_get4 => if n <4 then     
     695                                                                                dest_address_i<=std_logic_vector(to_unsigned(core_base_adr+4,16));
     696                        when ex2_get4 => if n <4 then     
    303697                       
    304698                                                                                                dma_wr<='1';  --demander un accès exclusif au bus
     
    310704                                                                                        if n=0 then
    311705                                                                                                if dma_rd_grant='1' then
    312                                                                                                 n<=n+1;
     706                                                                                                n_i<=n+1;
    313707                                                                                               
    314708                                                                                                end if;
     
    317711                                                                                        elsif n=1 then
    318712                                                                                                if dma_rd_grant='1' then
    319                                                                                                         n<=n+1;
     713                                                                                                        n_i<=n+1;
    320714                                                                                                       
    321715                                                                                                        end if;
     
    325719                                                                                        elsif n=2 then
    326720                                                                                                        if dma_rd_grant='1' and dma_wr_grant='1' then
    327                                                                                                                 n<=n+1;
    328                                                                                                                 tempval:=Ram_data_in;
     721                                                                                                                n_i<=n+1;
     722                                                                                                                tempval:=Ram_data_out;
    329723                                                                                                                tempval(2):='1';        --mise à 1 du Bit Dreceiving
    330724                                                                                                                --tempval(5):='0';              --Mise à 0 du Bit Sent
     
    339733                                                                                        elsif n=3 then
    340734                                                                                                if dma_wr_grant = '1' then
    341                                                                                                 n<=n+1;
     735                                                                                                n_i<=n+1;
    342736                                                                                                rd_ok<='0';
    343737                                                                                                wr_ok<='1';
     
    345739                                                                                        elsif n=4 then
    346740                                                                                          if dma_wr_grant = '1' then
    347                                                                                                         n<="0000";
    348                                                                                                         ex2_state_mach <= fetch_packet_type; -- fin du mpi_get
     741                                                                                                        n_i<=0;
     742                                                                                                        Next_Ex2_state <= Ex2_Ready; -- fin du mpi_get
    349743                                                                                          else
    350744                                                                                                        rd_ok<='0';
     
    355749                                                                                   
    356750                                                                                 
    357                                                                                 dest_address<=std_logic_vector(to_unsigned(core_base_adr+4,16));
     751                                                                                dest_address_i<=std_logic_vector(to_unsigned(core_base_adr+4,16));
    358752                                                                -- execution du barrier
    359                         when execute_barrier1 => if switch_data_available = '1' then
     753                        when ex2_barrier1 => if switch_data_available = '1' then
    360754                                                                                                 pading_data <= switch_port_out_data;
    361                                                                                                  ex2_state_mach <= execute_barrier2;
     755                                                                                                 Next_Ex2_state <= ex2_barrier2;
    362756                                                                                          else
    363                                                                                             ex2_state_mach <= execute_barrier1;
     757                                                                                            Next_Ex2_state <= ex2_barrier1;     
    364758                                                                                         end if;       
    365                         when execute_barrier2 => if packet_type = MPI_BARRIER_REACHED then
     759                        when ex2_barrier2 => if packet_type = MPI_BARRIER_REACHED then
    366760                                                                                                 barrier_counter <= barrier_counter + 1;
    367                                                                                                  ex2_state_mach <= execute_barrier4;   
     761                                                                                                 Next_Ex2_state <= ex2_barrier4;       
    368762                                                                                          else
    369                                                                                             ex2_state_mach <= execute_barrier3;
     763                                                                                            Next_Ex2_state <= ex2_barrier3;     
    370764                                                                                         end if;       
    371                         when execute_barrier3 => if n < 10 then
    372                                                                                                  n <= n + 1;
    373                                                                                                  ex2_state_mach <= execute_barrier3;   
     765                        when ex2_barrier3 => if n < 10 then
     766                                                                                                 n_i<= n + 1;
     767                                                                                                 Next_Ex2_state <= ex2_barrier3;       
    374768                                                                                          else
    375                                                                                             ex2_state_mach <= fetch_packet_type;       
     769                                                                                            Next_Ex2_state <= Ex2_Ready;       
    376770                                                                                         end if;       
    377                         when execute_barrier4 => if barrier_counter = nprocs then -- entete du packet MPI_BARRIER_COMPLETED
     771                        when ex2_barrier4 => if barrier_counter = nprocs then -- entete du packet MPI_BARRIER_COMPLETED
    378772                                                                                                 data_to_write_fifo <= MPI_BARRIER_COMPLETED & "0000";
    379                                                                                                  ex2_state_mach <= execute_barrier5;   
     773                                                                                                 Next_Ex2_state <= ex2_barrier5;       
    380774                                                                                          else
    381                                                                                             ex2_state_mach <= fetch_packet_type;       
     775                                                                                            Next_Ex2_state <= Ex2_Ready;       
    382776                                                                                         end if;       
    383                         when execute_barrier5 => if fifo_full = '0' then  -- taille du packet MPI_BARRIER_COMPLETED
     777                        when ex2_barrier5 => if fifo_full = '0' then  -- taille du packet MPI_BARRIER_COMPLETED
    384778                                                                                                 data_to_write_fifo <= "00000011";
    385                                                                                                  ex2_state_mach <= execute_barrier6;   
     779                                                                                                 Next_Ex2_state <= ex2_barrier6;       
    386780                                                                                          else
    387                                                                                             ex2_state_mach <= execute_barrier5;
     781                                                                                            Next_Ex2_state <= ex2_barrier5;     
    388782                                                                                         end if;               
    389                         when execute_barrier6 => if fifo_full ='0' then -- troisième octet du packet MPI_BARRIER_COMPLETED
     783                        when ex2_barrier6 => if fifo_full ='0' then -- troisième octet du packet MPI_BARRIER_COMPLETED
    390784                                                                                                 data_to_write_fifo <= "00000000";
    391                                                                                                  ex2_state_mach <= execute_barrier7;   
     785                                                                                                 Next_Ex2_state <= ex2_barrier7;       
    392786                                                                                          else
    393                                                                                             ex2_state_mach <= execute_barrier6;
     787                                                                                            Next_Ex2_state <= ex2_barrier6;     
    394788                                                                                         end if;                               
    395                         when execute_barrier7 => if fifo_full = '0' then
     789                        when ex2_barrier7 => if fifo_full = '0' then
    396790                                                                                                 barrier_counter <= "0000";
    397                                                                                                  ex2_state_mach <= fetch_packet_type;   
     791                                                                                                 Next_Ex2_state <= Ex2_Ready;   
    398792                                                                                          else
    399                                                                                             ex2_state_mach <= execute_barrier7;
     793                                                                                            Next_Ex2_state <= ex2_barrier7;     
    400794                                                                                         end if;                               
    401795                       
    402                         when others => ex2_state_mach <= fetch_packet_type;
     796                        when others => Next_Ex2_state <= Ex2_Ready;
    403797                   end case;
    404     end if;
    405   end if;
     798 
    406799 end process;
    407800 
    408801 -- sortie de la machine à etat
    409802--
    410  ex2_fsm_action : process(ex2_state_mach, fifo_full, packet_length, data_to_write_fifo, packet_type,
    411  switch_data_available,switch_port_out_data,Ram_data_in,rd_ok)
     803 ex2_fsm_action : process(Ex2_state, Ex2_on,fifo_full, P_len, data_to_write_fifo, packet_type,
     804 switch_data_available,switch_port_out_data,sb_ram_data_in,Ram_data_out,rd_ok,wr_ok,sb_dma_rd_request,n)
    412805  variable transact : std_logic_vector(Word-1 downto 0);
    413806  begin   
    414807-- code fonctionnel     
    415         case ex2_state_mach is
    416        
    417                 when fetch_packet_type => fifo_wr_en <= '0';
    418                                                                                   switch_port_out_rd_en <= switch_data_available;
     808        case Ex2_state is
     809                when  Ex2_Ready => fifo_wr_en <= '0';
     810                                                                                  switch_port_out_rd_en <= '0';
    419811                                                                                  packet_received <= '0';
    420812                                                                                  dma_wr_request <= '0';
    421813                                                                                  dma_rd_request <= '0';
    422814                                                                                  barrier_completed <= '0';
    423                                                                                   Ram_data_out<=(others=>'Z');
     815                                                                                  Ram_data_in<=(others=>'-');
    424816                                                                                  Ram_rd<='0';
    425817                                                                                  Ram_wr<='0';
    426818                                                                                  Ready<='1';
     819                                                                                  AppInitReq<='0';
     820                when  fetch_packet_type => fifo_wr_en <= '0';
     821                                                                                  switch_port_out_rd_en <= rd_ok;
     822                                                                                  packet_received <= '0';
     823                                                                                  dma_wr_request <= '0';
     824                                                                                  dma_rd_request <= '0';
     825                                                                                  barrier_completed <= '0';
     826                                                                                  Ram_data_in<=(others=>'-');
     827                                                                                  Ram_rd<='0';
     828                                                                                  Ram_wr<='0';
     829                                                                                  Ready<='0';
    427830                                                                                  AppInitReq<='0';
    428831                                                                                 
    429832                                                                 
    430833                when decode_packet_type => fifo_wr_en <= '0';
    431                                                                                   switch_port_out_rd_en <= switch_data_available;
     834                                                                                  switch_port_out_rd_en <= rd_ok;
    432835                                                                                  packet_received <= '0';
    433836                                                                                  dma_wr_request <= '0';
     
    435838                                                                                  Ram_rd<='0';
    436839                                                                                  Ram_wr<='0';
    437                                                                                   Ram_data_out<=(others=>'Z');
     840                                                                                  Ram_data_in<=(others=>'-');
    438841                                                                                  barrier_completed <= '0';
    439842                                                                                  AppInitReq<='0';     
     
    447850                                                                                    Ram_rd<='0';
    448851                                                                                        Ram_wr<='0';
    449                                                                                         Ram_data_out<=(others=>'Z');
     852                                                                                        Ram_data_in<=(others=>'-');
    450853                                                                                    barrier_completed <= '0';
    451854                                                                                    AppInitReq<='0';   
    452855                                                                                        Ready<='0';
    453856                when fetch_addresses =>  fifo_wr_en <= '0';
    454                                                                                   switch_port_out_rd_en <= switch_data_available;
     857                                                                                  switch_port_out_rd_en <= rd_ok;
    455858                                                                                  packet_received <= '0';
    456859                                                                                  dma_wr_request <= '0';
     
    458861                                                                                  Ram_rd<='0';
    459862                                                                                  Ram_wr<='0';
    460                                                                                   Ram_data_out<=(others=>'Z');
     863                                                                                  Ram_data_in<=(others=>'-');
     864                                                                                  barrier_completed <= '0';
     865                                                                                  AppInitReq<='0';     
     866                                                                                        Ready<='0';
     867                when ex2_ack =>           
     868                                                                                Ready<='0';
     869                                                                                switch_port_out_rd_en<=rd_ok;
     870                                                                                fifo_wr_en <= '0';
     871                                                                    packet_received <= '0';
     872                                                                    AppInitReq<='0';
     873                                                                    barrier_completed <= '0';
     874                                                                    dma_rd_request <= sb_dma_rd_request;
     875                                                                                dma_wr_request <= sb_dma_wr_request;
     876                                                                                Ram_rd<=sb_ram_rd;
     877                                                                                Ram_wr<=sb_ram_wr;
     878                                                                                sb_ram_data_out<=Ram_data_out;
     879                                                                                Ram_data_in<=sb_ram_data_in;
     880                when ex2_put1 =>  fifo_wr_en <= wr_ok;
     881                                                                                  switch_port_out_rd_en <= '0';
     882                                                                                  packet_received <= '0';
     883                                                                                  dma_wr_request <= '1';
     884                                                                                  dma_rd_request <= '0';
     885                                                                                  Ram_rd<='0';
     886                                                                                  Ram_wr<='0';
     887                                                                                  Ram_data_in<=(others=>'-');
    461888                                                                                  barrier_completed <= '0';
    462889                                                                                  AppInitReq<='0';     
    463890                                                                                        Ready<='0';
    464891               
    465                 when execute_put1 =>      fifo_wr_en <= '0';
    466                                                                                   switch_port_out_rd_en <= '0';
    467                                                                                   packet_received <= '0';
    468                                                                                   dma_wr_request <= '1';
    469                                                                                   dma_rd_request <= '0';
    470                                                                                   Ram_rd<='0';
    471                                                                                   Ram_wr<='0';
    472                                                                                   Ram_data_out<=(others=>'Z');
    473                                                                                   barrier_completed <= '0';
    474                                                                                   AppInitReq<='0';     
    475                                                                                         Ready<='0';
    476                
    477                 when  execute_put2 =>   Ready<='0';
     892                when  ex2_put2 =>   Ready<='0';
    478893                                                                                fifo_wr_en <= '0';
    479894                                                                                switch_port_out_rd_en <=rd_ok;
     
    481896                                                                                if rd_ok = '1' then
    482897                                                                               
    483                                                                                  Ram_data_out<=switch_port_out_data;
     898                                                                                 Ram_data_in<=switch_port_out_data;
    484899                                                                                else
    485                                                                                         Ram_data_out<=data_to_ram;
     900                                                                                        Ram_data_in<=data_to_ram;
    486901                                                                                end if;
    487902                                                                                Ram_wr<='1';
     
    492907                                                                                AppInitReq<='0';       
    493908                                                                                barrier_completed <= '0';
    494                 when  execute_put3 =>    Ready<='0';
     909                when  ex2_put3 =>        Ready<='0';
    495910                                                                                fifo_wr_en <= '0';
    496911                                                                           switch_port_out_rd_en <=rd_ok;       
    497912                                                                                --ne pas corrompre le contenu de la RAM
    498                                                                                 --Ram_data_out<=data_to_ram;                                   
     913                                                                                --Ram_data_in<=data_to_ram;                                     
    499914                                                                                Ram_wr<='0';
    500915                                                                                Ram_rd<='1';
     
    506921                                                                               
    507922               
    508                 when execute_put4 =>    fifo_wr_en <= '0';
     923                when ex2_put4 =>    fifo_wr_en <= '0';
    509924                                                                                Ready<='0';
    510925                                                                                switch_port_out_rd_en <= '0';
     
    516931                                                                                 AppInitReq<='0';       
    517932                                                                                 barrier_completed <= '0';     
    518                                                                                  Ram_data_out<=data_to_ram;--Ram_data_in or "00000010"; -- le résultat de l'exécution
     933                                                                                 Ram_data_in<=data_to_ram;--Ram_data_in or "00000010"; -- le résultat de l'exécution
    519934                                                                                       
    520                 when execute_put5 =>             
     935                when ex2_put5 =>                 
    521936                                                                                Ready<='0';
    522937                                                                                switch_port_out_rd_en<='0';
     
    529944                                                                                Ram_rd<=rd_ok;
    530945                                                                                Ram_wr<=wr_ok;
    531                                                                                 Ram_data_out<=data_to_ram;
     946                                                                                Ram_data_in<=data_to_ram;
    532947                                                                                --Result <=(1=>'1',others=>'0'); --put completed                                                                 
    533948               
    534                 when execute_get1=>       fifo_wr_en <= '0';
    535                                                                                   switch_port_out_rd_en <= switch_data_available;
     949                when ex2_get1=>   fifo_wr_en <= wr_ok;
     950                                                                                  switch_port_out_rd_en <= rd_ok;
    536951                                                                                  packet_received <= '0';
    537952                                                                                  dma_wr_request <= '0';
     
    539954                                                                                  Ram_rd<='0';
    540955                                                                                  Ram_wr<='0';
    541                                                                                   Ram_data_out<=(others=>'Z');
     956                                                                                  Ram_data_in<=(others=>'-');
    542957                                                                                  barrier_completed <= '0';
    543958                                                                                  AppInitReq<='0';     
    544959                                                                                        Ready<='0';
    545960               
    546                 when execute_get2 =>         if fifo_full = '0' and switch_data_available = '1'  and packet_length > 0 then
    547                                                                                    
    548                                                                                          switch_port_out_rd_en <='1';
    549                                                                                   else
    550                                                                                    
    551                                                                                          switch_port_out_rd_en <='0';
    552                                                                                   end if;
    553                                                                                  
     961                when ex2_get2 =>                                                                                           
     962                                                                                         switch_port_out_rd_en <=rd_ok;
    554963                                                                                  fifo_wr_en <= Wr_ok;
    555964                                                                                  Ready<='0';
     
    559968                                                                                  Ram_rd<='0';
    560969                                                                                  Ram_wr<='0';
    561                                                                                   Ram_data_out<=(others=>'Z');
     970                                                                                  Ram_data_in<=(others=>'-');
    562971                                                                                  barrier_completed <= '0';
    563972                                                                                  AppInitReq<='0';     
    564973                                                                                   
    565                 when execute_get3 =>                    fifo_wr_en <= '0';
     974                when ex2_get3 =>                fifo_wr_en <= '0';
    566975                                                                                Ready<='0';
    567976                                                                                switch_port_out_rd_en <= '0';
     
    575984                                                                                 --Ram_data_out<=Ram_data_in or "00000010"; -- activer le bit DSending
    576985                                                                                       
    577                 when execute_get4 =>             
     986                when ex2_get4 =>                 
    578987                                                                                Ready<='0';
    579988                                                                                barrier_completed <= '0';
     
    586995                                                                                Ram_rd<=rd_ok;
    587996                                                                                Ram_wr<=wr_ok;
    588                                                                                 Ram_data_out<=data_to_ram; --activer le bit DSending
     997                                                                                Ram_data_in<=data_to_ram; --activer le bit DSending
    589998               
    590999               
    591                 when execute_barrier1 =>  fifo_wr_en <= '0';
     1000                when ex2_barrier1 =>  fifo_wr_en <= '0';
    5921001                                                                                  switch_port_out_rd_en <= switch_data_available;
    5931002                                                                                  packet_received <= '0';
     
    5961005                                                                                  Ram_rd<='0';
    5971006                                                                                        Ram_wr<='0';
    598                                                                                         Ram_data_out<=(others=>'Z');
     1007                                                                                        Ram_data_in<=(others=>'-');
    5991008                                                                                  barrier_completed <= '0';
    6001009                                                                                        Ready<='0';
    6011010                                                                                  AppInitReq<='0';     
    6021011                                                                                 
    603                 when execute_barrier2 =>  fifo_wr_en <= '0';
     1012                when ex2_barrier2 =>  fifo_wr_en <= '0';
    6041013                                                                                Ready<='0';
    6051014                                                                                  switch_port_out_rd_en <='0';
     
    6091018                                                                                  Ram_rd<='0';
    6101019                                                                                        Ram_wr<='0';
    611                                                                                         Ram_data_out<=(others=>'Z');
     1020                                                                                        Ram_data_in<=(others=>'-');
    6121021                                                                                  barrier_completed <= '0';   
    6131022                                                                                  AppInitReq<='0';     
    6141023                                                                                 
    615                 when execute_barrier3 =>        fifo_wr_en <= '0';
     1024                when ex2_barrier3 =>    fifo_wr_en <= '0';
    6161025                                                                                  switch_port_out_rd_en <='0';
    6171026                                                                                  Ready<='0';
     
    6211030                                                                                  Ram_rd<='0';
    6221031                                                                                        Ram_wr<='0';
    623                                                                                         Ram_data_out<=(others=>'Z');
     1032                                                                                        Ram_data_in<=(others=>'-');
    6241033                                                                                  barrier_completed <= '1';     
    6251034                                                                                        AppInitReq<='0';       
    6261035               
    627                 when execute_barrier4 =>   fifo_wr_en <= '0';
     1036                when ex2_barrier4 =>   fifo_wr_en <= '0';
    6281037                                                                                  switch_port_out_rd_en <='0';
    6291038                                                                                  packet_received <= '0';
     
    6321041                                                                                  Ram_rd<='0';
    6331042                                                                                        Ram_wr<='0';
    634                                                                                         Ram_data_out<=(others=>'Z');
     1043                                                                                        Ram_data_in<=(others=>'-');
    6351044                                                                                  barrier_completed <= '0';
    6361045                                                                                  AppInitReq<='0';     
     
    6381047                                                                                 
    6391048                                                                                 
    640                 when execute_barrier5 =>  fifo_wr_en <= not(fifo_full);
     1049                when ex2_barrier5 =>  fifo_wr_en <= not(fifo_full);
    6411050                                                                                  switch_port_out_rd_en <='0';
    6421051                                                                                  packet_received <= '0';
     
    6451054                                                                                  Ram_rd<='0';
    6461055                                                                                        Ram_wr<='0';
    647                                                                                         Ram_data_out<=(others=>'Z');
     1056                                                                                        Ram_data_in<=(others=>'-');
    6481057                                                                                  barrier_completed <= '0';                                                                               
    6491058                                                                                  AppInitReq<='0';     
    6501059                                                                                  Ready<='0';
    6511060                                                                                 
    652                 when execute_barrier6 =>  fifo_wr_en <= not(fifo_full);                                                                         
     1061                when ex2_barrier6 =>  fifo_wr_en <= not(fifo_full);                                                                             
    6531062                                                                                  switch_port_out_rd_en <= '0';
    6541063                                                                                  packet_received <= '0';
     
    6571066                                                                                  Ram_rd<='0';
    6581067                                                                                  Ram_wr<='0';
    659                                                                                   Ram_data_out<=(others=>'Z');
     1068                                                                                  Ram_data_in<=(others=>'-');
    6601069                                                                                  barrier_completed <= '0';
    6611070                                                                                  AppInitReq<='0';
    6621071                                                                                  Ready<='0';                   
    6631072               
    664                 when execute_barrier7 =>  fifo_wr_en <= not(fifo_full);
     1073                when ex2_barrier7 =>  fifo_wr_en <= not(fifo_full);
    6651074                                                                                  switch_port_out_rd_en <= '0';
    6661075                                                                                  packet_received <= '0';
     
    6691078                                                                                  Ram_rd<='0';
    6701079                                                                                  Ram_wr<='0';
    671                                                                                   Ram_data_out<=(others=>'Z');
     1080                                                                                  Ram_data_in<=(others=>'-');
    6721081                                                                                  barrier_completed <= '0';
    6731082                                                                                  AppInitReq<='0';     
    6741083                                                                                  Ready<='0';
    6751084                                                                                       
    676      
    677           when execute_init1 =>         fifo_wr_en <= not(fifo_full);
    678                                                                                    switch_port_out_rd_en <= '0';
     1085     when ex2_spawn =>                          fifo_wr_en <= '0';
     1086                                                                                   switch_port_out_rd_en <= rd_ok;--switch_data_available;
    6791087                                                                                   packet_received <= '0';
    6801088                                                                                   dma_wr_request <= '0';
     
    6841092                                                                                   barrier_completed <= '0';
    6851093                                                                                   Ready<='0';
    686                                                                                         Ram_data_out<=(others =>'Z');
    687                                                                                         AppInitReq<='1';
    688                                                                                        
    689                
    690                 when execute_init2 =>           fifo_wr_en <= not(fifo_full);
    691                                                                                    switch_port_out_rd_en <= '0';
     1094                                                                                        Ram_data_in<=(others =>'-');
     1095                                                                                        AppInitReq<=wr_ok;
     1096          when ex2_init1 =>     fifo_wr_en <= '0';
     1097                                                                                   switch_port_out_rd_en <= rd_ok;--switch_data_available;
    6921098                                                                                   packet_received <= '0';
    6931099                                                                                   dma_wr_request <= '0';
     
    6961102                                                                                        Ram_wr<='0';
    6971103                                                                                   barrier_completed <= '0';
    698                                                                                         Ram_data_out<=(others =>'Z');
    699                                                                                         AppInitReq<='1';
     1104                                                                                   Ready<='0';
     1105                                                                                        Ram_data_in<=(others =>'-');
     1106                                                                                        AppInitReq<=wr_ok;
     1107                                                                                       
     1108               
     1109                when ex2_init2 =>       fifo_wr_en <= '0';
     1110                                                                                   switch_port_out_rd_en <='0';
     1111                                                                                   packet_received <= '0';
     1112                                                                                   dma_wr_request <= '0';
     1113                                                                                   dma_rd_request <= '0';
     1114                                                                                   Ram_rd<='0';
     1115                                                                                        Ram_wr<='0';
     1116                                                                                   barrier_completed <= '0';
     1117                                                                                        Ram_data_in<=(others =>'-');
     1118                                                                                        AppInitReq<= not(AppInitAck);
    7001119                                                                                        Ready<='0';
    7011120                                                               
     
    7071126                                                                                  dma_rd_request <= '0';
    7081127                                                                                  barrier_completed <= '0';
    709                                                                                   Ram_data_out<=(others=>'Z');
     1128                                                                                  Ram_data_in<=(others=>'-');
    7101129                                                                                  Ram_rd<='0';
    7111130                                                                                  Ram_wr<='0';
     
    7151134       
    7161135 end process;
    717 
     1136 
     1137 ex2_fsm_sync:process(clk)
     1138 
     1139 begin
     1140   if rising_edge(clk) then
     1141        if reset = '1' then
     1142        ex2_state <= Ex2_Ready;
     1143        ack_state<=ack0; --MAE d'envoie de AR
     1144        n<=0;
     1145        P_len<=(others=>'0');
     1146        else
     1147          ex2_state<=next_ex2_state;
     1148          ack_state<=next_ack_state; --MAE d'envoie de AR
     1149          n<=n_i;
     1150          P_len<=P_len_i;
     1151          dest_address <= dest_address_i;
     1152          Sent_ack<=sent_ack_i;
     1153          Instr_ack<=Instr_ack_i;
     1154         end if;
     1155        end if;
     1156 end process ex2_fsm_sync;
     1157snd_ack:process (ack_state,reset,fifo_full,instr_ack)
     1158--ce processus est chargé d'emettre  l'accusé de réception pour chaque instruction reçu
     1159begin   
     1160--  if rising_edge(clk) then
     1161   
     1162    if  reset='1' then
     1163        next_ack_state<=ack0;
     1164  else
     1165    next_ack_state<=ack_state;
     1166        case ack_state is
     1167        when ack0 =>to_fifo_ack<=(others=>'0');
     1168                       Wr_ack<='0';
     1169                       if instr_ack='1' then
     1170                       next_ack_state<=ack1;
     1171                       to_fifo_ack <= MPI_ACK & Dest_ack;
     1172                       wr_ack<='0';
     1173                     end if;
     1174                     
     1175                     sent_ack_i<='0';
     1176                     
     1177        when ack1 =>  if fifo_full = '0' then  -- conversion envoie lack à l'emetteur 
     1178                           -- en empilement dans le fifo
     1179                                                                                    to_fifo_ack <= MPI_ACK & Dest_ack;
     1180                                                                                          next_ack_state <= ack2;
     1181                                                                                          wr_ack<='1';
     1182                                                                else
     1183                                                                        wr_ack<='0';
     1184                                                                 end if;       
     1185                                                                      sent_ack_i<='0';
     1186        when ack2 =>     if fifo_full = '0' then
     1187                                                                                   to_fifo_ack <= "00000100";--la longueur
     1188                                                                                       
     1189                                                                                   next_ack_state <= ack3;
     1190                                                                                        wr_ack<='1';
     1191                                                                                else --
     1192                                                                                  next_ack_state <= ack2;
     1193                                                                                        wr_ack<='0';
     1194                                                                                 
     1195                                                                    end if;
     1196                                                                    sent_ack_i<='0';
     1197        when ack3 =>     if fifo_full = '0' then
     1198                             to_fifo_ack <= "00000000";--
     1199                                                                                   next_ack_state <= ack4;
     1200                                                                                        wr_ack<='1';
     1201                                                                                else --
     1202                                                                                  next_ack_state <= ack3;
     1203                                                                                        wr_ack<='0';
     1204                                                                                 
     1205                                                                    end if;     
     1206                                                                    sent_ack_i<='0';
     1207        when ack4 =>     if fifo_full = '0' then
     1208                                                                                        to_fifo_ack <=packet_type & apprank ;--l'instruction et le rang de lacquitteur
     1209                                                                                  next_ack_state <= ack5;
     1210                                                                                        wr_ack<='1';
     1211                                                                                        sent_ack_i<='0';
     1212                                                                                else --
     1213                                                                                  next_ack_state <= ack4;
     1214                                                                                        wr_ack<='0';
     1215                                                                                 sent_ack_i<='0';
     1216                                                                    end if;     
     1217                        when ack5 => if Instr_ack='0' then --dernier pulse
     1218                                                                next_ack_state <= ack0;
     1219                                                        else
     1220                                                          next_ack_state <= ack6;
     1221                                                 end if;
     1222                                                 wr_ack<='0';
     1223                                                                                sent_ack_i<='1';
     1224                                                                                to_fifo_ack<=(others=>'1');
     1225                        when ack6 => if Instr_ack='0' then
     1226                                                                next_ack_state <= ack0;
     1227                                                               
     1228                                                 end if;
     1229                                                 wr_ack<='0';
     1230                                                                                sent_ack_i<='1';
     1231                                                                                to_fifo_ack<=(others=>'1');
     1232end case;
     1233end if;
     1234--end if;
     1235end process;               
    7181236end Behavioral;
    7191237
Note: See TracChangeset for help on using the changeset viewer.