PCI总线目标控制器的设计

   2013-03-23 工控之家网工控之家250
摘  要:本文在PCI2.2总线规范的基础上,给出了一种PCI总线目标控制器的设计方案。重点从控制逻辑和数据通路的建立上阐述了目标控制器的设计:用状态机实现总线访问操作的复杂时序,通过FIFO型目标接口和寄存器型目标接口的建立实现了数据通路。目前本设计已应用到光电器件CMOS图象传感器的数据传输并通过了FPGA原型验证。

关键词:PCI;目标控制器;状态机

Abstract: This paper developed a PCI target controller based on the PCI2.2 bus specification, which focused on controlling logic and data path: the realization of the complication of the access sequence to the bus interface controller is expressed by state machine, the data path is set up through the FIFO target interface and register target interface. The design has been used in the data transmission of CMOS image sensor and has passed the FPGA prototype verification correctly.

Keywords: PCI; target controller; state machine

0 引言

  PCI(Peripheral Component Interconnect)总线是微型计算机中处理器/存储器与外围控制部件、扩展卡之间的互联接口。PCI总线规范是互联机构的协议,以及电气和机械配置的规范,是当今高性能微型计算机事实上的总线标准。[1]

  PCI总线控制器为PCI总线和用户设备提供操作接口,协调PCI总线信号和用户设备接口信号,使用户设备能够按照PCI总线的规范进行数据的传输。本文设计了一个适用于CMOS图象处理的PCI目标控制器,具有较强的通用性。

1 控制器的顶层设计

  PCI总线目标设备在总线传输中处于被动地位,它不会申请对总线的使用权。当PCI总线上的某一主设备发起对本地资源的访问时,整个控制逻辑的建立和数据传输的过程都是通过目标控制器实现的。


图1 目标控制器顶层结构

  PCI系统中,目标设备在地址周期内响应总线主设备的传输要求,并配合主设备完成整个数据传输。图1为目标控制器的详细结构图。

  本设计将目标控制器按照功能分为几个功能模块实现,即命令解码器、状态机、FIFO类型目标接口和寄存器型目标接口。命令解码模块和状态机构成目标控制器的控制部分,PCI主设备发起某类型的操作,目标控制器在地址周期内解析相应的地址和命令信息。在解析地址确定为本次操作的目标设备后,目标控制器会启动目标设备状态机根据当前解码的信息进行一系列的控制操作。FIFO类型通道用于大批量的数据传输,可将本地存储器块挂接在该类型的数据通道上;寄存器类型接口用于数据量小的数据传输,该接口的后面可以挂接配置寄存器和一些本地功能设备的控制/状态寄存器块。这样,PCI总线上的主设备既可以访问到本地的存储器设备也可以访问本地的寄存器。下面从目标控制器的数据路径和控制路径分别进行论述。

2 控制模块实现

  目标控制器的控制由两部分完成,命令解码器和目标状态机。命令解码器解码来自PCI总线上的地址命令信息作为目标状态机的输入,状态机鉴于此输入执行相应的操作。

  (1)命令解码器:PCI总线主设备在地址周期内通过命令数据线(C/BE#)设置不同的编码可以发起以下的操作,I/O读写、存储器读写、配置读写、存储器行读/多行读和存储器写及使无效。

  (2)目标状态机[3]:对于PCI总线上传来的信号,状态机根据命令解码器的解码信息来控制总线控制器进行相应的操作。如果地址信息不正确或者本地的设备正忙于存取数据,状态机会向PCI总线上发起本次操作的主设备回应目标丢弃或目标重试。目标状态机的具体设计,如图2所示。


图2 目标设备接口状态机

  状态机共分为10个状态,下面对每个状态的意义及状态跳转条件的详细说明:

  目标空闲(idle):当PCI总线有新的命令但控制器正忙于未完成的数据传输或寄存器配置时,状态机跳转到check_abort;控制器空闲但寄存器内有记录的未完成的读操作,状态机跳转到check_addr;PCI总线上有数据传输要求而又未出现上面的两种情况,状态机跳转至cmd_start。

  启动命令解码(cmd_start):满足放弃条件如奇偶校验错误、强制放弃等条件时,状态机跳转至start_abort;不满足放弃条件,若目标设备没有突发传输能力,状态机跳转至start_single,若目标设备有突发传输能力且主设备发起的是写命令,状态机跳转至start_multiple,如果目标设备有突发传输能力且主设备发起的是延迟读命令,状态机跳至start_retry;上述情况均未发生,状态机跳转至start_wait_rd1。

  检查地址匹配(check_addr):满足放弃条件如奇偶校验错误、强制放弃等条件时,状态机跳转至start_abort;如果地址与之前的请求地址一致,对目标设备进行延迟读,状态机跳转至start_multiple;如果地址不一致状态机跳转至start_retry。

  放弃条件检测(check_abort):满足放弃条件如奇偶校验错误、强制放弃等条件时,状态机跳转至start_abort;不满足条件,状态机转至start_retry。

  读等待状态1(start_wait_rd1):如果FIFO中有了待传输的数据,状态机跳转至start_wait_rd2;否则一直等待在状态start_wait_rd1。

  读等待状态2(start_wait_rd2):FIFO中已经有了所要读取的数据,状态机跳转至start_multiple。

  目标设备放弃(start_abort):一直维持该状态直到主设备声明传输结束,状态机转至idle。

  单数据传输(start_single):如果主设备声明最后一个数据传输,状态机跳转至idle;如果主设备继续对该目标设备进行读写操作,状态机跳转至start_retry。

  数据突发传输(start_multiple):如果剩下最后一个字节传输,状态机跳转到idle;如果地址信息无效或地址越界,状态机跳转到start_retry;如果接收FIFO几乎满了而PCI主设备继续往其中写入数据,状态机跳转到start_retry;其它情况状态机保持start_multiple状态不变。

  重试(start_retry):一直维持该状态直到主设备声明传输结束,状态机转至idle。

3 数据通路实现

  目标控制器的数据通路具体可通过两种类型的目标接口实现:寄存器型目标接口和FIFO型目标接口。

  3.1 寄存器型目标接口

  每个PCI功能拥有64个配置双字的单元[1](前16个双字的格式和用法由PCI规范预定),保留用于实现配置寄存器。本地可以有一些功能设备,这些设备都有相应的控制/状态寄存器,PCI总线上的主设备要对这些控制寄存器进行编程,进而控制相应的功能设备完成特定功能。两类寄存器可以归为一个数据通道实现,寄存器型目标接口就为本地的功能设备提供了这样一种接口,使得PCI总线上的主设备可以通过它来访问功能设备的寄存器。由于PCI总线主设备的访问目标是一些寄存器,所以该接口无需支持突发传输,主设备每一次访问最多只涉及到32位的数据传输。

  3.2 FIFO型目标接口

  FIFO型的目标通道主要用于大量的数据传输,可以将本地的存储器挂接在该接口上,这样PCI总线主设备可以通过FIFO型目标通道访问到本地的存储器,针对PCI主设备对本地存储器的读和写操作,设置了两个异步FIFO,读FIFO和写FIFO。其结构如图3

  命令解码器和目标状态机组成了该接口的控制单元。FIFO型目标接口由地址解码器、读写控制单元和读/写异步FIFO四部分组成,在控制部件的协调控制下,共同完成PCI总线上的其它主设备对本地存储器的数据存储或读取。

  读写控制单元:主要用于目标延迟读的控制,存储并比照前后数据传输请求的地址和命令信息,声明本次传输请求是否为有效的延迟读请求。

  读/写FIFO:异步FIFO,用于缓存PCI主设备到本地存储器的读写数据。

  地址解码器:解码PCI总线上的地址信息,识别对FIFO型目标接口的访问。对于地址解码器的实现,在最初PCI系统分配地址时,FIFO型的目标接口被分配到某一段地址区内,通过地址翻译将其映射到本地的系统中[4]。


图3 FIFO型目标接口逻辑结构

  对PCI主设备发起的写操作,数据会先以PCI时钟写入接口内的写FIFO,同时PCI控制器会通知本地存储器控制器有数据写入。本地存储器控制器待FIFO中达到一定数据量时以自己的时钟读取FIFO中的数据存入本地存储器,如果FIFO读空,存储器会暂停等待直到FIFO中有新的数据写入,才进行读取。

  对PCI主设备发起的读本地存储器的操作,为了提高读数据的效率,设计中根据不同数据传输的特点,把读操作划分为两个类型,即立即读和延迟读。

  (1)立即读:在PCI总线主设备发起读操作后,一直占用PCI总线等待,PCI总线控制器向本地存储器请求对应的数据,直到本地存储器将数据写入读FIFO中,PCI控制器读取FIFO中数据开始PCI总线上的数据传输。这种读类型一般适用于进行数据量小的传输且本地存储器可以在较短的时间内将要求的数据送到PCI总线。

  (2)延迟读:PCI总线主设备的读请求到达PCI目标总线控制器时,控制器锁存地址和命令信息,并回应主设备让它重试。同时PCI目标总线控制器向本地存储器请求数据,本地存储器将数据写入总线控制器中的FIFO中。此时如果PCI总线上的主设备重试先前的数据传输请求,PCI目标控制器就可以响应请求将数据发送到PCI总线上。这个过程中,PCI总线主设备在收到重试回应后就会释放PCI总线,允许其它的主设备占用总线进行数据传输,这样从而提高了总线的利用率。图4给出了PCI主设备突发读时采用延迟读的仿真结果图


图4 突发读时仿真波形

4 结束语

  本文基于PCI2.2总线规范完成了通用PCI目标控制器的RTL级设计。经验证设计完全实现了目标控制器的功能,目前已通过了FPGA原型验证并应用到CMOS图象传感器的数据传输中。在后续的开发中,可以考虑在控制器内部加入电源管理模块,进一步降低PCI目标控制器的功耗。

  本文的创新点:该设计方案将目标控制器整体分为控制逻辑和数据通道两部分,并根据目标设备的不同类型,在数据通道内实现不同的目标接口,并引入了立即读和延迟读机制实现数据传输,使整个设计取得了较高的效率。

参考文献

  [1] Tom Shanley, Don Anderson 著. 林辉等译. PCI 系统结构. 电子工业出版社, 2000.

  [2] 沈涵飞, 甘萌. PCI总线目标控制器的设计与实现[J]. 计算机工程与设计. 2004, 25 (11):2101~2104

  [3] 施少敏,马彦恒. 基于接口芯片PCI9030的PCI总线接口卡的设计[J]. 微计算机信息. 2006,11-2: 295~297

  [4] Tinoosh Mohsenin. Design and Evaluation of FPGA-Based Gigabit-Ethernet/PCI Netword Interface Card. Master Degree Dissertation of Rice University. 2004:71~74

  [5] Janick Bergeron, Writing Testbenches-Functional Verification of HDL Models. Boston, Kluwer Academic Publisher, 2000.

 
举报收藏 0打赏 0评论 0
更多>相关评论
暂时没有评论,来说点什么吧
更多>同类环保知识
推荐图文
推荐环保知识
点击排行
网站首页  |  免责声明  |  联系我们  |  关于我们  |  隐私政策  |  排名推广  |  广告服务  |  积分换礼  |  帮助中心  |  网站地图  |  违规举报
鲁ICP备12015736号-1