PCI范文10篇

时间:2023-04-11 17:15:47

PCI范文篇1

关键词:PCI总线协议现场可编程门阵列虚拟设备驱动

目前,许多公司都提出了新型的计算机高速总线,如Arapahoe总线标准和HyperTransport技术,但各协议互不兼容,没有形成统一标准。作为传统的通用局部总线,PCI总线仍然占据着主流个人电脑市场,具有顽强的生命力。

现在市面上存在着各种PCI接口芯片,如AMCC公司的S5933,PLX的9080系列等。专用芯片可以实现完整的PCI主设备与从设备模式的接口功能,将复杂的PCI总线接口转化相对简单的用户接口,但系统结构受接口芯片的限制,不能灵活地设计目标系统,且成本较高。本文使用符合PCI电气特性的FPGA芯片进行简化的PCI接口逻辑设计,实现了33MHz、32位数据宽度的PCI从设备模块的接口功能,节约了系统的逻辑资源,且可以将其它用户逻辑集成在同一块芯片,降低了成本,增加了设计的灵活性。另外,还给出了Windows9x系统下的设备驱动程序,可以与应用程序接口,形成一个完整的系统。目前,本系统已经被印染企业应用在数据采集和处理等方面。

1系统构成与功能描述

系统的总体框图如图1所示。

由图1可见,系统的硬件平台为一块PCI卡。此卡的结构十分简洁,主要由FPGA芯片、RAM芯片和输出接口三部分组成。其中,FPGA芯片集成了PCI接口模块和数据处理模块。PCI接口模块实现了33MHz工作时钟、32位总线宽度的接口功能,支持I/O空间、内存空间及配置空间的读写和PCI中断功能。由于简化的PCI接口占用的逻辑资源较少,可在同一块芯片中集成其他用户逻辑。作为一个应用实例,本文加入了一个数据处理模块,对PCI接口传送来的数据进行处理,通过片外的输出接口输出到下位机。RAM芯片为数据处理提供缓存功能。

2从设备模式下的简化PCI协议的实现

为了实现PCI接口的基本功能,必须完成以下几个模块:

(1)PCI配置空间设置。PCI协议支持三种地址空间:I/O空间、内存空间和配置空间。配置空间提供了支持PCI设备自动配置的机制,是必需的。

(2)PCI从设备状态机。PCI总线状态机是具有PCI总线的计算机系统状态流,是由一个已知状态到另一个状态的条件、时序的描述。这是PCI接口设计中最基本也是最重要的部分。

(3)地址译码和命令译码。地址译码用来确定PCI设备是否应当响应当前总线的操作;命令译码则用来指示PCI设备根据不同的总线命令作出相应的动作。

本文采用ALTERA公司的Max+PlusII软件平台,硬件描述语言使用ALTERAHDL语言,也可以方便地转换民VHDL或VerilogHDL语言。在此之前,先引入PCI总线信号的定义。

2.1总线信号定义

根据PCI总线协议2.2版,从设备模式下PCI接口至少包含47根引脚。图2给出了按功能划分的引脚分布,左边是必需引脚。右边是可选引脚。为简化起见,本文采用了如下引脚,其他引脚均不使能或置为高阻态。

(1)由系统提供的33MHz的同步时钟信号CLK和复位信号RST#(#表示低电平有效);

(2)关于数据传输的核心信号:32位地址/数据复用线AD[31:0]、总线命令/字节使能复用线C/BE[3:0]#和偶校验信号PAR;

(3)接口控制信号FRAME#、TRDY#、IRDY#、STOP#、DEVSEL#和IDSEL。其中,FRAME#为数据传输起止信号,TRDY#为主设备准备好信号,IRDY#为从设备准备好信号,STOP#为从设备停止请求信号,DEVSEL#为设备选择信号,IDSEL为配置空间读写时的片选信号;

(4)中断引脚INTA#。

为简化PCI协议,本文只实现了最重要的总线命令,表1给出了所支持的总线命令对应的C/BE[3:0]#编码值。

表1支持的总线命令

C/BE[3:0]#命令类型说明

0010

0011

0110

0111

1010

1011I/O读

I/O写

存储器读

存储器写

配置空间读

配置空间写

2.2配置空间设置

配置空间大小为256字节,前64字节必需,记录了PCI设备的基本住处,比较重要的有:

(1)VendorID、DeviceID和ClassCode域:分别表示设备的生产厂商、设备编号和类型;

(2)Command和Status域:分别给出了对PCI设备的控制命令和当前状态;

(3)BaseAdressRegister域:指示此PCI设备按I/O方式还是内存方式进行读写以及需要的地址空间大小;

(4)InterruptLine和InterruptPin域:分别指明了设备使用的断号和中断引脚。

在对配置空间的访问中,用AD[7:2]寻址一个双字DWORD。在本设计中,配置空间设置如表2所示。

2.3简化的从设备状态机

在PCI协议中,标准的从设备状态机包含五种状态,而且各状态的跳转条件比较复杂。本文在不违反PCI协议的前提下,简化了从设备的状态机,如图3所示。

图3中,状态转移条件信号a、b、c定义如下:a代表配置空间访问条件,b代表I/O空间或内存空间访问条件,c代表总线传输开始条件。这三个条件的实现由后面的命令译码模块给出。

表2配置空间设置(均为十六进制)

字段值或含义字段值或含义

VendorID1172ClassCode040000,即视频卡

DeviceID8901BaseAdressRegister映射到I/O空间

Command0082InterruptLine中断号A

Status0400InterruptPin使用INTA中断引脚

IDLE是系统的缺省状态,表示总线当前空闲。通常,设备处在IDLE状态时,要检测来自PCI总线和后级设备的信号,便设备作出合适的响应。设备处于S_DATA状态时完成第一次数据传输,直接无条件跳到BACKOFF状态。设备在BACKOFF状态时进行多个数据传输,直到主设备断开访问。需要注意的是:任何对I/O空间、配置空间以及内存空间的突发传输的地址超过了设备映射地址的范围时,从设备要在此状态建立STOP信号,断开访问。当帧信号无效或主设备终止传输时,设备回到初始的IDLE状态。BUS_BUSY状态时总线忙,表示总线正在被其它设备使用。有两条转移路径,若总线仍然被占用,则停留在BUS_BUSY状态,否则返回空头状态IDLE。

2.4地址译码和命令译码模块

地址译码模块主要检测PCI地址与本PCI卡的基地址是否匹配,可以通过AD[31:00]信号线上的值与设备的基地址作比较判断。如果PCI地址落在设置的基地址范围内,则PCI卡响应当前的总线操作。

命令译码模块指示PCI卡响应不同的总线命令,通过检测C/BE[3:0]#信号线上的值,与表1列出的总线命令作比较,完成命令译码。

3Windows9x系统下驱动程序的设计

对PCI设备而言,驱动程序提供了获取PCI卡的配置空间信息、勾挂PCI中断、总线数据传输等功能。本文介绍使用Numega公司的VtooIsD软件进行驱动设计的方法。

3.1寻找PCI卡并读取配置空间信息

配置空间包含了系统初始化PCI设备所必需的信息,首先需要遍历整个硬件树结构来寻找指定的PCI设备。对于每一个设备,比较其厂商号(VendorID)和设备编号(DeviceID),如果与设计的PCI卡的信息匹配,则读取它的配置空间信息。

3.2I/O方式下的读写操作

I/O方式下的读写比较简单。在得到PCI设备基地址信息后,通过C++语言中的端口读写函数inpd和outpd即可完成。举例如下:

Temp=_inpd(gBaseAddresses);//Temp中得到读出的数据

_outpd(gBaseAddresses,Data);//向基地址写入数据

其中,gBaseAddresses为基地址值,Data为写操作时的数据。

3.3内存方式下的读写

对于内存方式下的读写,一个重要问题就是地址的映射。因为硬件设备读写的是物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序线性地址的问题。

映射功能通过调用VtoolsD软件的标准库函数完成。根据给定的物理地址和所要求的空间大小,在系统内存中分配相应空间。首先,用PageReserve函数分配当前保留页的线性地址空间,再利用PageCommitPhys函数的服务对开始的线性地址空间分配相应的物理地址空间。程序如下:

ULONGnPages=_NPAGES_(PhysAddress,SizeInByte);

Linear=PageReserve(PR_SYSTEM,nPages,PR_FIXED);

PageCommitPhys(PAGENUM(Linear),nPages,PAGENUM

(PhysAddress),PC_INCR|PC_WRITEABLE|PC_USER);

LinPageLock(PAGENUM(Linear),nPages,0);

其中,PhysAddress为给定的物理地址,SizeInBytes为需要的空间大小。

建立了物理RAM到系统内存的映射后,就可以利用C++语言中的文件操作基类CFile类完成数据的读写。首先使用CFile类的成员函数Open打开文件,为保证数据读写的准确无误,必须使用二进制方式打开;接下来使用Read和Write成员函数进行文件读写;完毕后用Close成员函数关闭文件。

3.4中断的勾挂和处理

首先在ON_DEVICE_INIT函数中完成中断的初始化。即通过前面读取的PCI设备的中断号,使用VPICD_Virtualize_IRQ函数进行中断勾挂,外调用VPICD_Physically_Unmask函数开中断。

RTCIRQHandle=VPICD_Virtualize_IRQ(&IRQdesc);

VPICD_Physically_Unmask(RTCIRQHandle);

然后在RTCInt_Handler函数中进行中断处理,可以进行各种操作,例如向应用程序发送自定义的消息来通知中断的发生。

3.5与应用程序的通信

一般地,应用程序通过CreateFile函数调用VxD驱动程序,得到一个VxD的文件句柄。使用如下的语句可以打开一个名为mydriver.VXD的文件,得到的句柄保存在hVxD中。

hVxD=CreateFile;

通过句柄hVxD和DeviceIoControl函数就可以与驱动程序进行数据传输。

PCI范文篇2

PCI的仲裁是基于设备访问,而不是基于时间分配的。在任一时刻,总线上的一个主设备要想获得对总线的控制权,就必须发出它的请求信号(PCIreqN),如果此刻该设备有权控制总线,总线仲裁器就使该设备的总线占用允许信号(PCIgntN)有效,进而获得总线的使用权。当有多个主设备同时发出总线控制请求时,就必须由仲裁器根据一定的算法判定,当前应该由哪个主设备获得控制权。

二、仲裁算法

常用的仲裁算法有:公平算法、循环算法等。

本仲裁器设计采用的是循环算法,设备的优先级预先设定。目前的设计实现对四个PCI设备请求的仲裁,各设备优先级由高到低安排为:设备0>设备1>设备2>设备3。

系统启动伊始,没有设备使用PCI总线,也没有设备请求使用PCI总线,仲裁器总是设定设备0拥有总线控制权,即将总线停靠于设备0。此时设备0的PCIgntN是有效的。而在此之后,仲裁器总是指定PCI总线的最后一个使用者为总线的停靠设备。

当有一个或多个设备提出拥有总线使用权的请求时,仲裁器将按照事先安排的设备优先级顺序逐一查询。对于只有一个设备请求的情况,该设备的请求将会马上得到响应;如果多个设备同时发出请求时,仲裁器裁定首先响应优先等级高的设备的请求,当此设备完成数据传输交出总线使用权后,再由优先等级低的设备使用总线。示意框图见图2。

如果一个设备已获得总线使用权并且正在进行地址、数据传输时,比它优先级别高的设备也发出了占用请求,仲裁器将会撤销优先级别低的设备的总线占用信号,并把总线使用权交给优先级别高的设备,同时还要确保在任一时刻不会出现多个设备同时占用总线的情况。具体见仿真分析。

三、编程设计与实现

本设计使用AHDL语言,在MaxplusII10.0上编译通过,并进行了仿真。

1.仲裁器信号定义

SUBDESIGNPCI_arb

(--输入

PCIclk:INPUT--PCI时钟

Arbiter_rstN:INPUT--复位信号

PCIreqN[3..0]:INPUT--总线占用请求信号

frameN:INPUT--数据交易的启动或开始,主设备发出

irdyN:INPUT--交易数据准备好,主设备发出

--输出

PCIgntN[3..0]:OUTPUT--总线占用允许信号

)

frameN和irdyN决定了总线的状态,只要两个信号中的一个有效,就表明总线上有数据通过,总线处于忙状态;当两个信号都无效时,则总线处于空闲状态。

2.仲裁器状态机定义

parb_sm:MACHINE

OFBITS(PARB2,PARB1,PARB0)

WITHSTATES(

PARB_SLT0=0,--PCIgnt0#有效,设备0拥有总线使用权,总线空闲

PARB_SLT0D=1,--PCIgnt0#有效,数据在总线上传输,总线处于忙状态

PARB_SLT1=2,--以下类同

PARB_SLT1D=3,

PARB_SLT2=4,

PARB_SLT2D=5,

PARB_SLT3=6,

PARB_SLT3D=7);

3.仲裁的实现

由于采用循环算法,对每一个设备而言状态的变换都是相同的,下面仅以设备0的状态转换为例:

CASEparb_smIS

WHENPARB_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;

parb_sm=PARB_SLT0D;

ELSE

PCIgntN0=GND;

parb_sm=PARB_SLT0D;

ENDIF;

WHENPARB_SLT0D=>

PCIgntN0=GND;

IF(frameN&irdyN)THEN

parb_sm=PARB_SLT0;

ELSE

Parb_sm=PARB_SLT0D;

ENDIF;

为了避免AD线上和PAR线上出现时序竞争,一个设备的PCIgntN信号有效和另一个设备的PCIgntN的撤销,如果不是在总线空闲状态,则两者之间至少要有一个时钟的延迟。设计中,将每个设备占用总线的状态分为两部分,PARB_SLTx(总线空闲)和PARB_SLTxD(总线忙);状态机不能从一个设备的PARB_SLTxD状态直接转到另一个设备的PARB_SLTyD状态,中间必须经过至少一个时钟的PARB_SLTx状态的衔接,这样就避免了总线上竞争的出现。

代码中,PARBtout为一5位计数器,对PCI时钟个数进行计数,用来判别设备发出请求信号后是否在规定时间内(16个时钟,即PARBtout[4..0]=10000)占据了总线,启动了数据的传输;如果超时,则撤销该设备的请求信号,并按预设的优先级顺序,对其余设备总线使用权进行新一轮的裁定。计数器的编程实现:

IF(PARBtout4#PCIreqN0&PCIreqN1&PCIreqN2&PCIreqN3)THEN

PARBtout[]=0;

ELSIF(frameN&irdyN)THEN

PARBtout[]=PARBtout[]+1;

ELSE

PARBtout[]=0;

ENDIF;

四、仿真分析

1.单一设备总线请求情况

系统初始化后自动将总线停靠于设备0上,总线处于空闲状态,frameN、irdyN均为高电平。需要强调的一点是,仲裁所用的PCI控制信号均在PCI时钟信号的上升沿采样而得。如图3所示,设备2发出总线占用信号,仲裁器在时钟上升沿A处采样到该信号,并开始启动PARBtout计数,此时的frameN、irdyN为高电平,设备0仍然拥有总线使用权;随后设备2驱动使得frameN和irdyN有效,在时钟上升沿B处,仲裁器采样到frameN和irdyN,计数器清零,使设备2的PCIgntN2信号有效,从而占用总线,设备把地址、数据驱动到总线上,总线处于忙状态。

之后,设备2撤销其PCIreqN2信号,放弃对总线的占用;接着frameN、irdyN信号相继无效,表明数据传输的完成,总线变为空闲,仲裁器在C处采样后,将总线停靠在设备2上。

2.多个设备同时请求总线使用权(以两个设备为例)

设备3首先发出请求信号,仲裁器在时钟A处采样后,计数器开始计数,此时总线仍然为设备0占用着;在时钟B处的采样,检测到frameN有效,表明数据传输的开始,仲裁器使得PCIgntN3信号有效,设备3获得总线所有权;

在随后的一个时钟上升沿,仲裁器采样到设备2的总线请求信号,此时由于frameN、irdyN依然有效,表明数据传输正在进行中,必须等当前数据传输完成后,设备2才能占用总线进行自己的数据传输,此时仲裁器隐含设定设备2拥有总线使用权。设备3在时钟C之前使得frameN、irdyN无效,总线进入空闲状态,停靠在设备3上。设备2检测到总线空闲,驱动自己的frameN、irdyN信号,仲裁器在时钟D处采样到有效的frameN、irdyN信号后,使PCIgntN2有效,设备2占据总线,开始数据的传输。设备2使用完总线后,使总线回到空闲状态,停靠在设备2上;设备3检测到总线空闲,再次驱动frameN、irdyN有效,从而再次获得总线使用权(时钟上升沿F处)。所有传输完成后,总线将停靠在设备3上。

值得一提的是,如果设备3在被迫交出总线前不能完成所有数据的传输,它必须使自己的PCIreqN3信号持续有效,这样在设备2用完总线后,仲裁器能将使用权交回,从而完成剩余数据的传输。

PCI范文篇3

关键词:PCIWDMs5935

PCI局部总线由于具有高速率以及支持即插即用等特点在微机系统中得到广泛应用。利用PCI接口芯片可以方便地设计PCI规范板卡。s5935是AMCC公司s59xx系列PCI接口芯片中的一种。该芯片功能强大,可用于高速数据采集处理卡、视频加速卡以及多媒体通信等。其主要特点如下:

●兼容PCI2.1规范,可实现PCI总线主设备和从设备功能;

●具有高达132MB/s的传输速率;

●支持8/16/32位外加用户总线;

●可选nvRAM和扩展BIOS;

●具有直通、邮箱、FIFO/DMA三种工作方式;

●适于32位5V电平PCI卡,具有160脚PQFP和208脚TQFP两种封装。

1s5935的结构

图1所示是s5935的内部结构框图。s5935中的寄存器分为PCI配置寄存器组和操作寄存器组。前者可从nvRAM的40h~7fh位载入,也可以是默认值,s5935只能实现首部类型0和单功能设备配置。后者用于s5935与外加总线的操作配置和数据传输(如中断控制,邮箱入口等),从PCI总线访问时称为PCI操作寄存器组,地址为PCI操作寄存器基址加各寄存器偏移地址;而从外加总线访问时,称为外加总线操作寄存器组,可通过ADR[6:2]选择。

s5935的引脚接口分为PCI总线接口、外加总线接口和nvRAM接口。外加总线接口包括中断、复位输出、数据总线及控制引脚,这三种工作方式各有其独立的控制引脚。

2s5935的工作方式

s5935具有直通、邮箱和FIFO三种工作方式,其中直通方式(Pass-Thru)可以实现PCI总线对外加总线的实时读写,它可对PCI总线读写时序直接响应;邮箱方式(MAILBOX)可通过PCI总线与外加总线的一方读/写邮箱,另一方接收中断/查询并写/读邮箱;以上两种工作方式只能在s5935作为PCI从设备时实现。而FIFO方式则可使其作为总线主设备来启动DMA数据传输。在典型的PCI数据处理卡中,可用s5935作为PCI接口通过DSP处理数据,同时使用FPGA完成DSP与s5935间的逻辑转换;邮箱或直通方式用于主机和DSP之间的命令和参数传输,FIFO/DMA方式则可完成高速批量数据传送。下面是s5935的PCI配置及三种工作方式在Win-dows2000下的WDM驱动程序(DDK编程)。

2.1s5935的PCI配置

PCI配置寄存器格式可参考PCI协议文档。如果不使用nvRAM加载s5935的PCI配置寄存器,将无法实现FIFO和直通工作方式。PCI配置寄存器中的基址寄存器BASEADDRESS0对应于PCI操作寄存器的基地址;BASEADDRESS1至4则分别对应于四个直通通道地址(无nvRAM时默认为0)。上述基址寄存器的内容可由系统在初始化时查询以确定映射方式(I/O或内存映射)、直通通道位宽和地址范围,然后由系统写入物理地址,这种具体配置方法比较麻烦(见参考文献1和2)。同时,nvRAM的45h字节的第5、6位必须置0以使能FIFO操作。

2.2直通方式

s5935提供有四条直通通道,可以实现单周期和突发数据传送。在主机驱动程序中,读写直通通道地址可实现数据传输,如:

WRITEPORTUSHORTBASEADDRESS3+OFF-SETADDRESS,DATA;

s5935外加总线接口部分相关引脚:

PTATN:输出,直通周期开始;

PTNUM10:输出,指示四个直通通道之一;

PTBE30:输出,DQ310字节使能;

PTWR:输出,读写选择;

PTADR:输入,OFFSETADDRESS从直通地址寄存器驱动至DQ310;

PTRDY:输入,表明外加总线完成传输;

ADR62:输入,选择外加操作寄存器;

2.3邮箱方式

s5935有输入、输出邮箱各四个,多采用中断/查询方式传输数据,外加总线则可由ADR6:2和IRQ等引脚实现。中断控制/状态寄存器用于实现中断的使能配置、查询和清除,邮箱状态寄存器可查询邮箱状态,通过控制/状态寄存器可使邮箱复位。还可以通过EA08脚直接读写外加总线4号输出邮箱的第三字节,这也是直连外部中断的一种简单方法。在Windows2000下,其典型WDM驱动程序中断相关部分模型如下(地址I/O映射):

AddDevice()//加载设备

……

IoInitializeDpcRequest();

……

DispatchPNP//

……

caseCmResourceTypeInterrupt:

GetInterruptRes;//取得中断资源

……

WRITEPORTULONG(BASEADDRESS0+INTCSR,DISABLEINTDWORD);//禁止中断

IoConnectInterrupt

……

DeviceControl()//实现应用程序中DeviceIOCon-trol函数对设备的读写

……

switchCONTROLCODE……

caseENABLEINTERRUPT://使能和配置

中断方式

WRITEPORTULONG(BASEADDRESS0+INTCSR,INTMASKDWORD);

caseWRITEDATA:

WRITEPORTULONG(BASEADDRESS0+INCOMINGMBOX2ADDRESS,DATA);

}

……}

InterruptHandler//中断服务函数

{……

DWORD=READPORTULONG(BASEAD-DRESS0+INTCSR)//查询是否使本设备产生的中断及本设备以何种方式产生中断

……

DWORD=READPORTULONG(BASEAD-DRESS0+PCIINCOMINGMBOX2);//假设2号邮箱收到数据产生此中断

WRITEPORTULONG(BASEADDRESS0+INTCSR,DEASSERTINTERRUPTWORD);//清中断

……

IoRequestDpc();//调用DpcForISR函数,完成可推迟的中断服务

……

DpcForISR……

PCI范文篇4

关键词:PCI总线;CH361;I/O端口映射;扩展ROM映射

1主要特点

CH361是一个简便易用的PCI总线通用接口芯片。该器件在本地端提供了通用的8位数据总线。由于其支持I/O端口映射和扩展ROM映射,因而可广泛应用于制作低成本的基于PCI总线的计算机板卡,或者用于将原先基于ISA总线的板卡移植到PCI总线上。

CH361的主要特点如下:

●带有通用8位主动并行接口:包括8位数据、16位地址、I/O读和写以及存储器读和写;

●可以设定PCI设备的设备标识(VendorID,DeviceID,ClassCode等);

●支持长度达240字节的I/O端口;

●允许本地硬件地址实现专用I/O端口,可直接移植ISA板卡到PCI总线;

●具有两种I/O端口存取速度:分别为60ns和240ns;

●支持直接映射容量为8kB或者32kB的扩展ROM(BootROM);

●支持通过8kB或者32kB扩容窗口映射的、容量为64kB/128kB的扩展ROM;

●支持扩展ROM(BootROM)的写操作,同时支持存储器SRAM和闪存Flash-Memory;

图2

●内置预引导Mini-Boot-ROM,可支持扩展ROM模拟;

●内置I2C主设备接口,可挂接I2C从设备;

●支持本地设备数据等待,并可提供本地数据输入缓存;

●内置4μs~1ms的硬件计时单元,用于延时;

●采用80个脚的LQFP80和PQFP80两种形式;

●采用了4项专利技术和多项专有技术,低成本,简便易用。

2引脚功能

CH361接口芯片的引脚排列如图1所示。各引脚功能如表1所列。

表1CH361的引脚功能描述

引脚号引脚名称类型引脚说明

20,61,80VCC电源+5V电源

1,21,60GND电源接地

64PCI_RST输入系统复位信号线

65PCI_CLK输入系统时钟信号线

2~5,14~19,22~23,

25~32,66~73,76~79PCI_AD31~PCI_AD0三态输出及输入地址、数据复用信号线

6,13,24,74PCI_CBE3~PCI_CBE0输入总线命令、字节使能复用信号线

12PCI_PAR三态输出奇偶校验信号线

75PCI_IDSEL输入初始化设备选择信号线

7PCI_FRAME输入帧周期开始信号线

8PCI_IDRY输入发起设备准备好信号线

9PCI_TRDY三态输出目标设备准备好信号线

10PCI_DEVSEL三态输出目标设备选中信号线

11PCI_STOP三态输出可用于INTA中断请求信号线,一般不连接

51~58D7~D0三态输出及输入8位数据信号线,各带40kΩ上拉电阻,D7同时是I2C接口的SDA信号线

33~39,42~50A15~A0输出16位地址信号线,A15~A8可以独立控制输出,A15同时可以设定为I2C接口的SCL信号线

40IOP_RD输出I/O端口的读选通/使能,低电平有效

41IOP_WR输出I/O端口的写选通/使能,低电平有效

62MEM_RD输出扩展ROM或存储器的读选通/使能,低电平有效

63复用MEM_WR输出扩展ROM或存储器的写选通/使能,低电平有效

IOP_HIT输入本地硬件地址请求,低电平有效,带上拉

59复用SYS_EX输出可以独立控制的输出信号线,可以设定为I2C接口的SCI信号线

IOP_WAIT输入本地设备数据等待请求,低电平有效,带上拉

EXT_WR输入本地数据输入缓存写使能,上升沿有效,带上拉

INT_REQ输入本地中断请求输入,低电平有效,带上拉

3工作模式

为了在不增加引脚的前提下提供更多可用功能,CH361对部分引脚进行了复用,并可通过“工作模式设定”进行功能选择。“工作模式设定”的具体方法如下:首先将本地端8位数据信号线采用上拉或者下拉的方式设定为所需的高电平或者低电平,以便在CH361被复位后根据这些信号线的默认状态来设定工作模式以及参数;这些信号线在作为8位数据总线被驱动时,由于一般外部设备的驱动电流不小于1mA,所以,上拉或者下拉不会影响其对数据总线的驱动;另外,CH361仅在复位后的1μs内一次性设定工作模式及参数,所以,如果外部设备的驱动能力很小或者是采用OC集电极开路驱动,那么,系统仅在复位后的短时间内实现下拉,而在其余时间屏蔽下拉或者转换成上拉。表2和表3所列为设定工作模式和参数时所对应的数值(1即高电平,0即低电平)。

表2工作模式设定表

数据线数据线的设定说明设定值=0设定值=1

D0设定系统复位后A15地址线的默认值复位后为0复位后为1

D1选择PCI设备标识(ID)外部提供IDCH361默认1D

D4选择复用引脚63的功能IOP_HITMEM_WR

D5设定I/O端口存取速度、扩展ROM容量60ns、8kB240ns、32kB

D7和D6提供给产品制造商使用,数据线的状态从PCI设备配置空41H中读取

表3引脚复用设定表

数据线D4-D3-D2的设定值选择复用引脚59引脚功能说明

D4-D3-D2=000或者100INT_REQ本地中断请求输入

D4-D3-D2=001IOP_WAIT本地设备数据等请求

D4-D3-D2=010EXT_WR本地数据输入缓存写使能

D4-D3=011或者110或者111SYS_EX独立控制输出,复位后为0

D4-D3-D2=101独立控制输出,复位后为1

4CH361的典型应用

4.1与PCI总线的连接电路

图2所示是CH361与PCI总线进行连接的接口电路,图中,电容C1~C4用于电源退耦,而C2~C4应分别并联在CH361的三对电源引脚上。图中,PCI总线的电源线引脚可以自由选择,但数量不得少于4对。CH361属于高频数字电路,因此,设计PCB板需要参考PCI总线规范。

4.2与存储器的连接电路

图3是CH361与SRAM62256存储器的接口电路。图中,CH361通过MEM_RD和MEM_WR与存储器U2(型号是SRAM62256)连接。因为CH361只在PCI设备配置空间中提供扩展ROM基址寄存器,而计算机BIOS通常不会为SRAM设置扩展ROM基址,所以在读写存储器U2前,需要设置扩展ROM基址寄存器,以将存储器U2映射到存储器空间。也就是说,向CH361的扩展ROM基址置入地址值0E0000001(该地址不能与其它设备的存储器地址相冲突,最低位置1是为了启用扩展ROM)后,U2即被映射到0E0000000H至0E0007FFFH的地址空间,这样,当计算机读写0E0001234H地址的存储器时,实际上就是读写存储器U2的1234H地址的内容。

如果将普通的SRAM换成双端口SRAM,则CH361可以通过双端口存储器与外部的单片机或者DSP交换数据。CH361使用8位数据总线,所以,向SRAM写入数据只能以字节为单位进行,但从SRAM读出数据则能够以字节、字、双字为单位进行。CH361通过存储器与外部电路交换数据的实测速度可以达到每秒1.5M字节。

4.3连接扩展ROM

图4是CH361与扩展ROM的接口电路。CH361可通过MEM_RD与ROM芯片U3(型号是27C512)进行连接。它支持EPROM和闪存Flash-Memory,容量可以是32kB或者64kB。如果将SYS_EX用于A16地址线,则最大容量可达128kB。一般情况下CH361可以直接支持32kB容量的扩展ROM(即27C256芯片的容量),也可以在扩展ROM的程序中通过控制A15地址线支持64kB容量的ROM芯片。下拉电阻R1用于CH361的工作模式设定,因为图中的数据线D0连接了下拉电阻,所以,系统复位后,地址线A15为低电平以选择U3的低32kB(地址为0000H-7FFFH),而在需要读取U3的高32kB时(地址为8000H-0FFFFH),可以通过写芯片控制寄存器的位0来重新设定A15地址线,SYSEX连接A16地址线时与A15的用法类似。另外,由于PCI扩展ROM中的内容通常被BIOS复制到RAM内存中,所以需要设置CH361的扩展ROM基址以重新将U3映射到存储器空间。CH361的A15引脚不仅能用作地址线,还可以自由控制,例如在需要同时连接SRAM和ROM时,可通过A15切换两者的片选。PC机中的扩展ROM相当于一个电子盘,如果在其中写入引导程序和应用程序,那么,即使计算机没有硬盘和操作系统,扩展ROM中的引导程序和应用程序也能够控制计算机以实现某些特定的功能。如,无硬盘PC机用于工业控制或控制作业流程等。

PCI范文篇5

关键词:加密卡PCI总线PCI9052ISP单片机

加密是对软件进行保护的一种有效手段。从加密技术的发展历程及发展趋势来看,加密可大体划分为软加密和硬加密两种。硬加密的典型产品是使用并口的软件狗,它的缺点是端口地址固定,容易被逻辑分析仪或仿真软件跟踪,并且还占用了有限的并口资源。笔者设计的基于PCI总线的加密卡具有以下几个优点:第一,PCI总线是当今计算机使用的主流标准总线,具有丰富的硬件资源,因此不易受资源环境限制;第二,PCI设备配置空间采用自动配置方式,反跟踪能力强;第三,在PCI扩展卡上易于实现先进的加密算法。

1总体设计方案

基于PCI总线的加密卡插在计算机的PCI总线插槽上(5V32Bit连接器),主处理器通过与加密卡通信,获取密钥及其它数据。加密卡的工作过程和工作原理是:系统动态分配给加密卡4字节I/O空间,被加密软件通过驱动程序访问该I/O空间;加密卡收到访问命令后,通过PCI专用接口芯片,把PCI总线访问时序转化为本地总线访问时序;本地总线信号经过转换处理后,与单片机相连,按约定的通信协议与单片机通信。上述过程实现了主处理器对加密卡的访问操作。

图1硬件总体设计方案

下面以主处理器对加密卡进行写操作为例,阐述具体的实现方法。加密卡采用PLX公司的PCI9052作为PCI总线周期与本地总线周期进行转换的接口芯片。PCI9052作为PCI总线从设备,又充当了本地总线主设备,对其配置可通过EEPROM93LC46B实现。主处理器对加密卡进行写操作,PCI9052把PCI总线时序转化为8位本地数据总线写操作。这8位本地数据总线通过Lattice公司的ispLSI2064与单片机AT89C51的P0口相连,2064完成PCI9052本地总线与AT89C51之间的数据传输、握手信号转换控制等功能。2064对8位本地数据总线写操作进行处理,产生中断信号。该中断信号与AT89C51的INT0#相连,使AT89C51产生中断。AT89C51产生中断后,检测与其P2口相连的本地读写信号WR#、RD#、LW/R#。当WR#为低电平、LW/R#为高电平时,AT89C51判断目前的操作是否为写操作。确认是写操作后,AT89C51把P0口上的8位数据取下来,然后用RDY51#(经2064转换后)通知PCI9052的LRDYi#,表明自己已经把当前的8位数据取走,可以继续下面的工作。PCI9052收到LRDYi#有效后,结束当前的8位数据写操作。PCI总线的一次32位数据写操作,PCI9052本地总线需要四次8位数据写操作,通过字节使能LBE1#、LBE0#区分当前的8位数据是第几个字节有效。

加密卡硬件总体设计方案如图1所示。

2硬件各组成部分说明

2.1PCI9052部分

PCI9052是PCI总线专用接口芯片,采用CMOS工艺,160引脚PQFP封装,符合PCI总线标准2.1版。其总线接口信号与PCI总线信号位置对应,因此可直接相连,易于PCB实现。PCI9052的最大数据传输速率可达132MB/s;本地时钟最高可至40MHz,且无需与PCI时钟同步;可通过两个本地中断输入或软件设置产生PCI中断。它支持三种本地总线工作模式,实际设计采用地址和数据线非复用、8位本地数据总线、非ISA模式。

PCI9052内部有一个64字节PCI配置空间,一个84字节本地配置寄存器组。对PCI9052的配置可由主机或符合3线协议的串行EEPROM完成(注:ISA模式必须由串行EEPROM完成配置)。实际设计采用Microchip公司的93LC46B存放配置信息。系统初始化时,自动将配置信息装入PCI9052,约需780μs。如果EEPROM不存在或检测到空设备,则PCI9052设置为默认值。

在设计中,EEPROM用到的配置项目有:设备ID:9050;厂商ID:10B5;分类代码:0780;子系统ID:9050;子系统厂商ID:10B5;支持INTA#中断,PCI3C:0100;分配4字节本地I/O空间:(例LAS0RR)0FFFFFFD;其它本地地址空间未使用:00000000;4字节本地I/O空间基地址(模4对齐):(LAS0BA)01200001(仅为示例);4字节本地I/O空间描述符:(LAS0BRD)00000022(非猝发、LRDYi#输入使能、BTERM#输入不使能、不预取、各内部等待状态数均为0、8位本地数据总线宽度、小Endian模式);中断控制/状态,Local4C:00000143(LINTi1使能、LINTi1边沿触发中断选择使能、LINTi2不使能、PCI中断使能、非软件中断、ISA接口模式不使能);UserI/O、从设备应答、串行EEPROM、初始化控制,Local50:00024492。有两点要注意:一是设计中采用PLX公司推荐使用的串行EEPROM93LC46B按字(16bit)为单位组织;二是EEPROM开发器编辑输入与手工书写的顺序对应关系,以厂商ID:10B5为例,在开发器编辑输入的是b510,而不是10B5。

PCI9052本地信号的含义是:LAD[7..0]:本地8位数据总线;WR#:写有效;RD#:读有效;LW/R#:数据传输方向,高电平为写操作,低电平为读操作;LBE1#和LBE0#:字节使能,表明当前LAD[7..0]上的数据是第几个字节(0到3);BLAST#:PCI9052写数据准备好或读数据已取走;LRDYi#:外部设备(此设计指单片机)已把PCI9052写操作数据取走或读操作数据准备好;LINTi1:外部设备通过LINTi1向主机发送INTA#中断,当单片机验证密钥正确,向主处理器发送请求,表明可以开始从中读取相关数据。

需注意的是,PCI9052在使用时,某些引脚要加阻值为1kΩ~10kΩ的下拉或上拉电阻。因此在实现时,给MODE、LHOLD、LINTi1引脚加下拉电阻,CHRDY、EEDO、LRDYi#引脚加上拉电阻。

图2PCI9052本地写时序

以主处理器向单片机写数据为例,图2给出了PCI9052的本地写时序。

2.2ispLSI2064部分

为降低数据被解析的风险,应尽量减少使用分离元件。因此在设计中选用了Lattice公司的CPLDispLSI2064。该芯片采用EECMOS技术,100引脚TQFP封装,拥有2000个PLD门,64个I/O引脚另加4个专用输入,64个寄存器,3个全局时钟,TTL兼容的输入输出信号。2064具有在系统可编程ISP(In-SystemProgrammable)功能,可方便实现硬件重构,易于升级,降低了设计风险,并且安全性能高。PCI9052与单片机之间的8位数据线进行双向数据传输,不能简单地直接相连,需要进行传输方向控制和数据隔离。故用2064作为PCI9052本地信号与单片机信号进行信号传递的接口,图3给出了8位数据信号双向传输的原理图。2064的开发软件ispDesignExpert8.2版支持VHDL、VerilogHDL、Abel等语言及原理图输入,且通过专用下载电缆可把最终生成的JEDEC文件写入2064,实现编程。在设计时采用了原理图输入的方法。

原理图中用到的BI18的功能描述为:当OE=1时,XB为输出,A为输入,即XB=A;当OE=0时,XB为输入,Z为输出,即Z=XB。FD28的功能描述为:8位D触发器(带异步清除)。结合PCI9052本地读写时序,可以分析得出,在进行读写操作时,图3实现了LAD[7..0]与D[7..0]之间正常的数据传输;在非读写时,双方数据处于正常隔离状态。

2.3单片机AT89C51部分

单片机采用ATMEL公司的AT89C51。这是一个8位微处理器,采用CMOS工艺,40引脚DIP封装。它含有4K字节Flash和128字节RAM,且自身具有加密保护功能。单片机不进行外部存储器和RAM的扩展,程序存储和运行均在片内完成,有效地保证了加密强度。

图3LAD[7..0]与D[7..0]之间的数据传输

PCI范文篇6

关键词:PCI总线局部总线PCI9050

1.引言

PCI总线是目前应用最广泛、最流行的一种高速同步总线,具有32bit总线宽度,总线时钟频率为0~33MHZ,最大传输速率可以达到132Mbyte/s,远远大于ISA总线5Mbyte/s的速度。而且,它不象ISA总线那样把地址寻址和数据读写控制信号都交给微处理器来处理,而是独立于处理器,所以它可以支持突发传送。PCI总线与CPU无关,与时钟频率也无关,因此它可以应用于各种平台,支持多处理器和并发工作。

PCI总线协议比较复杂,因此它的接口电路实现起来也比较困难。它不但有着严格的同步时序要求,而且为了实现即插即用和自动配置,PCI接口还要求有许多的配置寄存器。对于一般的设计者来说,为了缩短开发周期,没有必要自己去设计所有的接口逻辑,只要利用通用PCI接口芯片就能很好的进行设计开发,大大减小了工作的难度。现在使用较多的是AMCC公司S59XX系列和PLX公司推出的PLX系列。下面将主要介绍PLX公司的PCI9050接口芯片。

2.PCI9050概述

PCI9050是PLX公司为扩展适配板卡推出的能提供一种混合的高性能PCI总线目标模式的接口芯片,可提供用于适配卡的小型高性能PCI总线目标接口。

它的主要特点有下面这些:

l符合PCI2.1规范,支持开发低成本的从模式适配器。该芯片支持从ISA适配器向PCI适配器转换。

l带有五个局域总线地址空间和四个片选。

l支持突发存储器映射和I/O映射方式在PCI总线和局部总线存取数据。双向FIFO可以用于零等待状态突发操作。PCI总线总是工作在突发方式,局部总线可以设置成突发方式或者连续单周期方式。

l可以从两个局部总线中断输入生成一个PCI中断。

l局部时钟与PCI时钟异步工作,允许局部总线独立于PCI时钟工作。

l支持多路复用和非多路复用的8位、16位和32位通用局部总线。

l总线驱动。PCI9050直接生成所有的控制、地址和数据信号,用于驱动PCI总线,不需要额外驱动电路。

3.PCI9050的功能描述

PCI9050为非PCI设备和PCI总线提供数据通道。

(1)初始化

在上电时,PCI9050的内部寄存器由PCI总线的RST#信号复位,在局部总线上输出LRESET#信号并检查EEPROM是否存在数值。若是存在且前48位不全为1,则PCI9050用EEPROM中的值来配置片内寄存器,否则设为缺省值。PCI配置寄存器只能通过EEPROM或PCI主机CPU来进行设置。在串行EEPROM初始化时,PCI9050反馈给PCI总线RETBY信号。

(2)复位

PCI总线的RST#信号有效将引起整个PCI9050复位,输出LRESET#局部复位信号。PCI总线上的主控设备也可以通过设置寄存器中的软件复位比特来对PCI9050进行复位,但是主控设备只能访问配置寄存器,而不能访问局部总线。PCI9050会一直保持这种复位状态直到PCI主控设备清除软件复位比特。

(3)串行存储器接口(EEPROM)

复位后,PCI9050开始读串行EEPROM。START为0表示EEPROM存在,PCI9050用它来进行配置。若读出的第一个字不是FFFF,那么就认为EEPROM是非空的,继续进行操作。串行EEPROM是按重要性顺序先后配置信息的。

PCI总线上的主机可以对EEPROM进行读写,寄存器位[29:24]控制着PCI9050的管脚,对EEPROM位进行读写。将重载配置寄存器位CNTRL[29]置1可以用串行EEPROM重新配置PCI9050。

(4)访问内部寄存器

PCI9050提供一系列的内部寄存器来为总线接口设计与实现提供最大的灵活性。寄存器分为两类:PCI配置寄存器和局部配置寄存器。主要有以下几种:

l设备与厂商寄存器,它用来标识设备类别及生产厂家。

l状态寄存器,它包含与PCI总线有关的事件。

l命令寄存器,控制设备对PCI访问的响应。

l分类码元寄存器,它用来标识设备的一般功能。

l局部配置寄存器存储器访问的PCI基地址寄存器:系统BIOS利用此寄存器为PCI9050局部配置寄存器的存储器访问分配一段PCI地址空间,范围为128字节,初始化时,主机对寄存器写入FFFFFFFF,读回FFFFFF70,以确定其占用空间为128字节。

l局部配置寄存器I/O访问的PCI基地址寄存器:系统BIOS利用此寄存器为PCI9050局部配置寄存器的I/O访问分配一段PCI地址空间,范围为128字节,初始化时,主机对寄存器写入FFFFFFFF,读回FFFFFF71,以确定其占用空间为128字节。

l局部地址空间0(地址空间1,2,3类似)访问的PCI基地址寄存器:系统BIOS利用此寄存器为PCI9050局部地址空间0的访问分配一段PCI地址空间。初始化时,主机对寄存器写入FFFFFFFF,读回数值来确定它的范围。

对PCI9050寄存器进行读写操作的单位可以是字节,字,长字。PCI9050的存储器访问可以是突发的或非突发的。

(5)直接数据转换操作

PCI主控设备能够直接对局部总线上的设备进行读写操作。PCI9050内的配置寄存器控制局部地址空间的重新映射。双向FIFO引起局部和PCI总线上高性能的突发。

直接从操作:PCI9050支持突发式内存映射传输和单周期的内存或I/O映射传输。映射在PCI内存和I/O空间中的地址由PCI基址寄存器设置。而且,局部映射寄存器允许将PCI地址空间转换为局部地址空间。

4.PCI9050使用时应该注意的问题

9050内部的寄存器是通过外部串行EEPROM上电加载的。9050会自动根据该EEPROM的状态来决定其内部寄存器的值。如果EEPROM内部没有烧写为有效值,应保证其开始48位全为“1”,否则,系统上电时会出错。

9050有5个本地空间,用户可根据实际的需要来进行配置,并不是要用到所有的。当将本地空间配置成I/O时,对该空间的读写只能单次进行。如果配置成存储器模式,用户会有多种接入模式,大大提高了速度。

突发模式是为了提高本地总线操作速度而设计的。在该模式期间,9050只提供一次传输开始和终止信号。开始信号有效时,地址将以本地时钟的频率递增,可以利用BTERM#引脚是否有效来中止突发操作。

还有一点需要说明的是,Pentium系列的CPU,不支持突发读操作,只可能产生单次读操作。用户如果需要在PCI总线上实现突发操作,应该选用支持DMA传输的芯片,比如PCI9054。但是PCI9050会把PCI总线上的多次单次读操作转化为突发操作。

5.基于PCI9050的PCI接口设计

下面给出的是一个利用PCI9050做接口的PCI插卡。在用户电路上,采用MT90820做交换,实现数字电路的转接和复接。具体电路如下图所示。

(1)硬件设计:

接口芯片PCI9050主要包括PCI总线信号接口和局部总线接口。硬件电路分为三个部分。第一部分是9050和PCI插槽间的连接信号线。这些信号包括地址数据复用信号AD[31:0],总线命令信号C/BE[3:0]#和PCI协议控制信号PAR、FRAME#、IRDY#、TRDY#、STOP#、IDSEL、DEVSEL#、PERR#、SERR#。第二部分是与串行EEPROM的连线。这里有四根信号线:EESK、EEDO、EEDI、EECS,串行EEPROM的数据可以提前烧好,也可以在线烧写。第三部分就是9050与应用电路的连接。在这个例子里,它和MT90820相连,包括LA地址总线,LAD数据总线,LBE#字节使能信号,LW/R读写信号等。

(2)软件设计:

程序主要分为两个部分。一部分为PCI9050各个配置寄存器赋值并初始化,还有一部分为主程序,任务就是把PCM链路上的信号经过MT90820交换矩阵后,再通过PCI9050送到CPU。

PCI范文篇7

关键词:外部设备互连总线;局部总线;接口电路;PCI9052;应用

1引言

PCI(PeripheralComponentInterconnect)总线具有独立于处理器、高数据传速率、即插即用、低功耗、适应性强等特点,已成为微型机的主流总线。基于PCI总线形成的CompactPCI和PXI总线广泛应用于仪器和自动化领域。随着PCI总线的广泛应用,其接口的设计开发显得尤为重要。由于PCI总线的独特性能,如信号负载能力、支持数据的突发传送、地址/数据、命令/字节使能信号总线复用等,使中小规模的器件难以实现接口电路。实现PCI总线接口一般采用CPLD或FPGA设计PCI接口,这种方法难度很大;另一种是采用专用的PCI接口电路,使设计开发者免除繁琐的时序分析,缩短开发周期,降低开发成本。本文介绍PCI9052接口电路的功能及其在PCI板卡设计中的应用。

2接口电路

PCI9052是PLX公司开发的低价位PCI总线目标接口电路,功耗低,采用PQFP型160引脚封装,符合PCI2.1规范,它的局部总线(LOCALBUS)可以通过编程设置为8/16/32位的(非)复用总线,数据传送率可达到132Mb/s。提供了ISA接口,可以使ISA适配器迅速、低成本地转换到PCI总线上。主要功能与特性如下所述:

异步操作。PCI9052的LocalBus与PCI总线的时钟相互独立运行,两总线的异步运行便于高、低速设备的兼容。LocalBus的运行时钟频率范围为0MHz~40MHz,TTL电平,PCI的运行时钟频率范围为0MHz~33MHz。

支持突发操作。PCI9052提供一个64字节的写FIFO和一个32字节的读FIFO,从而支持预取模式即突发操作。

中断产生器。可以由LocalBus的二个中断信号LINTi1和LINTi2产生一个PCI中断信号INTA#。

串行EEPROM接口,用于存放PCI总线和Local总线的配置信息。

5个局域总线地址空间和4个片选,基址和地址范围可以由串行EEPROM或主控设备进行编程。

大/小Endian模式的字节交换,有二种交换字节顺序的输出方式。

总线驱动。所有地址、数据和控制信号都有PCI9052直接驱动,不用额外的驱动电路。

Localbus等待状态。除了等待信号LRDYI#用于握手之外,PCI9052还有一个内部等待产生器(包括地址到数据周期、数据到数据周期和数据到地址周期的等待)。

PCI锁定机制。主控设备可以通过锁定信号占有对PCI9052的唯一访问权。

ISA总线模式。PCI9052提供一个ISA逻辑接口,用户可直接使PCI总线和ISA总线相连,可以非常容易地将ISA设计转换到PCI。

PCI9052的接口示意图如图1所示。

图1PCI总线接口示意图

3PCI9052的功能及操作

3.1初始化

上电时,PCI总线的RST#信号将PCI9052的内部寄存器设置为缺省值,同时,PCI9052输出局部复位信号(LRESET#),并且检查EEPROM是否存在。如果设备上装有EEPROM,且EEPROM的第一个16字节非空,那么,PCI9052根据EEPROM内容设置内部寄存器,否则设为缺省值。

3.2复位

PCI9052支持二种复位方式:硬件复位和软件复位。硬件复位是PCI9052总线接口的RST#信号输入有效时将引起整个PCI9052复位,并输出LRESET#局部复位信号。软件复位是PCI总线上的主机可以通过设置控制寄存器CNTRL(50H)中的软件复位字节(Bit30)来对PCI9052复位,并输出LRESET#信号。此时,PCI和局部总线的配置寄存器的值将保持不变。当CNTRL中的软件复位字节有效时,PCI9052仅对配置寄存器的访问应答,对局部总线的访问不响应。PCI9052保持这种状态直到PCI总线上的主机清除软件复位字节。

3.3对串行EEPROM接口的访问

复位后,PCI9052开始读串行EEPROM,若读出的第一个字非FFFFH,则PCI9052认为有一个有效的EEPROM存在,并且继续进行读操作,否则,认为EEPROM无效。PCI总线的主设备可以读、写连接在PCI9052上的串行EEPROM。对其进行读、写操作之前需要将控制寄存器CNTRL[25](使能位)设置为“1”,并控制CNTRL[24]位以产生串行EEPROM的时钟,然后,从EEDI送入指令代码。如果在指令代码之后由EEDO输出“0”,则表明可以对其进行读、写。需要结束操作时,只要将CNTRL[25]设置为“0”即可。

3.4对内部寄存器访问

PCI9052提供了二种类型的片内寄存器,即PCI配置寄存器和局部配置寄存器,二者都只能由PCI总线和串行EEPROM访问,也可以通过设置寄存器CNTRL[13:12]禁止对后者的访问,这样,极大地增强了接口设计的灵活性。

3.5直接数据传输模式

PCI9052支持PCI总线上的主处理器对局部总线上的设备进行直接访问。PCI9052的配置寄存器将访问映射到局部地址空间。片内的读写FIFO存储器使PCI9052支持PCI总线与局部总线之间进行高性能的猝发传送。PCI总线主控访问局部总线示意图如图2所示。

图2PCI主控直接访问局部示意图

3.6PCI中断(INTA#)的产生

要产生PCI中断INTA#,首先将寄存器INTCSR[6](PCI中断使能位)设置为“1”,如果需要以软件方式产生中断,则只需将INTCSR[7](软件中断位)设置为“1”。如果系统设计方案中选用由局部总线上的设备产生中断信号INTi1和INTi2、再生成PCI中断INTA#的方式,只要将寄存器INTCSR的相关位按表1进行设置,复位后INTCSR的值全部为“0”。

表1寄存器INTCSR相关的设置

含义

设置为“1”

设置为“0”

0(3)

INTil(INTi2)

使能

使能

禁止

1(4)

极性

高电平有效

低电平有效

2(5)

状态

中断激活

中断末激活

8(9)

选择使能

边缘触发

电平触发

10(11)

边缘触发清除位

清除边缘触发

保持

4应用实例

PCI9052是功能非常强大的PCI接口电路,用它设计PCI适配卡将使接口变得非常方便。图3是PCI主处理机读取SRAM的接口示意图,其主要功能是实现对RAM的单次或突发读、写操作。

图3存储器突发读写示意图

4.1电路连接

按照图3中的连接电路,对于SRAM主要有以下几个引脚:A(17,0)、I/O(7,0)、OE、CE、WE等。地址线A(17,2)与本地地址线LA[17,2]相连,根据PCI9052的LBE[0,3]#的定义,这里用8位数据总线将LBE0#与A0连接,LBE1#与A1连接,OE与PCI9052的CS0#相连。PCI9052为设计人员提供了4个片选信号CS(3:0)#,可以为4个设备提供片选信号,这样,可以避免设计人员在设计电路时设计片选解码电路,其地址和范围可由其对应的内部寄存内部本地寄存器配置。串行EEPROM用于存储配置寄存器内的配置信息,可以采用NM93C46或与之兼容的存储器。

4.2寄存器设定

电路连接好后,要使电路能正常工作,必须对PCI9052内部寄存器进行配置。根据电路性能及特点,应将寄存器设定为非复用工作方式,采取存储器映射,8位数据总线。局部总线0的基地址寄存器值为240001H,其地址范围寄存器值为3FFF8H,其描述寄存器值为39H;片选0基址寄存器的初始值为4C0001;命令寄存器的初始值为02H;状态寄存器的初始值为800H,其他寄存器采用默认值。确定好各个寄存器的值后,应依据一定的次序将寄存器的初始值写入EEPROM。

4.3驱动程序的开发

为了从PCI总线配置寄存器中获得主机动态分配的映射基址并对映射端口进行读写,必须编写驱动程序。编写Windows驱动程序时,可以使用DDK,但难度较大。为了简化驱动程序开发,可使用Jungo公司推出的WinDriver开发工具。WinDriver可自动生成VxD驱动程序及相应的高级函数。使用者不需具备Windows驱动程序开发知识,所生成的高级函数可直接在VC或CBuilder等高级编程语言中调用。

5结论

实用证明,用专用PCI接口电路对设计PCI接口卡带来很大的方便。本文主要介绍PLX公司的PCI9052专用接口电路,设计者可根据需要选用其他接口电路,不需要ISA接口时,可选用PCI9050;需要DMA数据传送时,可选用PCI9054。专用接口电路是设计PCI适配卡的最佳方法,不但大大缩短了设计周期,而且有利于驱动程序的开发。

参考文献

[1]李贵山.戚德虎.PCI局部总线开发者指南[M].西安:西安电子科技大学出版社,1997.

PCI范文篇8

关键词:PCI总线PCI9052TMS320LF2407双端口RAM

PCI总线技术已经应用于形形色色的微机接口中。同在声卡、网卡甚至有些显示都是基于PCI总线技术的,一些高速数据传输系统中也需要用到PCI总线技术。PCI总线技术的出现是为了解决由于微机总线的低速度和微处理器的高速度而造成的数据传输瓶劲问题,PCI局部总线是在ISA总线和CPU总线之间增加的一级总线。由于独立于CPU的结构,该总线增加了一种独特的中间缓冲器的设计,从而与CPU及时钟频率无关,用户可以将一些高速外设直接挂到CPU总线上,使之与其相匹配。PCI局部总线使得PC系列微机结构也随之升级为现在的基于PCI总线的三级总线结构。PC机的三级总线结构如图1所示。

1PCI总线接口卡的开发

PCI局部总线最显著的特征是速度快。ISA总线的传输速率为5MB/s,EISA总线的传输速率为33MB/s,PCI1.0标准定义的总线传输速率为132MB/s,PCI2.0标准定义的总线传输速率为264MB/s,PCI2.1和PCI2.2标准定义的总线传输速率为512MB/s。而新一代PCI-X技术则在原有PCI总线技术的基础上增加了许多新的技术特征,利用PCI-X技术可以为千兆以太网卡、基于UltraSCSI320的磁盘阵列控制器等高数据吞吐量的设备提供足够的宽带。1999年PCISIG(PCI特别兴趣小组的PCI-X1.0标准最高可提供1GB/s的传输速率,而2003年推出的PCI-X2.0标准则最高可提供4.3GB/s的传输速率。

目前,PCI总线接口电路的选择主要有两种方案。一种是选用可编辑逻辑器件(PLD)。使用PLD,用户可以灵活地开发出适合自己需要的具有特定功能的芯片,但PCI总线协议比较复杂,设计PCI控制接口难度较大,对于一般的工程项目来说,成本较大。现在有许多生产可编程逻辑器件的厂商都提供经过严格测试的PCI接口功能模块,用户只需进行组合即可。另一种是选用PCI专用芯片组(又称桥接电路),通过专用芯片来实现完整的PCI主控模块和目标模块的功能,将复杂的PCI总线接口转换为相对简单的用户接口,用户只需设计转换后的总线接口。本设计中选用PCI总线专用接口芯片来开发接口卡。

1.1接口芯片介绍

PCI总线接口电路又分为主控设备和目标设备。主控设备可以控制总线,驱动地址、数据和控制信号;目标设备不能启动总线操作,只能依赖于主控设备从其中读取数据或向其传送数据。主控设备芯片价格比较高,目标设备芯片价格则比较便宜,而且目标设备芯片比较简单、易于操作。

目前两大PCI专用接口芯片生产商是AMCC公司和PLX公司。AMCC公司的PCI接口芯片有S5920、S5933、S5935等。S5920是目标设备芯片;S5933既可以设置为主控设备芯片,又可以设置为目标设备芯片;S5935是S5933的改进版,同样既可以设置为主控设备芯片,也可以设置为目标设备芯片。PLX公司在PCI接口芯片的设置生产中首屈一指,其目标设备芯片产品主要有PCI9030、PCI9052和PCI9050,PCI9050和PCI9052可以运用于ISA卡转接PCI的设计中,PCI9030是专门为嵌入式系统设计的;主控设备芯片产品主要有PCI9054、PCI9080和PCI9060,PCI9060是最早的32位主控设备芯片,PCI9080是PCI9060的后继产品,而PCI9054则是一种性价比很高的芯片,其性能比PCI9080、PCI9052更优越。

由于主控设备芯片比较复杂,而且价格昂贵,所以对处理速度和传输速度要求不是特别高的场合应尽量选用目标设备芯片。本设计中选用PLX公司的PCI9052目标设备芯片来设计PCI接口电路。

1.2PCI9052介绍

PCI9052是PLX公司继PCI9050之后推出的低成本、低功耗、32位PCI总线接口芯片,利用它可以使局部总线快速转换到PCI总线上。

PCI9052芯片的设计符合PCI2.1规范。它支持低成本从属适配器,其局部总线可根据需要配置成复用或非复用模式的8、16或32位的局部总线。PCI总线侧的时钟频率范围为0~33MHz,局部总线与PCI总线的时钟相互独立,局部总线的时钟频率范围为0~40MHz,两种总线的异步运行方便了高低速设备的相互兼容。PCI9052芯片内部有一个64字节的写FIFO和一个32字节的读FIFO,通过读写FIFO,可实现高性能的突发式数据传输,也可以进行连续的单周期操作。

1.3硬件设计

由于PCI9052属于目标设备芯片,只能依赖于主控设备从其中读取数据或向其传送数据,所以需要一个微处理器对通过PCI9052从PCI总线发送到局部总线的命令作出处理响应,或者把用户想要传送的数据以中断的方式通知PCI总线来读取。本设计中微处理器选用TI公司的C2000系列的16位DSP芯片TMS320LF2407。

TMS320LF2407是TI公司推出的定点DSP处理器,是一款性价比较高的芯片。它采用高性能静态CMOS技术,供电电压为3.3V,指令周期可达25ns,片内有高达32K字的FLASH程序存储器、1.5K字的数据/程序RAM、544字双口RAM(DARAM)和2K字的单口RAM(SARAM),可以分别扩展64K字外部程序存储器、64K字外部数据存储器和64K字I/O寻址空间;片内还集成了包括CAN控制器在内的多个模块及存储器,可以运用于电机及逆变电路的控制中;10位16通道的A/D转换器最小转换时间为500ns;内部自带看门狗定时器模块(WDT)和16位的串行外设接口模块(SPI)。另外,该芯片有高达40个可单独编程或复用的通用输入/输出引脚、一个串行通信接口(SCI)、一个并口和5个外部中断。目前投入市场试用的C2000系列的32位DSP芯片TMS320LF2812采用的是150MHz的时钟速率,其指令周期只为6.7ns,存储器可以扩展到1M,速度更快,功能更强大。

PCI接口卡硬件总体设计如图2所示。图中,DB代表数据总线,AB代表地址总线,CB代表控制总线。

图2

PCI9052的PCI总线直接与金手指连接,局部总线与DSP之间的数据传输在双端口RAM中实现。双端口RAM采用两片CYPRESS公司的双端口RAM芯片CY7C131,组成16位存储转接电路PCI9052和CY7C131供电电压均为5V,而TMS320LF2407供电电压为3.3V,所以接口电平不匹配,需要加总线电平转换电路,这里选用16位总线传送接收器74FCT64245来实现。PCI9052的控制信号和TMS320LF2407的控制信号之间的逻辑转换用一片ALTERA公司的PFGA芯片EPM7032LC44来实现。

TMS320LF2407的电路可以根据需要扩展。由于TMS320LF2407内部自带32K字的FLASH程序存储器,程序调试完毕后可以烧写进去,但程序调试过程中需要频繁修改程序,所以可展一片存储器,调试程序时当作程序存储器用,程序调试完毕后再作为数据存储器用,这样既方便又实用。TMS320LF2407有一个串行通信接口和一个16位并行通信接口,串口可以做成RS485、RS232、RS422、SDI总线接口等,并行通信接口可以做成16位并行输入输出接口。

1.4电路板制作

(1)在连线上只要将对应的引脚连在总线上就可以了。由于信号用的是反射波信号,所以驱动的信号只用了要求电压的一半,另一半靠反射来提升,所以对信号线的长度有要求:CLK信号线的长度为2500mil±100mil。如果长度不够可以画蛇行线,另外,CLK信号线要用地线屏蔽。

(2)PCI总线规范要求布四层线,也可以只布两层线。布两层线时,走线难度增大,要做好电源退耦。每个Vcc引脚必须有退耦电容,且容量的平均值至少为0.01μF,从引脚根部到电容焊盘的走线长度不大于250mil,线宽至少为20mil,多个引脚可以并用一个电容,并且参与共用的引脚数不受限制,但必须满足以上条件。

(3)PCI总线信号PRSNT1#的PRSNT2#中必须有一个接地。如果都不接地,系统找不到开发板。它们接地有两个用途,其一,用来表明槽位上实际存在一块板;其二,提供该板对电源要求的有关信息。表1给出了PRSNT#引脚的设备情况。

表1PRSNT#引脚的设置情况

PESNT1#PRSNT2#扩展板配置

开路开路不存在扩展板

地开路有扩展板,最大功耗为25W

开路地有扩展板,最大功耗为15W

地地有扩展板,最大功耗为7.5W

(4)对于不实现JTAG边界扫描的板子,必须把引脚TDI和TDO连接起来,以使扫描链不至于断开。

(5)PCI连接器上的3.3V引脚(即使实际使用中未提供电流)在母板上必须连到一起,最好连到一个3.3V的电源平面上。而且,对3.3V引脚应提供一个交流回路,这时对地去耦应符合高频信号技术的要求。为此,应在3.3V平面上均匀排列12个高速电容,容易为0.01μF。

(6)为了稳定性,局部总线除了少数有特殊要求外,所有的信号线都应加上拉电阻(5kΩ~10kΩ)或下拉电阻(一般选150kΩ)。

(7)为防止干扰,局部总线时钟也应对地屏蔽。

(8)串行EEPROM提供PCI总线和局部总线的部分重要配置信息,EEPROM一定要选支持串行传输方式的,如NM93CS46或者与之兼容的存储器。NM93C46不支持串行读写,所以不能选取。NM93CS46的CS、SK、SDI、SDO和PE端都要接10kΩ的上拉电阻,而PRE端要接150kΩ的下拉电阻。EEPROM的配置至关重要,EEPROM配置不正确可能导致操作系统无法运行。系统启动时自动检测EEPROM的开始48拉是否全为“1”,若全为“1”,则载入PCI9052的默认配置;否则则装载EEPROM中的内容,为板卡分配资源。串行EEPROM可以通过PCI总线直接写入,也可以用编程器直接烧写。

1.5程序调试

1.5.1FPGA程序的开发

可编程器件的设计软件种类很多,各大器件厂家及一些软件公司都开发了一些设计软件。软件的设计根据逻辑功能的描述方法可分为语言描述设计和原理图描述设计两个类。常见的如DATAI/O公司的ABEL语言、四通公司ASIC事业部开发的针对GAL器件的FM(FastMAP)软件等属于语言描述类设计软件;而DATAI/O公司的Synario软件、Orcad公司的PLD等软件属于电路图描述或电路图描述与语言描述相结合设计的软件。

本设计中FPGA的编程只涉及到信号逻辑转换,所以只需选用语言描述类设计软件,这里选用DATAI/O公司的ABEL语言描述设计软件。程序调试结束后用编程器写入FPGA芯片即可。

1.5.2DSP程序开发

TI公司提供了DSP专用仿真器和仿真开发系统,C2000系列的开发系统最新版本为CCS2.2。对于不同的仿真器,只要安装驱动程序即可使用该开发系统进行仿真。仿真器选用最新款的带USB接口的ICETEK51000USBV2.0仿真器。由于该仿真器使用USB接口,所以不需外接供电电源,实用又方便。

由于硬件设计时扩展了可转换的存储器,进行仿真时把存储器接成程序存储器,程序可以直接转载到扩展的存储器中进行调试,免去了往FLASH中烧写的麻烦,程序调试完毕后再固化到FLASH中。

2PCI总线接口卡的软件驱动开发

PCI卡的硬件调试需要结合软件程序的调试来完成。PCI卡的驱动程序开发有多种途径,驱动开发工具也有多种选择。

2.1驱动开发工具的选取

(1)DDK(DriverDeviceKit)

许多VMM服务都使用寄存器的调用方式,使用起来不是很方便,没有4深厚的汇编语言及硬件基础很难在短时间内开发出设备驱动程序。Micorosoft公司提供了设备驱动程序工具箱(DDK),它是基于汇编语言的编程方式的,DDK的优点是可以开发核心态的真正意义上的驱动程序,开发出来的驱动程序效率是最高的。

(2)DS(DriverStudio)

DS是一个驱动程序集成开发包,其中包括了DriverAgent、VtoolsD、DriverWorks、SoftICEDriverEdition、BoundsCheckerDriverEdition、DriverWorkbenc、FieldAgentforDrivers等。几中常见的DS驱动开发工具介绍如下:

·Drivergent为Win32应用程序提供了访问硬件的接口。

·VtoolsD支持Windows95和Windows98的驱动程序开发(VxD)。VtoolsD包括代码生成器、实时接口库和可以作为开发一类驱动程序的例子程序。

·DriverWorks包括为WindowsNT和Win32DriverModel(WDM)开发驱动程序的完整的开发框架,同时也支持Windows98和Windows2000下驱动程序的开发。DriverWorks包含一个复杂的代码生成工具(DriverWizard),其中含有支持C++下编程的类库和例子程序。

(3)WinDriver

WinDriver是KRF-Tech公司的一套PCI驱动程序开发包。它改变了传统驱动程序开发的方法和思路,极大地简化了驱动程序的编制;同时又没有牺牲驱动程序的性能,是一套高效、快捷的PCI驱动程序开发软件包,特别适合专业硬件人员使用。

利用WinDriver开发驱动程序不需要熟悉操作系统的内核,整个驱动程序中的所有函数都是工作在用户态下的,通过与WinDriver的.Vxd或者.Sys文件交互可达到驱动硬件的目的。由于是一个用户态程序,效率的高低也就成了人们选择WinDriver时关心的问题。大量实践数据表明,WinDriver并没有通过牺牲系统性能来换取驱动程序的快速开发。本设计中选用WinDriver来开发驱动程序。

2.2WinDriver开发驱动程序

在WinDriver的体系结构中,WinDriverKernet处于中心位置,它提供的用户态库函数(API)实际就是对WinDriverKernel中实现的功能进行调用。几乎所有用户同硬件的交互都是通过WinDriverKernel来实现的,这样就极大地解放了开发人员。用户的主要任务就是利用WinDriver提供的用户动态函数库(API函数库)在用户态实现自己的驱动程序代码,完成硬件驱动的功能。

PCI范文篇9

关键词:PCI仲裁器,CPLD,仿真

PCI总线仲裁器通常是集成在PCI芯片组中。随着计算机应用的深入,尤其是嵌入式系统的不断发展,集成的仲裁器难以满足某些场合的应用。而采用CPLD技术实现的独立的PCI总线仲裁器,则较好的适应了这方面的需求。

一﹑PCI总线仲裁机制

PCI的仲裁是基于设备访问,而不是基于时间分配的。在任一时刻,总线上的一个主设备要想获得对总线的控制权,就必须发出它的请求信号(PCIreqN),如果此刻该设备有权控制总线,总线仲裁器就使该设备的总线占用允许信号(PCIgntN)有效,进而获得总线的使用权。当有多个主设备同时发出总线控制请求时,就必须由仲裁器根据一定的算法判定,当前应该由哪个主设备获得控制权。

二、仲裁算法

常用的仲裁算法有:公平算法、循环算法等。

本仲裁器设计采用的是循环算法,设备的优先级预先设定。目前的设计实现对四个PCI设备请求的仲裁,各设备优先级由高到低安排为:设备0>设备1>设备2>设备3。

系统启动伊始,没有设备使用PCI总线,也没有设备请求使用PCI总线,仲裁器总是设定设备0拥有总线控制权,即将总线停靠于设备0。此时设备0的PCIgntN是有效的。而在此之后,仲裁器总是指定PCI总线的最后一个使用者为总线的停靠设备。

当有一个或多个设备提出拥有总线使用权的请求时,仲裁器将按照事先安排的设备优先级顺序逐一查询。对于只有一个设备请求的情况,该设备的请求将会马上得到响应;如果多个设备同时发出请求时,仲裁器裁定首先响应优先等级高的设备的请求,当此设备完成数据传输交出总线使用权后,再由优先等级低的设备使用总线。示意框图见图2。

如果一个设备已获得总线使用权并且正在进行地址、数据传输时,比它优先级别高的设备也发出了占用请求,仲裁器将会撤销优先级别低的设备的总线占用信号,并把总线使用权交给优先级别高的设备,同时还要确保在任一时刻不会出现多个设备同时占用总线的情况。具体见仿真分析。

三、编程设计与实现

本设计使用AHDL语言,在MaxplusII10.0上编译通过,并进行了仿真。

1.仲裁器信号定义

SUBDESIGNPCI_arb

(--输入

PCIclk:INPUT--PCI时钟

Arbiter_rstN:INPUT--复位信号

PCIreqN[3..0]:INPUT--总线占用请求信号

frameN:INPUT--数据交易的启动或开始,主设备发出

irdyN:INPUT--交易数据准备好,主设备发出

--输出

PCIgntN[3..0]:OUTPUT--总线占用允许信号

)

frameN和irdyN决定了总线的状态,只要两个信号中的一个有效,就表明总线上有数据通过,总线处于忙状态;当两个信号都无效时,则总线处于空闲状态。

2.仲裁器状态机定义

parb_sm:MACHINE

OFBITS(PARB2,PARB1,PARB0)

WITHSTATES(

PARB_SLT0=0,--PCIgnt0#有效,设备0拥有总线使用权,总线空闲

PARB_SLT0D=1,--PCIgnt0#有效,数据在总线上传输,总线处于忙状态

PARB_SLT1=2,--以下类同

PARB_SLT1D=3,

PARB_SLT2=4,

PARB_SLT2D=5,

PARB_SLT3=6,

PARB_SLT3D=7);

3.仲裁的实现

由于采用循环算法,对每一个设备而言状态的变换都是相同的,下面仅以设备0的状态转换为例:

CASEparb_smIS

WHENPARB_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;

parb_sm=PARB_SLT0D;

ELSE

PCIgntN0=GND;

parb_sm=PARB_SLT0D;

ENDIF;

WHENPARB_SLT0D=>

PCIgntN0=GND;

IF(frameN&irdyN)THEN

parb_sm=PARB_SLT0;

ELSE

Parb_sm=PARB_SLT0D;

ENDIF;

为了避免AD线上和PAR线上出现时序竞争,一个设备的PCIgntN信号有效和另一个设备的PCIgntN的撤销,如果不是在总线空闲状态,则两者之间至少要有一个时钟的延迟。设计中,将每个设备占用总线的状态分为两部分,PARB_SLTx(总线空闲)和PARB_SLTxD(总线忙);状态机不能从一个设备的PARB_SLTxD状态直接转到另一个设备的PARB_SLTyD状态,中间必须经过至少一个时钟的PARB_SLTx状态的衔接,这样就避免了总线上竞争的出现。

代码中,PARBtout为一5位计数器,对PCI时钟个数进行计数,用来判别设备发出请求信号后是否在规定时间内(16个时钟,即PARBtout[4..0]=10000)占据了总线,启动了数据的传输;如果超时,则撤销该设备的请求信号,并按预设的优先级顺序,对其余设备总线使用权进行新一轮的裁定。计数器的编程实现:

IF(PARBtout4#PCIreqN0&PCIreqN1&PCIreqN2&PCIreqN3)THEN

PARBtout[]=0;

ELSIF(frameN&irdyN)THEN

PARBtout[]=PARBtout[]+1;

ELSE

PARBtout[]=0;

ENDIF;

四、仿真分析

1.单一设备总线请求情况

系统初始化后自动将总线停靠于设备0上,总线处于空闲状态,frameN、irdyN均为高电平。需要强调的一点是,仲裁所用的PCI控制信号均在PCI时钟信号的上升沿采样而得。如图3所示,设备2发出总线占用信号,仲裁器在时钟上升沿A处采样到该信号,并开始启动PARBtout计数,此时的frameN、irdyN为高电平,设备0仍然拥有总线使用权;随后设备2驱动使得frameN和irdyN有效,在时钟上升沿B处,仲裁器采样到frameN和irdyN,计数器清零,使设备2的PCIgntN2信号有效,从而占用总线,设备把地址、数据驱动到总线上,总线处于忙状态。

之后,设备2撤销其PCIreqN2信号,放弃对总线的占用;接着frameN、irdyN信号相继无效,表明数据传输的完成,总线变为空闲,仲裁器在C处采样后,将总线停靠在设备2上。

2.多个设备同时请求总线使用权(以两个设备为例)

设备3首先发出请求信号,仲裁器在时钟A处采样后,计数器开始计数,此时总线仍然为设备0占用着;在时钟B处的采样,检测到frameN有效,表明数据传输的开始,仲裁器使得PCIgntN3信号有效,设备3获得总线所有权;

在随后的一个时钟上升沿,仲裁器采样到设备2的总线请求信号,此时由于frameN、irdyN依然有效,表明数据传输正在进行中,必须等当前数据传输完成后,设备2才能占用总线进行自己的数据传输,此时仲裁器隐含设定设备2拥有总线使用权。设备3在时钟C之前使得frameN、irdyN无效,总线进入空闲状态,停靠在设备3上。设备2检测到总线空闲,驱动自己的frameN、irdyN信号,仲裁器在时钟D处采样到有效的frameN、irdyN信号后,使PCIgntN2有效,设备2占据总线,开始数据的传输。设备2使用完总线后,使总线回到空闲状态,停靠在设备2上;设备3检测到总线空闲,再次驱动frameN、irdyN有效,从而再次获得总线使用权(时钟上升沿F处)。所有传输完成后,总线将停靠在设备3上。

值得一提的是,如果设备3在被迫交出总线前不能完成所有数据的传输,它必须使自己的PCIreqN3信号持续有效,这样在设备2用完总线后,仲裁器能将使用权交回,从而完成剩余数据的传输。

PCI范文篇10

关键字:Linux2.6;设备驱动程序;PCI9656

1引言

Linux操作系统因为其高效、安全、可动态加载及源代码开放等特点,深受设备驱动程序开发人员的喜爱。系统内核大部分独立于底层硬件运行,用户无需关心硬件问题,而用户操作是通过一组标准化的调用来完成。设备驱动程序的任务是将这些调用映射到作用于实际硬件设备的特定操作上,该编程接口能够使得驱动程序独立于内核的其他部分来搭建,在需要时才动态加载到内核。这种模块化的特点,使得Linux设备驱动程序的编写过程变得清晰简单。

目前,为满足日益庞大的数据处理需要,基于64位PCI总线接口设备的研究开发显得尤为重要。因而本文将基于PLX公司推出的PCI总线接口芯片PCI9656,设计开发在Linux2.6内核下的设备驱动程序,进而对2.6内核的内存和中断管理机制进行分析研究。

2Linux2.6与2.4内核的比较

2.1系统稳定性

为了彻底防止对正在被使用的内核模块进行错误操作,2.6内核在加载和导出内核模块方面都较2.4内核进行了改进,避免了用户执行将导致系统崩溃的操作,例如强制删除模块等。同时,当驱动程序需要在多个文件中包含<linux/module.h>头文件时,不必定义宏__NO_VERSION__来检查内核的版本。

2.2统一设备模型

统一设备模型的创建是2.6内核最重要的变化之一。它促进了模块接口的标准化,其目的是更好地控制和管理设备,主要包括:更准确地确定系统设备,更高效的进行电源管理以及改进的系统总线结构管理。

2.3内核基础设施

2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko。相对于2.4内核下系统所支持的RAM为4GB而言,2.6内核下系统支持更大数量的RAM,在分页模式下最高可达64GB。同时,2.6内核优化了I/O调度器,确保不会有进程驻留在队列中过长时间等待输入/输出操作,使得I/O操作的响应更为迅速。

2.4外部设备

在2.4内核中有约束大型系统的限制,比如支持的每一类设备的最大数量为256。而2.6内核则彻底地打破了这些限制,可以支持4095种主要的设备类型,每一个单独的类型又可以支持超过一百万个的子设备。

3Linux2.6内核下PCI设备驱动程序的设计

3.1PCI设备驱动程序中核心数据结构

在2.6内核下使用file_operations数据结构,来建立设备驱动程序中的函数与主设备号(majornumber)之间的对应关系。该数据结构中包含了指向驱动程序内部大多数函数的指针,描述了虚拟文件系统如何操作一个打开的设备。因而file_operations结构是驱动程序向内核其他部分提供的一个统一的标准设备接口。

file结构是设备驱动程序使用的另一个重要的数据结构,指示当前系统中已打开的文件。它在C语言库中定义,在调用内核open函数时创建,并传递给在该设备上进行操作的所有函数,直到最后的close函数。file结构中还包含了指向它所拥有的file_operations结构的指针。

inode结构由内核自动生成,代表已打开文件的描述符,与每个打开的文件一一对应。它包含了两个重要的结构成员:dev_t扩展到32位,其中12位主设备号,20位从设备号,而cdev用于存储一个指向字符设备文件的指针。

3.2驱动程序与内核和外部设备间的关系

(1)通过Linux提供的系统调用函数(例如init_module等)进入内核,这些函数在2.6内核版本下总共有两百多个,提供了几乎所有应用程序进入内核所需要执行的操作。

(2)系统的内核函数都有“sys_”前缀(例如函数sys_init_module),应用程序通过访问设备文件系统来调用这些函数。这一层主要是“devfs”(devicefilesystem)文件管理机制,它是从普通文件和设备文件抽象出来的一个文件系统层,完成进入具体的设备文件操作之前的准备工作。

(3)由设备驱动程序提供具体的函数,来完成对硬件设备的各种操作。特别的对于PCI9656来说,就是通过PCI接口对设备的寄存器和存储器进行访问操作,例如调用register_chrdev等函数来初始化芯片内部的状态寄存器和配置寄存器。

3.3PCI9656芯片的操作流程

PCI总线是目前最常用的外设总线之一,Linux的PCI内核代码为PCI设备驱动程序的开发提供了强大的支持。PCI9656的驱动程序主要包括以下几个方面:设备初始化,为PCI芯片分配内存资源,实现数据的读写功能,中断处理,系统收回内存资源,关闭设备等。

4.Linux2.6内核下内存和中断管理的研究

2.6内核应用了许多新技术来实现对各类外部设备驱动程序的更好支持。下面结合PCI9656驱动程序中的内存和中断管理,进一步分析和研究2.6内核对内存和中断进行的改进和优化。

4.1内存管理

在Linux内存管理器中,页表保持对进程使用的内存物理页的追踪,它将虚拟页映射到物理页上。系统必须找到映射到该页的每一个进程,将使用较少的页置换出去,这样进程中相应页的页表条目才能被更新。随着在系统中运行的进程数量的增加,将这些页置换出去的工作量也会急剧增加。

为解决此问题,2.6内核引入了反向映射机制(reversemapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页的每个进程的页表条目(page-tableentry)的指针。该链表叫PTE链,它极大地提高了找到那些映射某个页的进程的速度,如图2所示。驱动程序调用下列内核函数来为PCI9656分配内存空间。

get_free_page(GFP_NOIO,PGD_ORDER);

alloc_pages(gfp_mask,size);

//查找并为PCI9656分配空闲内存物理页

mempool_alloc(pool,gfp_mask);

request_mem_region(pdx->Pci9656);

remap_page_range(*mem_area,PCI9656,kernel_address,mem_size,prot);

//请求分配内存空间,实现PCI9656物理地址到内存地址的映射

mempool_free(*element,pool);//释放内存

2.6内核中将头文件malloc.h改为slab.h,分配标志GFP_BUFFER改为GFP_NOIO和GFP_NOFS,并新增了文件mempool.h。这些变化一起促生了2.6内核中的内存管理器,其设计目标是更高的性能、效率和稳定性。

另一方面,使用反向映射获得性能的提高也要付出代价,即系统不得不占用一些低端内存来保持对所有反向映射的追踪,这势必在32位硬件上成为内存空间的瓶颈。因此2.6内核引入了高端内存页表(HighmemPTE)机制,让页表条目存放在高端内存中,释放出更多的低端内存区给必须放在这里的内核数据结构。同时,较以前版本的内核而言,2.6内核重新构建了一个更为简单的内存管理器,提高了整个系统的稳定性。

4.2中断处理

Linux处理中断的方式很大程度上与它在用户空间处理信号的方式一样,驱动程序只需为设备所对应的中断注册一个处理程序,并在中断到达时进行正确的处理。

在2.4内核之前,Linux系统一直采用cli和sti函数来禁用和启用中断,然而对于任意某个例程,想要知道在它被调用时中断是否被启用,已变得越来越困难。因而2.6内核定义了函数local_irq_enable和local_irq_disable,用来使能和无效处理器控制的所有中断,定义函数local_irq_save来将当前中断的状态存入flags变量,避免了查询中断的状态信息。

中断处理程序的作用就是将有关中断接收的信息反馈给设备,并根据正在服务的中断的不同含义对数据进行相应的读或写。由于PC机只有0-15的中断号,设备都是以共享的形式申请中断号,2.6内核改进了PCI设备中断请求队列的组织方式,通过设置flags变量中的SA_SHIRQ标志位,并保证内核中所有中断号(dev_id)的唯一性,来实现中断的共享。

if(!(inb(card->iobase+CODEC_CMD_INT_STATUS)&0x80000000))return;//识别中断类型

request_irq(irq,*handler,flags,PCI9656,*dev_id);//向系统注册PCI9656的中断

如果中断注册成功,则返回值IRQ_RETVAL为0,这时在/proc/interrupts文件中可以看申请成功的中断。在2.6内核下,request_irq和free_irq从sched.h改到了interrupt.h中定义。

synchronize_irq(irq);//中断同步

if(wait_event_interruptible(waitqueue,condition)>0)return;//判断中断等待使能

outb(intstat&card->iobase+CODEC_CMD_INT_HLDCLR+2);//使能并行端口的中断报告

//系统响应PCI9656的中断,执行数据读写、寄存器访问等操作

free_irq(irq,*dev_id);//释放设备中断、I/O资源和缓冲区

5实验与测试

我们设计了Makefile文件和一个简单的应用程序,在动态加载驱动程序后,对PCI9656开发板进行了大批量数据的读写实验。基于64位PCI总线和100MHz的时钟频率,我们对芯片的数据读写速率进行了采集,实验结果统计如图3所示。

从上图可以看到,在2.6内核下应用PCI9656作为总线接口芯片,数据的读写传输速率随着数据包的大小有大幅度的提高,这在工程应用中有很大的现实意义。

6结束语

本文通过Linux2.6内核所提供的一系列标准函数调用接口,用C++语言开发了PCI9656的设备驱动程序,并在FedoraCore2平台下调试通过,能正确发送和接收各种大小的数据包。当通信的数据包大小为64KB时,DMA通道的读写速度最大可达1.8Gbps,能够很好的满足日益庞大的数据处理需要。同时,Linux操作系统源代码的开放性还能较好的保证数据存储运算和通信的安全性。