PCI总线协议的FPGA实现及驱动设计
011I/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中断号AStatus0400InterruptPin使用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内存方式下的读写
对于内存方式下的读写,一个重要问题就是地址的映射。因为硬件设备读写的是物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序 《PCI总线协议的FPGA实现及驱动设计(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/165427.html
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中断号AStatus0400InterruptPin使用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内存方式下的读写
对于内存方式下的读写,一个重要问题就是地址的映射。因为硬件设备读写的是物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序 《PCI总线协议的FPGA实现及驱动设计(第2页)》