Ignore:
Timestamp:
Jan 6, 2014, 3:16:44 PM (10 years ago)
Author:
rolagamo
Message:
 
File:
1 edited

Legend:

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

    r70 r72  
    3333procedure pMPI_Win_start( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
    3434procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
    35 
     35procedure pMPI_Win_post( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
     36procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
    3637procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; 
    3738command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural; 
     
    6162  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
    6263  Target_Datatype :natural; Win : natural) is
    63 variable i,dcount : natural:=0;
     64variable i,dcount,wr_state : natural:=0;
    6465variable adresse :natural;
    6566variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
     
    6970constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
    7071        begin   
    71                                 put_adr:=Std_logic_vector(to_unsigned(Core_put_adr,ADRLEN));
     72                                put_adr:=conv_Std_logic_vector(Core_put_adr,ADRLEN);
    7273                               
    7374                                addr1:=Orig_Addr;
     
    7980                                       
    8081                                if rising_edge(clkin) then             
    81                                                         if dcount>=0 and dcount <=3 then
     82                                  if dcount= 0 then
     83                                      dcount:=dcount+1;
     84                                      Interf.S.Intstate1<=0;
     85                                        elsif dcount>=1 and dcount <=3 then
    8286                                                                        if interf.I.ramsel='0' then
    8387                                                                                        Interf.O.membusy<='0';
     
    8589                                                                                        SysRam.O.ena<='1';
    8690                                                                                        SysRam.O.enb<='0';
    87                                                                                         WritePtr (put_adr,dcount,SysRam);
    88                                                                                         if dcount =4 then
     91                                                                                        wr_state:=interf.S.Intstate1;
     92                                                                                        WritePtr (put_adr,wr_state,SysRam);
     93                                                                                        interf.S.Intstate1<=wr_state;
     94                                                                                        if wr_state =4 then
    8995                                                                                                -- fin de l'écriture du pointeur en mémoire
     96                                                                                        dcount:=4;
    9097                                                                                        end if;                                                         
    9198                                                                        end if;
     
    97104                                                                SysRam.O.enb<='0';
    98105                                                                Interf.O.membusy<='1';
     106                                                                if target_rank <=15 then --limitation de cete version à 16 rang
     107                                                                Interf.S.Gstart(Target_rank)<='1';
     108                                                                end if;
    99109                                                                adresse:=core_put_adr;
    100                                                                 SysRam.O.Data_in<=MPI_PUT & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
     110                                                                SysRam.O.Data_in<=MPI_PUT & conv_std_logic_vector(Target_Rank,4); --code fonction
    101111                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    102112                                                                dcount:=dcount+1;
     
    199209                                                                                if SysRam.I.Data_out(0)='1' then --fin du MPI PUT ici pour l'envoie !
    200210                                                                                        dcount:=dcount+1;
    201                                                                                         SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
     211                                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
    202212                                                                                  Interf.S.Intstate2<=255; --timer pour la réception
    203213                                                                                end if;
     
    215225                                                                        Interf.O.membusy<='0';
    216226                                                                        if interf.I.ramsel='0' then
    217                                                                                 SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
     227                                                                                SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
    218228                                                                                if SysRam.I.Data_out(5)='1' then --Message  du MPI PUT bien reçu !
    219229                                                                                        dcount:=dcount+1;
    220                                                                                         SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+7,Adrlen));
     230                                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
    221231                                                                                elsif Interf.S.Intstate2>0 then
    222232                                                                                  Interf.S.Intstate2<=Interf.S.Intstate2-1;
     
    269279                                                                                        Interf.S.IntState1<=wcount;
    270280                                                                                        Interf.O.membusy<='1';
    271                                                                                         if wcount =0 then
     281                                                                                        if wcount =4 then
    272282                                                                                                dcount:=4;
     283                                                                                                Interf.S.Intstate1<=1;
    273284                                                                                        end if;                                                         
    274285                                                                        end if;
     
    279290                                                                SysRam.O.ena<='1';
    280291                                                                SysRam.O.enb<='0';
    281                                                                
     292                                                                if target_rank <=15 then --limitation de cete version à 16 rang
     293                                                                Interf.S.Gstart(Target_rank)<='1';
     294                                                                end if;
    282295                                                                adresse:=core_get_adr;
    283                                                                 SysRam.O.Data_in<=MPI_GET & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
     296                                                                SysRam.O.Data_in<=MPI_GET & conv_Std_logic_vector(Target_Rank,4); --code fonction
    284297                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    285298                                                                Interf.O.membusy<='1';
     
    348361                                                                        SysRam.O.enb<='1';
    349362                                                                        adresse:=core_base_adr+1;
    350                                                                         SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
     363                                                                        SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
    351364                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    352365                                                                        SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
     
    469482                        if interf.I.ramsel='0' then
    470483                                Rank<=SysRam.I.Data_out(3 downto 0);
     484                                Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
    471485                                NextCtx:=3;
    472486                                Interf.O.membusy<='1';
     
    605619        --cette étape consiste à envoyer le message WINCREATE Sur le réseau et à récupérer
    606620        -- les informations donnant le numéro de la fenêtre
    607                 W0:=MPI_WINCREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
     621                W0:=MPI_WIN_CREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
    608622                count:=Interf.S.IntState1;
    609623                Writemem(count,interf,SysRam,wcreate_adr,w0);
     
    693707                                        SysRam.O.ena<='1';
    694708                                        SysRam.O.enb<='0';
    695                                         SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
     709                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
    696710                                        SysRam.O.Data_in<=x"01"; --mise à 1 du bit WSTART et remise à zero de tous les autres Bits     
    697711                                                       
    698712                                        NextCtx:=NextCtx+1;
    699713                                        Interf.O.membusy<='1';         
    700                                                                        
     714                                        Interf.S.GStart<=(others=>'0');                         
    701715                        end if;
    702716        elsif NextCtx=2 then
     
    705719                                        SysRam.O.ena<='1';
    706720                                        SysRam.O.enb<='0';
    707                                         SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
     721                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
    708722                                        SysRam.O.Data_in<=x"01";
    709723                                        NextCtx:=NextCtx+1;
     
    718732 end procedure;
    719733procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
     734variable adresse :natural;
     735variable wcount: natural range 0 to 255:=0;
     736variable LRam : typ_dpRam;
     737variable SyncDest : natural range 0 to 15; --destination du message de synchronisation
     738variable W0 :std_logic_vector(Word-1 downto 0);
     739variable wcompl_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
     740
    720741begin
     742  --
     743  --pMPI_Win_Wait(NextCtx, Interf, SysRam, Win );
     744                                wcompl_adr:=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
     745                                LRam:=SysRam; -- nécessaire pour le débogage
     746                                if NextCtx =0 then
     747                                       
     748                                        SysRam.O.we<='1';
     749                                        SysRam.O.ena<='1';
     750                                        SysRam.O.enb<='0';
     751                                        Interf.S.IntState1<=0;
     752                                        NextCtx:=1;
     753                                        adresse:=core_wcompl_adr;
     754                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     755                                        Interf.O.Instr_En<='0';
     756                                       
     757                                elsif NextCtx=1 then --écriture du ptr d'intruction
     758                                        SysRam.O.we<='1';
     759                                        SysRam.O.ena<='1';
     760                                        SysRam.O.enb<='0';
     761                                        if interf.I.ramsel='0' then
     762                                       
     763                                        adresse:=core_wcompl_adr;
     764                               
     765                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     766                                        Interf.O.Instr_En<='0';
     767                                        Interf.O.membusy<='1';
     768                                       
     769                                  wcount:=Interf.S.IntState1;
     770          WritePtr (wcompl_adr,wcount,SysRam);
     771          Interf.S.IntState1<=wcount;
     772         
     773            if wcount =4 then
     774                  NextCtx:=2;
     775                  Interf.S.IntState1<=0;
     776                  Interf.S.IntState2<=0;
     777                  Interf.S.tmem(0)<=Interf.S.GStart(7 downto 0); --cibles impactées
     778                  Interf.S.tmem(1)<=Interf.S.GStart(15 downto 8); --cibles impactées
     779                  adresse:=core_wcompl_adr;
     780                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     781            end if;             
     782         end if;       
     783                                elsif NextCtx=2 then
     784                                        SysRam.O.we<='1';
     785                                        SysRam.O.ena<='1';
     786                                        SysRam.O.enb<='0';
     787                                  adresse:=core_wcompl_adr;
     788                                  NextCtx:=9; --aller à la fin de la fonction
     789                                  for i in interf.s.intState2 to 7 loop
     790                                  if interf.s.gstart(i)='1' then
     791                                        SysRam.O.Data_in<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
     792                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     793                                        Interf.S.tmem(0)(i)<='0'; --ce dest a été traité !
     794                                        NextCtx:=3;
     795                                        Interf.S.IntState2<=i+1;
     796                                        exit;
     797                                        end if;
     798                                        end loop;
     799                                elsif NextCtx=3 then
     800                                        SysRam.O.we<='1';
     801                                        SysRam.O.ena<='1';
     802                                        SysRam.O.enb<='0';
     803                                  adresse:=core_wcompl_adr+1;
     804                                        SysRam.O.Data_in<= x"04" ;
     805                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     806                                        NextCtx:=NextCtx+1;
     807                                elsif NextCtx=4 then
     808                                        SysRam.O.we<='1';
     809                                        SysRam.O.ena<='1';
     810                                        SysRam.O.enb<='0';
     811                                        adresse:=core_wcompl_adr+2;
     812                                  Interf.O.Instruction<=x"04";--longueur de l'instruction
     813                                        SysRam.O.Data_in<=x"00" ;--
     814                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     815                                        NextCtx:=5;
     816                                elsif NextCtx=5 then
     817                                        SysRam.O.we<='1';
     818                                        SysRam.O.ena<='1';
     819                                        SysRam.O.enb<='0';
     820                                  adresse:=core_wcompl_adr+3;
     821                                        SysRam.O.Data_in<= SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
     822                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     823                                        NextCtx:=6;
     824                                elsif NextCtx=6 then
     825                                        SysRam.O.we<='1';
     826                                        SysRam.O.ena<='1';
     827                                        SysRam.O.enb<='0';
     828                                  adresse:=core_wcompl_adr+3;
     829                                        SysRam.O.Data_in<=SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
     830                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     831                                        NextCtx:=7;
     832
     833                                elsif NextCtx=7 then --fin de la fonction
     834                                                        SysRam.O.we<='0';
     835                                                        SysRam.O.ena<='0';
     836                                                        SysRam.O.enb<='1';
     837                                                        --dcount:=0;
     838                                                        Interf.O.membusy<='0';
     839                                                        Interf.O.Instr_En<='1';
     840                                                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr+5,AdrLen));
     841                                                        NextCtx:=8;
     842                                elsif NextCtx=8 then --acquittement de la copie des données dans le tampon
     843                                                        if Interf.I.Instr_ack='1' then
     844                                                                Interf.O.Instr_En<='0';
     845                                                                NextCtx:=9;
     846                                                        end if;
     847                                                        SysRam.O.we<='0';
     848                                                        SysRam.O.ena<='0';
     849                                                        SysRam.O.enb<='1';
     850                                                       
     851                                elsif NextCtx=9 then --lecture de la fin de WComplete
     852                                                        SysRam.O.we<='0';
     853                                                        SysRam.O.ena<='0';
     854                                                        SysRam.O.enb<='1';
     855                                                       
     856                                                        if interf.S.IntState2=0 then --aucune instruction MPI exécutée ?
     857                                                         
     858                                                        elsif Interf.S.tmem(0)/=0 then --plus de message compl à envoyer
     859                                                           NextCtx:=2;
     860                                                         elsif Interf.S.tmem(0)=0 then
     861                                                           if interf.I.ramsel='0' then
     862                                                               NextCtx:=10;
     863                                                                   SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
     864                                                           end if;
     865                                                         end if;
     866                                elsif NextCtx=10 then --test de la fin des transferts
     867                                        if interf.I.ramsel='0' then
     868                                                SysRam.O.we<='0';
     869                                                SysRam.O.ena<='0';
     870                                                SysRam.O.enb<='1';
     871                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
     872                                                                if SysRam.I.Data_out(0)='1' and  SysRam.I.Data_out(6)='0' then --si WStart=1 et Wbusy=0
     873                                                                  --il faut un DSent=1 pour Put ou un DSending pour Get
     874                                                                                if SysRam.I.Data_out(5)='1' or  (SysRam.I.Data_out(4)='1' and SysRam.I.Data_out(1)='1')  then
     875                                                                                                NextCtx:=NextCtx+1;
     876                                                                                end if;
     877                                                                        end if;                                                                 
     878                               
     879                                        end if;
     880                                elsif NextCtx=11 then
     881                                                                        Interf.S.IntState1<=0; -- initialisation du compteur d'état
     882                                                                Interf.S.IntState2<=0;
     883                                                                NextCtx:=0; --fin de la fonction                       
     884      end if;
    721885
    722886end procedure;
     
    725889-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
    726890--chacune de ces cibles
     891 variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
     892 variable dcount : natural range 0 to 255:=0;
     893 variable cstatus : std_logic_vector(Word-1 downto 0);
    727894 begin
     895
     896 -- retour de l'adresse de de la fenêtre dans la structure Win
     897 -- initialisation des bits concernant
     898 if Win.id =0 then
     899   W_ptr:=Core_Base_Adr+4;
     900 end if;
     901 if NextCtx =0 then
     902                        NextCtx:=NextCtx+1;
     903                        if pgroup.grp=0 then --rien à faire
     904                          nextCtx:=5;
     905                          Interf.S.GPost<=(others=>'0');
     906                        end if;
     907                elsif NextCtx=1 then
     908                        if interf.I.ramsel='0' then
     909                                        SysRam.O.we<='1';
     910                                        SysRam.O.ena<='1';
     911                                        SysRam.O.enb<='0';
     912                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
     913                                        SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits     
     914                                                       
     915                                        NextCtx:=NextCtx+1;
     916                                        Interf.O.membusy<='1';         
     917                                                                       
     918                        end if;
     919                         --limitation de cete version à 16 rang
     920                                Interf.S.GPost<=pgroup.grp;
     921        elsif NextCtx=2 then
     922                        if interf.I.ramsel='0' then
     923                                        SysRam.O.we<='1';
     924                                        SysRam.O.ena<='1';
     925                                        SysRam.O.enb<='0';
     926                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
     927                                        SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits     
     928                                                       
     929                                        NextCtx:=NextCtx+1;
     930                                        Interf.O.membusy<='1';         
     931                                                                       
     932                        end if;                                         
     933        elsif NextCtx=3 then
     934                        if interf.I.ramsel='0' then
     935                                        SysRam.O.we<='1';
     936                                        SysRam.O.ena<='1';
     937                                        SysRam.O.enb<='0';
     938                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_Ptr+W_Gpost,Adrlen));
     939                                        SysRam.O.Data_in<=pgroup.grp(7 downto 0);
     940                                        NextCtx:=NextCtx+1;
     941                                        Interf.O.membusy<='1'; 
     942                        end if;
     943elsif NextCtx=4 then
     944                        if interf.I.ramsel='0' then
     945                                        SysRam.O.we<='1';
     946                                        SysRam.O.ena<='1';
     947                                        SysRam.O.enb<='0';
     948                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
     949                                        SysRam.O.Data_in<=pgroup.grp(15 downto 8);
     950                                        NextCtx:=NextCtx+1;
     951                                        Interf.O.membusy<='1'; 
     952                        end if;
     953elsif NextCtx=6 then
     954                        if interf.I.ramsel='0' then
     955                                        SysRam.O.we<='1';
     956                                        SysRam.O.ena<='1';
     957                                        SysRam.O.enb<='0';
     958                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
     959                                        SysRam.O.Data_in<=pgroup.grp(15 downto 8);
     960                                        NextCtx:=NextCtx+1;
     961                                        Interf.O.membusy<='1'; 
     962                        end if;
     963        elsif NextCtx=5 then
     964                 SysRam.O.we<='0';
     965                                        SysRam.O.ena<='0';
     966                                        SysRam.O.enb<='0';
     967                NextCtx:=0;
     968                Interf.O.membusy<='0';
     969        end if;
     970
    728971 
    729972 end procedure;
     
    733976variable dcount : natural range 0 to 255:=0;
    734977variable cstatus : std_logic_vector(Word-1 downto 0);
    735 
     978variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
    736979begin
    737 
    738        
    739        
     980        W_Ptr:=Core_base_adr+4;--adresse du reg status de la première fenêtre
    740981                if NextCtx =0 then
    741982                        NextCtx:=NextCtx+1;
     
    745986                                        SysRam.O.ena<='0';
    746987                                        SysRam.O.enb<='1';
    747                                         SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
    748                                                         if (SysRam.I.Data_out(5)='1' and  SysRam.I.Data_out(4)='1') and SysRam.I.Data_out(2)='0' and  SysRam.I.Data_out(1)='0' then
    749                                                                         NextCtx:=NextCtx+1;
    750                                                         end if;                                                 
     988                                        NextCtx:=NextCtx+1;
    751989                        end if;
     990                             SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
     991            If Interf.S.Gpost=0 then
     992             NextCtx:=9; --rien à synchroniser
     993          end if;
     994  elsif (NextCtx>=2) and (NextCtx <=7) then
     995    if interf.I.ramsel='0' then
     996                                        SysRam.O.we<='0';
     997                                        SysRam.O.ena<='0';
     998                                        SysRam.O.enb<='1';
     999                                        SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
     1000                                        NextCtx:=NextCtx+1;
     1001                else
     1002                    NextCtx:=1;
     1003                   end if;
     1004                elsif NextCtx=8 then
     1005                        if interf.I.ramsel='0' then
     1006                                        SysRam.O.we<='0';
     1007                                        SysRam.O.ena<='0';
     1008                                        SysRam.O.enb<='1';
     1009                                        SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
     1010                                                               
     1011                                                        if SysRam.I.Data_out(3)='1' and SysRam.I.Data_out(6)='0' then --si WPost=1 et WBusy=0
     1012                                                          --il faut un DSent=1 pour Put ou un DSending pour Get
     1013                                                           if SysRam.I.Data_out(4)='1' or  (SysRam.I.Data_out(5)='1' and SysRam.I.Data_out(2)='1')  then
     1014                                                                           NextCtx:=NextCtx+1;
     1015                                                                           Interf.S.GPost<=(others=>'0');
     1016                                                           end if;     
     1017                                                        elsif SysRam.I.Data_out(3)='0' then
     1018                                                                  NextCtx:=NextCtx; --pas d'opérations en attente
     1019                                                        else
     1020                                                          NextCtx:=NextCtx; --on attend
     1021                                                        end if;                         
     1022                        end if;
    7521023       
    753         elsif NextCtx=2 then
    754                
    755                 NextCtx:=0;
     1024        elsif NextCtx=9 then
     1025                      SysRam.O.we<='0';
     1026                                        SysRam.O.ena<='0';
     1027                                        SysRam.O.enb<='0';
     1028                                        Interf.O.membusy<='0';
     1029                      NextCtx:=0;
    7561030        end if;
    7571031
     
    9521226         end if;       
    9531227                                elsif NextCtx=2 then
    954                                         SysRam.O.we<='1';
    955                                         SysRam.O.ena<='1';
    956                                         SysRam.O.enb<='0';
    957                                   adresse:=core_init_adr;
    958                                         SysRam.O.Data_in<=MPI_INIT & x"0" ;
    959                                         SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    960                                         NextCtx:=3;
     1228                                  if interf.I.ramsel='0' then
     1229                                           SysRam.O.we<='1';
     1230                                           SysRam.O.ena<='1';
     1231                                           SysRam.O.enb<='0';
     1232                                      adresse:=core_init_adr;
     1233                                           SysRam.O.Data_in<=MPI_INIT & x"0" ;
     1234                                           SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
     1235                                           NextCtx:=3;
     1236                                           Interf.O.membusy<='1';
     1237                                        end if;
    9611238                                elsif NextCtx=3 then
    962                                         SysRam.O.we<='1';
    963                                         SysRam.O.ena<='1';
    964                                         SysRam.O.enb<='0';
     1239                                  if Interf.I.ramSel='0' then
     1240                                        SysRam.O.we<='1';
     1241                                        SysRam.O.ena<='1';
     1242                                        SysRam.O.enb<='0';
     1243                                        Interf.O.membusy<='1';
    9651244                                  adresse:=core_init_adr+1;
    9661245                                        SysRam.O.Data_in<= x"04" ;
    9671246                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    9681247                                        NextCtx:=NextCtx+1;
     1248                                        end if;
    9691249                                elsif NextCtx=4 then
    970                                         SysRam.O.we<='1';
    971                                         SysRam.O.ena<='1';
    972                                         SysRam.O.enb<='0';
    973                                         adresse:=core_init_adr+2;
     1250                                  if Interf.I.ramSel='0' then
     1251                                        SysRam.O.we<='1';
     1252                                        SysRam.O.ena<='1';
     1253                                        Interf.O.membusy<='1';
     1254                                        SysRam.O.enb<='0';
     1255                                        adresse:=core_init_adr+1;
    9741256                                  Interf.O.Instruction<=x"04";
    975                                         SysRam.O.Data_in<=x"00" ;--longueur de l'instruction
     1257                                        SysRam.O.Data_in<=x"04" ;--longueur de l'instruction
    9761258                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    9771259                                        NextCtx:=5;
     1260                                        end if;
    9781261                                elsif NextCtx=5 then
    979                                         SysRam.O.we<='1';
    980                                         SysRam.O.ena<='1';
    981                                         SysRam.O.enb<='0';
    982                                   adresse:=core_init_adr+3;
     1262                                  if Interf.I.ramSel='0' then
     1263                                        SysRam.O.we<='1';
     1264                                        SysRam.O.ena<='1';
     1265                                        Interf.O.membusy<='1';
     1266                                        SysRam.O.enb<='0';
     1267                                  adresse:=core_init_adr+2;
    9831268                                        SysRam.O.Data_in<= x"00" ;
    9841269                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    9851270                                        NextCtx:=6;
     1271                                        end if;
    9861272                                elsif NextCtx=6 then
    987                                         SysRam.O.we<='1';
    988                                         SysRam.O.ena<='1';
    989                                         SysRam.O.enb<='0';
     1273                                  if Interf.I.ramSel='0' then
     1274                                        SysRam.O.we<='1';
     1275                                        SysRam.O.ena<='1';
     1276                                        SysRam.O.enb<='0';
     1277                                        Interf.O.membusy<='1';
    9901278                                  adresse:=core_init_adr+3;
    9911279                                        SysRam.O.Data_in<=x"00" ;
    9921280                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
    9931281                                        NextCtx:=7;
    994 
     1282        end if;
    9951283                                elsif NextCtx=7 then --fin de la fonction
    9961284                                                        SysRam.O.we<='0';
    9971285                                                        SysRam.O.ena<='0';
    9981286                                                        SysRam.O.enb<='1';
     1287                                                        Interf.O.membusy<='0';
    9991288                                                        dcount:=0;
    10001289                                                        Interf.O.membusy<='0';
Note: See TracChangeset for help on using the changeset viewer.