摘 要:PCI 总线广泛应用于计算机系统中,是目前主流总线标准。FPGA 是当前电子系统设计中最热门的话题之一。本文介绍了一种简单、灵活、占用资源少、基于FPGA 实现的PCI 总线接口技术,并且在自制的多媒体通信卡中得到了应用。
PCI(Peripheral Component Interconnect)是一种高性能的局部总线,采用高度综合优化的总线结构,保证系统各部件之间的运行可靠,目前广泛应用于各种计算机系统中。PCI总线可同时支持多组外围设备,具有很高的数据传输速率,峰值传输速率可达132MB/s(32位、33MHz)。
目前开发PCI 接口大体有两种方式:一是使用专用的PCI接口芯片,二是使用可编程器件。如果使用厂家提供的专用接口芯片,用户可能只使用到它的部分功能,会造成一定的资源浪费,而且专用芯片价格高,不经济。而使用可编程器件比前者具有以下两个优点:一方面用户可以根据需要设计PCI接口,不会浪费资源;另外一方面用户逻辑和接口部分可以做在同一个器件内,PCI接口和用户逻辑会结合得更紧密。现在已经有越来越多的用户使用可编程器件如FPGA、CPLD 等进行PCI 设备的开发。对可编程器件进行PCI 接口开发的研究具有很强的实际意义。
PCI 接口的实现包括配置空间和数据接口两方面。
PCI 总线配置空间的实现
配置空间
PCI总线定义了3种物理地址空间:存储器地址空间、I/O地址空间和配置地址空间。前两者是普通的计算机系统地址空间,而配置空间是PCI所特有的一种空间。根据PCI 总线规范[1],所有的PCI 设备都必须提供配置空间。定义PCI 配置空间的目的在于:提供一套适当的配置措
施,使之满足现行的和可预见的系统配置机构。配置空间是一长度为256 字节并且有特定记录结构或模型的地址空间,可以在系统自举时访问,也可在其他时间访问。该空间分为首部区和设备有关区两部分。设备在每个区中只须实现必要的和与之相关的寄存器。首部区的长度为64 字节,每个设备都必须支持该区的寄存器分配,这个区包括进行设备识别的唯一标示码,和允许对设备进行控制的若干区域。表1 所示为64 字节首部区的布局情况。
表中颜色较深部分为强制性的首部寄存器,包括供应商代码寄存器、设备代码寄存器、命令寄存器、状态寄存器、修改版本寄存器、类别寄存器和首部类型寄存器。供应商代码由PCI SIG 分配,设备代码由设备制造商分配;设备代码和供应商代码一起用于定位设备指定的驱动程序。命令寄存器用于存放PCI命令;状态寄存器包含PCI 的状态信息。修改版本寄存器包含版本标识号;类别代码寄存器是只读寄存器,用来说明设备的通用功能。首部类型寄存器包含两个字段,D6-D0 位定义配置空间首部区字节10H-13H 的格式,D7 位表示该PCI 设备是多功能还是单功能设备,如果为1表示是多功能设备,反之则是单功能设备。
除了上面所说的强制性首部类型寄存器以外,还有一些寄存器是经常用到的,比如基地址、中断线和中断引脚寄存器等。基地址寄存器提供了一种为设备指定存储空间或I/O空间的机制。操作系统在启动的时候要判断系统中有多少存储器、系统中的I/O 设备需要多少地址空间,然后根据得到的结果,自动配置系统的存储空间和I/O 空间,实现设备无关管理。基地址寄存器中的值有两个含义,一是存储空间或I/O空
间的基地址;二是存放定义空间的长度。它的D31 位用来区分是基地址还是长度,如果为1则是基地址,反之是长度;另外D0位用来区分存
储器空间和I/O空间,如果为1则是I/O空间,反之是存储器空间。
另外如果要实现中断,必须对中断线寄存器和中断引脚寄存器进行设置。中断线寄存器由系统中的所有中断源共同使用,它的值说明设备的中断引脚连接到中断控制器的哪个输入上。中断引脚寄存器说明设备使用PCI总线上的哪一个中断引脚。
实现方法
我们以一实例说明如何在FPGA 中实现PCI 总线的配置空间。系统要求为:实现一个PCI从设备,把设备上的存储器资源映射到系统的I/O空间,大小为16字节;实现中断功能( 单中断) 。
配置空间的实现,首先是实现强制性寄存器,然后根据需要实现一个或多个可选寄存器。在本例系统中,要求把设备上的资源映射到I/O空间,所以要实现一个基地址寄存器;另外要实现中断功能就还需要实现中断线寄存器和中断引脚寄存器。在本例中要实现的配置寄存器
包括所有强制性寄存器以及一个基地址寄存器、中断线寄存器和中断引脚寄存器。
在FPGA 中资源有限,如果配置空间全部用FPGA 内部的寄存器实现要占用很多资源,其它功能势必要受到削弱,并且会带来布局、布线上的麻烦。所以对一些只读配置寄存器或者不需要修改的配置寄存器,我们可以采用硬连线的方式实现,比如强制性寄存器当中的设备代码、供应商代码、命令、状态、类别码、修改版本、首部类型寄存器,以及可选寄存器当中的中断引脚寄存器都可以用硬连线的方式实现。至于基地址寄存器和中断线寄存器,因为系统在启动过程中要写入分配的起始地址和中断号,所以必须用寄存器实现。其它不用实现的配置
寄存器给一个初始值0 就可以了。这样64 字节的配置空间首部,我们只需要用40个寄存器以及若干硬连线就可以实现,大大节省了资源。具体方案如图1 所示。
图中基地址寄存器由32 个D 触发器实现,中断线寄存器由8 个D 触发器实现,其它寄存器都为硬连线实现。输出选择由三态门完成。AD[7:2]在配置交易时为配置寄存器号。各个寄存器值的确定请参看参考文献1。
采用这种方式我们在设备上实现了要求的PCI 配置空间,占用资源很少,并且可以利用FPGA 的可编程性很容易实现不同的配置空间。
PCI 总线数据传输接口设计
PCI 总线读写时序
PCI总线上的基本传输机制是突发分组传输,一个突发分组由一个地址周期和一个( 或多个) 数据周期组成。PCI支持存储空间和I/O空间的突发传输,它所有的数据传输基本上都是由以下三条信号线控制的:FRAME# 、IRDY# 和TRDY# 。
当数据有效时,数据资源需要无条件设置xRDY#信号(写操作为IRDY#,读操作为TRDY#)。接受方可在适当时间发出它的xRDY# 信号。FRAME# 信号有效后的第一个时钟上升沿是地址周期的开始,此时传送地址信息和总线命令。下一个时钟上升沿开始一个(或多个)数据周期,每当IRDY# 和TRDY# 同时有效时,所对应的时钟上升沿使数据在主、从设备之间传送。在此期间,可由主设备或从设备分别利用IRDY# 和TRDY# 的无效而插入等待周期。
PCI 总线的读时序如图2 所示。
当FRAME# 信号有效时,读传输开始,在AD[31:00]总线上保持有效的地址信号,同时C/BE#[3:0]上包含有效的总线命令。如果总线命令为0110(存储器读命令)或者0010(I/O读命令),同时AD[31:00]总线上的地址又在目标设备的地址范围内,该设备将设置DEVSEL# 信号有效。然后主设备停止驱动AD[31:00]总线,置IRDY# 为低,表明主设备准备好接收数据。第一个数据节拍产生于第三个时钟周期。第二个时钟周期是总线转换周期,目的是为了避免主设备和从设备因竞争总线发生冲突。在数据节拍里,主设备在每个时钟周期的上升沿检查TRDY# 信号,如果它无效表示从设备没有准备好,主设备自动插入等待周期;反之将传送数据,完成一个数据节拍。当主设备使FRAME# 信号无效,表示当前是最后一个数据节拍。在数据节拍里,C/BE[3:0]总线上为字节允许信号。
DEVSEL# 信号和TRDY# 信号是由从设备提供的,但必须保证TRDY# 信号在DEVSEL# 信号之后出现。数据的真正传输是在IRDY# 和TRDY# 信号同时有效的时钟上升沿进行的,这两个信号中的一个无效表示插入等待周期,此时不进行数据传输。例如在时钟7 处,尽管是最后一个数据周期,但由于IRDY# 无效,FRAME# 不能变为无效,只有在时钟8 处IRDY# 有效后,FRAME# 信号才能撤消。
PCI总线的写操作时序如图3所示。
PCI 总线上的写操作与读操作相类似,FRAME# 信号有效表示地址周期的开始,且在时钟2 的上升沿处达到稳定有效。从图中可看出,主设备在时钟5处因撤消了IRDY# 而插入等待周期,表明要写的数据将延时发送,但此时字节使能信号不受等待周期的影响,不得延迟发送。从设备在时钟5、时钟6 和时钟7插入3 个等待周期。AD[31:00]总线在地址周期后没有象读操作那样插入转换周期,这是因为地址和数据都是由主设备发出的。
接口设计
接口的设计还是以上述系统为例。设计思路如下:在时钟的上升沿采样FRAME#、地址和命令,如果FRAME#有效则译码地址和命令,如果总线命令为001x,并且总线上的地址在目标地址范围内,表明这是对本设备的I/O操作;或者总线命令为101x,且IDSEL 信号有效,表明这是对本设备配置空间的操作。在这两种情况下,根据总线命令的最后一位确定是读操作还是写操作,有效DEVSEL# 和TRDY# 信号,开始数据传输;并在传输过程中采样FRAME# 和IRDY# 信号,确认最后一个数据周期,无效DEVSEL# 和TRDY# 信号,结束数据传输。图4 为接口电路的设计框图。
从图5的仿真波形看,完全符合PCI规范要求的时序。读操作与此类似,这里我们就不再给出波形了。在实际应用中,这个接口电路也得到了检验,不论是单周期还是突发数据传输都能很好地完成。
结语
本文介绍了在FPGA 上实现PCI 接口技术,并且在自制的多媒体通信卡上得到了应用。我们使用的FPGA器件是Xilinx 公司的XCS20,PCI 接口部分占用的资源为55个CLB,256 个TBUF,相当于1543 个逻辑门。经测试通信卡的速度可以达到32MB/s,完全满足应用的要求。这种PCI接口实现技术较简单、占用资源少、具有很强的灵活性,并且可以很方便地移植到其它可编程器件上,具有较强的实用价值。
参考文献
1 Tom Shanley,Don Anderson,PCI系统结构 第四版,电子工业出版社,2000
2 陈利学,孙彪,赵玉连,微机总线与接口设计,电子科技大学出版社,1998
3 Xilinx,The Programmable Logic Data Book,1999
文章评论(0条评论)
登录后参与讨论