haitaox的笔记 https://bbs.21ic.com/?598535 [收藏] [复制] [RSS]

日志

pci 小结

已有 1808 次阅读2010-8-26 14:27 |系统分类:EDA/PLD

最近完成了FPGA和桥片的PCI连接,用的是ALTERA CYCLONG III最高级的那个芯片,使用片内的PCIcore。


PCI的通信挺复杂的,连接到总线上的设备可以作为主也可以作为从,通过总线上的仲裁器做出裁断。spec看了好几天,才对PCI有了肤浅的理解。


这个项目中,桥片MV64460有两路PCI,一路接FPGA,另一路接TSI138芯片。FPGA的PCIcore只作为从设备,因此REQn和GNTn没有使用。FPGA已经将外部的借口做好了,只需要我们控制一些local信号就可以了,它的USER GUIDE里有很好的说明。主要看看core的框图,时序图。


其实,只要生成一个PCIcore,主设备就可以找到FPGA的PCI接口了。CPU寻找PCI的设备过程叫做配置读(configuration read),n拉低一个时钟,高位地址线其中的一根且只有一根为高(每个PCI设备的idsel引脚要连接一根高位地址线),同时C/BE送出配置读命令。下一个周期,irdyn拉低,过几个周期之后,如果有设备的idsel连接到了这根地址线,那么就要将devseln拉低。这样,CPU就找到了一个PCI设备,然后PCI还会读取这个PCI设备的头部寄存器,还要设置BAR。


说到BAR,这个还是值得说一说的。BAR=base address register,这个基地址寄存器的第四位是属性位,说明了这一段地址的空间是IO还是MEMORY,是不是可预取的,预取就是不受BE的限制,一下子将32或64位数据全部打出。在FPGA生成PCIcore的时候,这些都是可以设置的。一个BAR是32位的,如果你觉得32位的地址空间不够用,那么可以用2个BAR寻址一段空间。以一个BAR寻址为例,如果希望这一段的空间大小为1MB,也就是2^20,FPGA会自动将BAR0[19:4]拉到GND上,当CPU读BAR0时,收到的数据应该是0xfff00000,或者0xfff00008。高12位是可读写的,CPU会将基地址写到这12位上,这就完成了CPU分配基地址的过程,以后,每当高位地址落到这个区间时,会引起PCI操作。


一个值得注意的问题是,一定要将关键信号外接上拉电阻,比如STOPn,这个引脚可害苦了我了。


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)