⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datapath_struct.vhd

📁 Intel微处理器8088的VHDL实现
💻 VHD
📖 第 1 页 / 共 2 页
字号:
                   selds<='1';
         when   "010" => if   xmod="11" then eam_s <=   dx_s;
                             else eam_s <=   bp_s + si_s   + disp;  
                         end if;     
                   selds<='0';                 
         when   "011" => if   xmod="11" then eam_s <=   bx_s;
                             else eam_s <=   bp_s + di_s   + disp;   
                   end if;
                   selds<='0';
         when   "100" => if   xmod="11" then eam_s <=   sp_s;        
                             else eam_s <=   si_s + disp; 
                        end if;          
                   selds<='1';
         when   "101" => if   xmod="11" then eam_s <=   bp_s;
                             else eam_s <=   di_s + disp;      
                   end if;
                   selds<='1';
         when   "110" => if   xmod="00" then 
                     eam_s <= disp;
                     selds <='1';
                   elsif xmod="11" then 
                     eam_s <= si_s;   
                     selds <='1';         
                   else 
                     eam_s <= bp_s +   disp; 
                     selds <='0';                  -- Use SS  
                   end if;
                   
         when   others=> if   xmod="11" then eam_s <=   di_s;
                             else eam_s <=   bx_s + disp;   
                   end if;             
                   selds<='1';    
       end case;
   end   process;
   
   ea<=eam_s;

   -- HDL Embedded Text Block 6 eb5
   -- eb5 6            
   abusdp_out <= (segbus&"0000") + ("0000"&eabus); -- 20 bits address e.g. CS:IP

   -- HDL Embedded Text Block 7 simux
   -- simux 7 
   process(data_in,eabus,alubus,mdbus_in,simux) 
      begin
         case simux is 
            when "00"   => sibus <= data_in;  
            when "01"   => sibus <= eabus;       
            when "10"   => sibus <= alubus;   
            when others => sibus <= mdbus_in;    
         end case;
   end process;

   
   process(dispmux,nbreq,disp,mdbus_in,ipreg,eabus)               
      begin
      case dispmux is
            when "000"   => ipbus <= ("0000000000000"&nbreq) + ipreg;
            when "001"   => ipbus <= (("0000000000000"&nbreq)+disp) + ipreg;
            when "011"   => ipbus <= disp;          -- disp contains new IP value
            when "100"   => ipbus <= eabus;         -- ipbus=effective address
            when "101"     => ipbus <= ipreg;        -- bodge to get ipreg onto ipbus
            when others  => ipbus <= mdbus_in;  -- (31 downto 16) FIX!!!!only used for "int x" instruction              
      end case;   
   end process;
   

   -- HDL Embedded Text Block 9 eb8
   -- eb8 9         
   domux_s <= eabus(0) & domux;                               
   
   process(domux_s, alubus,ccbus, dibus, ipbus)
      begin
         case domux_s is 
            when "000"  => dbusdp_out <= alubus;   -- Even 
            when "001"  => dbusdp_out <= ccbus;
            when "010"  => dbusdp_out <= dibus;
            when "011"  => dbusdp_out <= ipbus;     -- CALL Instruction
            when "100"  => dbusdp_out <= alubus(7 downto 0)& alubus(15 downto 8); -- Odd
            when "101"  => dbusdp_out <= ccbus(7 downto 0) & ccbus(15 downto 8);
            when "110"  => dbusdp_out <= dibus(7 downto 0) & dibus(15 downto 8);
            when others => dbusdp_out <= ipbus(7 downto 0) & ipbus(15 downto 8);
         end case;
   end process;

   -- HDL Embedded Text Block 10 segoverride
   -- segoverride 10                                        
   
   -- Write Prefix Register
   process(clk,reset)
      begin
           if (reset = '1') then
              opreg_s <= "01";                 -- Default CS Register 
              opflag_s<= '0';                  -- Clear Override Prefix Flag                      
            elsif rising_edge(clk) then            
               if wrop='1' then
                  opreg_s <= segop(1 downto 0);-- Set override register 
                  opflag_s<= '1';              -- segop(2);         -- Set flag
               elsif clrop='1' then
                  opreg_s <= "11";             -- Default Data Segment Register  
                  opflag_s<= '0';                          
               end if;
         end if;
   end process;
   
   process (opflag_s,opreg_s,selds,eamux,segop)
      begin
         if opflag_s='1' and segop(2)='0' then -- Prefix register set and disable override not set?
            opmux <= opreg_s(1 downto 0);      -- Set mux to override prefix reg
         elsif eamux(3)='1' then
             opmux <= eamux(1 downto 0);
         elsif eamux(0)='0' then
            opmux <= "01";                      -- Select CS for IP
         else
            opmux <= '1'&selds;                 -- DS if selds=1 else SS      
         end if;
   end process;

   -- HDL Embedded Text Block 11 drmux
   -- eb9  
   process(dimux, data_in,alubus,mdbus_in,sdbus,eabus) 
      begin
         case dimux is 
            when "000"   => dibus <= data_in;  -- Operand
            when "001"   => dibus <= eabus;     -- Offset  
            when "010"   => dibus <= alubus;   -- Output ALU
            when "011"   => dibus <= mdbus_in; -- Memory Bus
            when others  => dibus <= sdbus;    -- Segment registers
         end case;
   end process;

   -- HDL Embedded Text Block 12 eb9
   ---- eb9 12 Segment Output Mux                              
   int0cs_s <= '1' when eamux(3 downto 1)="011" else '0';
   segsel_s <= iomem & int0cs_s & eamux(2 downto 1) & opmux;      -- 5 bits
             
   process(segsel_s,es_s,cs_s,ss_s,ds_s)         -- Segment Output Mux 
      begin
         case segsel_s is 
            when "000000" => segbus <= es_s;             -- 00**, opmux select register
            when "000001" => segbus <= cs_s;    
            when "000010" => segbus <= ss_s;             
            when "000011" => segbus <= ds_s;          
            when "000100" => segbus <= es_s;             -- 01**, opmux select register
            when "000101" => segbus <= cs_s;    
            when "000110" => segbus <= ss_s;             
            when "000111" => segbus <= ds_s; 
            when "001000" => segbus <= ss_s;             -- 10**=SS, used for PUSH& POP
            when "001001" => segbus <= ss_s;
            when "001010" => segbus <= ss_s;
            when "001011" => segbus <= ss_s;
            when "001100" => segbus <= es_s;             -- 01**, opmux select register
            when "001101" => segbus <= cs_s;    
            when "001110" => segbus <= ss_s;             
            when "001111" => segbus <= ds_s;             
            when others  => segbus <= ZEROVECTOR_C(15 downto 0);-- IN/OUT instruction 0x0000:PORT/DX  
         end case;
   end process;

   -- HDL Embedded Text Block 13 eb10
   -- eb10 13     
   -- Offset Mux          
   process(ipreg,ea,sp_s,dx_s,eamux,si_s,di_s,bx_s,ax_s) 
      begin
         case eamux is 
            when "0000"  => eabus <= ipreg;--ipbus;--ipreg;  
            when "0001"  => eabus <= ea;    
            when "0010"  => eabus <= dx_s;   
            when "0011"  => eabus <= ea + "10";         -- for call mem32/int
            when "0100"  => eabus <= sp_s;               -- 10* select SP_S 
            when "0101"  => eabus <= sp_s;  
            when "0110"  => eabus <= ea(13 downto 0)&"00";             
            when "0111"  => eabus <=(ea(13 downto 0)&"00") + "10"; -- for int   
            when "1000"  => eabus <= di_s;            -- Select ES:DI 
            when "1011"  => eabus <= si_s;            -- Select DS:SI
            when "1001"  => eabus <= ea;              -- added for JMP SI instruction
            when "1111"  => eabus <= bx_s + (X"00"&ax_s(7 downto 0)); -- XLAT instruction
            when others  => eabus <= DONTCARE(15 downto 0);
         end case;
   end process;


   -- Instance port mappings.
   I6 : ALU
      PORT MAP (
         alu_inbusa => alu_inbusa,
         alu_inbusb => alu_inbusb,
         aluopr     => aluopr,
         ax_s       => ax_s,
         clk        => clk,
         cx_s       => cx_s,
         dx_s       => dx_s,
         reset      => reset,
         w          => w,
         wralu      => wralu,
         wrcc       => wrcc,
         wrtemp     => wrtemp,
         alubus     => alubus,
         ccbus      => ccbus,
         div_err    => div_err
      );
   I0 : dataregfile
      PORT MAP (
         dibus      => dibus,
         selalua    => selalua,
         selalub    => selalub,
         seldreg    => seldreg,
         w          => w,
         wrd        => wrd,
         alu_inbusa => alu_inbusa,
         alu_inbusb => alu_inbusb,
         bp_s       => bp_s,
         bx_s       => bx_s,
         di_s       => di_s,
         si_s       => si_s,
         reset      => reset,
         clk        => clk,
         data_in    => data_in,
         mdbus_in   => mdbus_in,
         sp_s       => sp_s,
         ax_s       => ax_s,
         cx_s       => cx_s,
         dx_s       => dx_s
      );
   I9 : ipregister
      PORT MAP (
         clk   => clk,
         ipbus => ipbus,
         reset => reset,
         wrip  => wrip,
         ipreg => ipreg
      );
   I15 : segregfile
      PORT MAP (
         selsreg => selsreg,
         sibus   => sibus,
         wrs     => wrs,
         reset   => reset,
         clk     => clk,
         sdbus   => sdbus,
         dimux   => dimux,
         es_s    => es_s,
         cs_s    => cs_s,
         ss_s    => ss_s,
         ds_s    => ds_s
      );

END struct;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -