📄 pci_arb.vhd
字号:
------------------------------------------------------------------------------ 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 + -