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

📄 tg32pci.vhd

📁 pci CORES 从外国网站上弄下来的
💻 VHD
📖 第 1 页 / 共 5 页
字号:
    elsif (cmdBusReady'Event and cmdBusReady = '1') then
       TrnArnd <= '0';
    elsif (CLK'Event and CLK = '0') then
       if Busy = '0' and DevAddr = '1' then  -- deselect
          DEVSEL_N <= 'H';
          STOP_N   <= '1'; 
       elsif DevAddr = '0' then  -- deselect device
          DEVSEL_N <= 'Z';
          STOP_N   <= 'Z';
       end if;
    elsif (CLK'Event and CLK = '1') then
       if ResFin = '1' then    -- memory reserved mode command
          if MemWrite = '1' then  -- master writes to target memory
             if TRDY_N = '0' and IRDY_N = '0' then
                Busy   <= '0';
                ResFin <= '0';
             end if;
          elsif MemRead = '1' then  -- master reads from target memory
             if TrnArnd = '0' and TRDY_N = '0' and IRDY_N = '0' then
                Busy   <= '0';
                ResFin <= '0';
             end if;
          end if;
       end if;
       if devdel = true then
          if devtype = "Medi" then
             if counter = 0 then
                DEVSEL_N <= '0' after 8 ns;
                Stop_N   <= '1' after 10 ns;
                devdel := false;
             end if;
          elsif devtype = "Slow" then
             if counter = 1 then
                DEVSEL_N <= '0' after 8 ns;
                Stop_N   <= '1' after 10 ns;
                devdel := false;
             else
                counter := counter + 1;
             end if;
          end if;
       end if;
       if FRAME_N = '1' then    -- end of cycle
          assert (IRDY_N = '0')
            report "Target device : FRAME signal deassertion error. IRDY is not asserted."
            severity Error;
          if TRDY_N = '0' and IRDY_N = '0' then  -- finish the current cycle
             Busy <= '0';
          end if;
       elsif FrameEv = '1' then -- decoding
          FrameEv <= '0';
          assert (FRAME_N'Last_Event >= tsetup)
            report "Target device : Frame setup time violation in decode cycle!"
            severity warning;
          assert (AD_Bus'Last_Event >= tsetup)
            report "Target device : Address setup time violation in decode cycle!"
            severity warning;
          assert (C_BE_Bus'Last_Event >= tsetup)
            report "Target device : Command setup time violation in decode cycle!"
            severity warning;
          addr := AD_Bus;
          case C_BE_Bus is           -- decoding the command bus
               when "0001" => -- Special Cycle! Used to transfer from master device the 
                              -- wait states parameters
                   if (addr(31 downto 8) = bacfg(31 downto 8) and IDSEL ='1') then
                      WaitWrite <= '1';
                      DevAddr  <= '1';
                      Busy <= '1';
                      trdywaits := true;
                   else        -- this device is not the addressed one,
                      DevAddr  <= '0';   -- so it is not responding
                      trdywaits := false;
                   end if;
                   cfgaddr := Byte2Int(addr(7 downto 0));
               when "0010" => -- I/O Read! Master reads from target device.
                   if addr(31 downto 8) = baio(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       IORead <= '1';
                       TrnArnd <= '1';
                       ioaddr := Byte2Int(addr(7 downto 0));
                   else          -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "0011" => -- I/O Write! Master writes to target device.
                   if addr(31 downto 8) = baio(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       IOWrite <= '1';
                       ioaddr := Byte2Int(addr(7 downto 0));
                   else        -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "1100" => -- Memory Read! Master reads from target device.
                   if addr(31 downto 8) = bamem(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       MemRead <= '1';
                       TrnArnd <= '1';
                       if addr(1 downto 0) = "01" then    -- reserved mode                  
                          ResFin <= '1';
                       elsif addr(1 downto 0) = "11" then -- reserved mode
                          ResFin <= '1';
                       end if;
                       memaddr := Byte2Int(addr(7 downto 0));
                   else     -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "1110" => -- Memory Read Line! Master reads from target device.
                   if addr(31 downto 8) = bamem(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       MemRead <= '1';
                       TrnArnd <= '1';
                       if addr(1 downto 0) = "01" then    -- reserved mode                  
                          ResFin <= '1';
                       elsif addr(1 downto 0) = "11" then -- reserved mode
                          ResFin <= '1';
                       end if;
                       memaddr := Byte2Int(addr(7 downto 0));
                   else     -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "1111" => -- Memory Write! Master writes to target device.
                   if addr(31 downto 8) = bamem(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       MemWrite <= '1';
                       if addr(1 downto 0) = "01" then    -- reserved mode                  
                          ResFin <= '1';
                       elsif addr(1 downto 0) = "11" then -- reserved mode
                          ResFin <= '1';
                       end if;
                       memaddr := Byte2Int(addr(7 downto 0));
                   else      -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "0110" => -- Memory Read! Master reads from target device.
                   if addr(31 downto 8) = bamem(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       MemRead <= '1';
                       TrnArnd <= '1';
                       if addr(1 downto 0) = "01" then    -- reserved mode                  
                          ResFin <= '1';
                       elsif addr(1 downto 0) = "11" then -- reserved mode
                          ResFin <= '1';
                       end if;
                       memaddr := Byte2Int(addr(7 downto 0));
                   else     -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "0111" => -- Memory Write! Master writes to target device.
                   if addr(31 downto 8) = bamem(31 downto 8) then
                       DevAddr <= '1';
                       Busy <= '1';
                       MemWrite <= '1';
                       if addr(1 downto 0) = "01" then    -- reserved mode                  
                          ResFin <= '1';
                       elsif addr(1 downto 0) = "11" then -- reserved mode
                          ResFin <= '1';
                       end if;
                       memaddr := Byte2Int(addr(7 downto 0));
                   else      -- this device is not the addressed one,
                       DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "1010" => -- Configuration Read! Master reads from target device.
                   if (addr(31 downto 8) = bacfg(31 downto 8) and IDSEL = '1') then
                      if addr(1 downto 0) = "01" then
                         report "Target device: Type 1 configuration access on bus! Ignored."
                         severity Note;
                      elsif addr(1 downto 0) = "00" then
                         CfgRead <= '1';
                         TrnArnd <= '1';
                         DevAddr <= '1';
                         Busy <= '1';
                      end if;
                      cfgaddr := Byte2Int(addr(7 downto 0));
                   else       -- this device is not the addressed one,
                      DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "1011" => -- Configuration Write! Master writes to target device.
                   if (addr(31 downto 8) = bacfg(31 downto 8) and IDSEL = '1') then
                      if addr(1 downto 0) = "01" then
                         report "Target device: Type 1 configuration access on bus! Ignored."
                         severity Note;
                      elsif addr(1 downto 0) = "00" then
                         CfgWrite <= '1';
                         DevAddr <= '1';
                         Busy <= '1';
                      end if;
                      cfgaddr := Byte2Int(addr(7 downto 0));
                   else
                             -- this device is not the addressed one,
                      DevAddr  <= '0';   -- so it is not responding
                   end if;
               when "0100" =>
                  report "Target device: Reserved Command detected on C/BE bus! Target will not respond."
                  severity Warning;
               when "0101" =>
                  report "Target device: Reserved Command detected on C/BE bus! Target will not respond."
                  severity Warning;
               when "1000" =>
                  report "Target device: Reserved Command detected on C/BE bus! Target will not respond."
                  severity Warning;
               when "1001" =>
                  report "Target device: Reserved Command detected on C/BE bus! Target will not respond."
                  severity Warning;
               when "ZZZZ" => null;
               when others =>
                  report "Target device: Unknown or invalid command on C/BE bus! Ignored."
                  severity Error;
             end case;
       end if;
    -- elsif (Frame_N'Event and Frame_N = '1') then
    end if;
  end process;
  ---------------------------------------------------------------------
  -- Implementation of Write command. 
  -- Master writes to Target device.
  --------------------------------------------------------------------- 
  WriteProc : process(CLK,RST_N)
      variable waitreg : Std_Logic_Vector(15 downto 0) := x"0000";
      variable Char3_2,Char1,Char0 : Std_Logic_Vector(7 downto 0) := x"00";
  begin
     if (CLK'Event and CLK = '1' and ((IRDY_N = '0' and TRDY_N = '0') or FRAME_N = '1')) then
        assert (AD_Bus'Last_Event >= tsetup)
          report "Target device : Data setup time violation in decode cycle!"
          severity warning;
        assert (C_BE_Bus'Last_Event >= tsetup)
          report "Target device : Byte Enables setup time violation in decode cycle!"
          severity warning;
        if (WaitWrite = '1') then
           Char3_2 := AD_Bus(15 downto 8);
           Char1   := "0000" & AD_Bus(7 downto 4);
           Char0   := "0000" & AD_Bus(3 downto 0);
           trdy_loop := Byte2Int(Char3_2) ;	
           trdy_nr   := Byte2Int(Char1); -- + 1;
           trdy_st   := Byte2Int(Char0);

⌨️ 快捷键说明

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