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

📄 pci_arb.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 2 页
字号:
------------------------------------------------------------------------------  This file is a part of the LEON VHDL model--  Copyright (C) 1999  European Space Agency (ESA)----  This library is free software; you can redistribute it and/or--  modify it under the terms of the GNU Lesser General Public--  License as published by the Free Software Foundation; either--  version 2 of the License, or (at your option) any later version.----  See the file COPYING.LGPL for the full details of the license.--============================================================================---- Design unit  : pci_arb---- File name    : pci_arb.vhd---- Purpose      : Arbiter for the PCI bus--                - configurable size: 4, 8, 16, 32 agents--                - nested round-robbing in two different priority levels--                - priority assignment hard-coded or APB-programmable---- Reference    : PCI Local Bus Specification, Revision 2.1,--                PCI Special Interest Group, 1st June 1995--                (for information: http:-- Reference    : AMBA(TM) Specification (Rev 2.0), ARM IHI 0011A,--                13th May 1999, issue A, first release, ARM Limited--                The document can be retrieved from http:---- Note         : Numbering for req_n, gnt_n, or priority levels is in--                increasing order <0 = left> to <NUMBER-1 = right>.--                APB data/address arrays are in the conventional order:--                The least significant bit is located to the--                right, carrying the lower index number (usually 0).--                The arbiter considers strong signal levels ('1' and '0')--                only. Weak levels ('H', 'L') are not considered. The--                appropriate translation function (to_X01) must be applied--                to the inputs. This is usually done by the pads,--                and therefore not contained in this model.---- Configuration: The arbiter can be configured to NB_AGENTS = 4, 8, 16 or 32.--                A priority level (0 = high, 1 = low) is assigned to each device.--                Exception is agent NB_AGENTS-1, which has always lowest priority.----                a) The priority levels are hard-coded, when APB_PRIOS = false.--                In this case, the APB ports (pbi/pbo) are unconnected.--                The constant ARB_LVL_C must then be set to appropriate values.----                b) When APB_PRIOS = true, the levels are programmable via the--                APB-address 0x80 (allows to be ored with the PCI interface):--                Bit 31 (leftmost) = master 31 . . bit 0 (rightmost) = master 0.--                Bit NB_AGENTS-1 is dont care at write and reads 1.--                Bits NB_AGENTS to 31, if existing, are dont care and read 0.--                The constant ARB_LVL_C is then the reset value.---- Algorithm    : The algorithm is described in the implementation note of--                section 3.4 of the PCI standard:--                The bus is granted by two nested round-robbing loops.--                An agent number and a priority level is assigned to each agent.--                The agent number determines, the pair of req_n/gnt_n lines.--                Agents are counted from 0 to NB_AGENTS-1.--                All agents in one level have equal access to the bus--                (round-robbing); all agents of level 1 as a group have access--                equal to each agent of level 0.--                Re-arbitration occurs, when frame_n is asserted, as soon--                as any other master has requested the bus, but only--                once per transaction.----                b) With programmable priorities. The priority level of all--                   agents (except NB_AGENTS-1) is  programmable via APB.--                   In a 256 byte APB address range, the priority level of--                   agent N is accessed via the address 0x80 + 4*N. The APB--                   slave returns 0 on all non-implemented addresses, the--                   address bits (1:0) are not decoded. Since only addresses--                   >= 0x80 are occupied, it can be used in parallel (ored--                   read data) with our PCI interface (uses <= 0x78).--                   The constant ARB_LVL_C in pci_arb_pkg is the reset value.---- Timeout:       The "broken master" timeout is another reason for--                re-arbitration (section 3.4.1 of the standard). Grant is--                removed from an agent, which has not started a cycle--                within 16 cycles after request (and grant). Reporting of--                such a 'broken' master is not implemented.---- Turnover:      A turnover cycle is required by the standard, when re---                arbitration occurs during idle state of the bus.--                Notwithstanding to the standard, "idle state" is assumed,--                when frame_n is high for more than 1 cycle.---- Bus parking  : The bus is parked to agent 0 after reset, it remains granted--                to the last owner, if no other agent requests the bus.--                When another request is asserted, re-arbitration occurs--                after one turnover cycle.---- Lock         : Lock is defined as a resource lock by the PCI standard.--                The optional bus lock mentioned in the standard is not--                considered here and there are no special conditions to--                handle when lock_n is active.--                in arbitration.---- Latency      : Latency control in PCI is via the latency counters of each--                agent. The arbiter does not perform any latency check and--                a once granted agent continues its transaction until its--                grant is removed AND its own latency counter has expired.--                Even though, a bus re-arbitration occurs during a--                transaction, the hand-over only becomes effective,--                when the current owner deasserts frame_n.---- Limitations  : [add here known bugs and limitations]---- Library      : work---- Dependencies : LEON config package--                package amba, can be retrieved from:--                http:---- Author       : Roland Weigand  <Roland.Weigand@gmx.net>--                European Space Agency (ESA)--                Microelectronics Section (TOS-ESM)--                P.O. Box 299--                NL-2200 AG Noordwijk ZH--                The Netherlands---- Contact      : mailto:microelectronics@estec.esa.int--                http:-- Copyright (C): European Space Agency (ESA) 2002.--                This source code is free software; you can redistribute it--                and/or modify it under the terms of the GNU Lesser General--                Public License as published by the Free Software Foundation;--                either version 2 of the License, or (at your option) any--                later version. For full details of the license see file--                http:----                It is recommended that any use of this VHDL source code is--                reported to the European Space Agency. It is also recommended--                that any use of the VHDL source code properly acknowledges the--                European Space Agency as originator.-- Disclaimer   : All information is provided "as is", there is no warranty that--                the information is correct or suitable for any purpose,--                neither implicit nor explicit. This information does not--                necessarily reflect the policy of the European Space Agency.---- Simulator    : Modelsim 5.5e on Linux RedHat 7.2---- Synthesis    : Synopsys Version 1999.10 on Sparc + Solaris 5.5.1------------------------------------------------------------------------------------ Version  Author   Date       Changes---- 0.0      R. W.    2000/11/02 File created-- 0.1      J.Gaisler     2001/04/10   Integrated in LEON-- 0.2      R. Weigand    2001/04/25   Connect arb_lvl reg to AMBA clock/reset-- 0.3      R. Weigand    2002/03/19   Default assignment to owneri in find_next-- 1.0      RW.           2002/04/08   Implementation of TMR registers--                                     Removed recursive function call--                                     Fixed ARB_LEVELS = 2-- 3.0      R. Weigand    2002/04/16   Released for leon2-- 4.0      M. Isomaki    2004/10/19   Minor changes for GRLIB integration-- 4.1      J.Gaisler     2004/11/17   Minor changes for GRLIB integration--$Log$-- Revision 3.1  2002/07/31 13:22:09  weigand-- Bugfix for cases where no valid request in level 0 (level 1 was not rearbitrated)---- Revision 3.0  2002/07/24 12:19:38  weigand-- Installed RCS with version 3.0--------------------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;library grlib;use grlib.stdlib.all;library esa;use esa.pci_arb_pkg.all;entity pci_arb is   generic(NB_AGENTS : integer  := 4;	   ARB_SIZE  : integer  := 2;	   APB_EN    : integer  := 1	   );   port (clk     : in  clk_type;                            -- clock         rst_n   : in  std_logic;                           -- async reset active low         req_n   : in  std_logic_vector(0 to NB_AGENTS-1);  -- bus request         frame_n : in  std_logic;         gnt_n   : out std_logic_vector(0 to NB_AGENTS-1);  -- bus grant         pclk    : in  clk_type;                            -- APB clock         prst_n  : in  std_logic;                           -- APB reset         pbi     : in  EAPB_Slv_In_Type;                     -- APB inputs         pbo     : out EAPB_Slv_Out_Type                     -- APB outputs         );end pci_arb;architecture rtl of pci_arb is   subtype agent_t is std_logic_vector(ARB_SIZE-1 downto 0);   subtype arb_lvl_t is std_logic_vector(NB_AGENTS-1 downto 0);   subtype agentno_t is integer range 0 to NB_AGENTS-1;   -- Note: the agent with the highest index (3, 7, 15, 31) is always in level 1   -- Example: x010 = prio 0 for agent 2 and 0, prio 1 for agent 3 and 1.   -- Default: start with all devices equal priority at level 1.   constant ARB_LVL_C : arb_lvl_t := (others => '1');   constant all_ones : std_logic_vector(0 to NB_AGENTS-1) := (others => '1');

⌨️ 快捷键说明

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