PCI总线仲裁器的设计与实现
-- 输出
PCIgntN[3..0] :OUTPUT -- 总线占用允许信号
)
frameN和irdyN决定了总线的状态,只要两个信号中的一个有效,就表明总线上有数据通过,总线处于忙状态;当两个信号都无效时,则总线处于空闲状态。
2. 仲裁器状态机定义
parb_sm : MACHINE
OF BITS ( PARB2 , PARB1 , PARB0 )
WITH STATES (
PARB_SLT0 = 0, -- PCIgnt0#有效,设备0拥有总线使用权,总线空闲
PARB_SLT0D = 1, -- PCIgnt0#有效,数据在总线上传输,总线处于忙状态
P
ARB_SLT1 = 2, -- 以下类同
PARB_SLT1D = 3,
PARB_SLT2 = 4,
PARB_SLT2D = 5,
PARB_SLT3 = 6,
PARB_SLT3D = 7 );
3. 仲裁的实现
由于采用循环算法,对每一个设备而言状态的变换都是相同的,下面仅以设备0的状态转换为例:
CASE parb_sm IS
WHEN PARB_SLT0 =>
IF ( !frameN # !irdyN # frameN & irdyN & PARBtout4 ) THEN
IF ( !PCIreqN1 ) THEN
PCIgntN1 = GND;
parb_sm = PARB_SLT1D;
ELSIF ( !PCIreqN2 ) THEN
PCIgntN2 = GND;
parb_sm = PARB_SLT2D;
ELSIF ( !PCIreqN3 ) THEN
PCIgntN3 = GND;
parb_sm = PARB_SLT3D;
ELSE
PCIgntN0 = GND;