一:相关基本配置:架构
FPGA: XILINX XC5VFX130T-1FFG1738ui
PCI接口部分使用XILINX提供的pci32_v4_8硬核;PCI控制器由FPGA逻辑实现,主要完成PCI设备到内存的DMA读写操做。Ps:此控制器网表文件可付费购买(100元/份,支付宝帐号:bubble_fish@yeah.net)spa
处理器:BM3803FMGRH操作系统
操做系统:Reworks/Vxworks.net
二:调试中遇到的问题3d
一、 IDSEL引脚无信号输入调试
每一个PCI设备都有一个IDSEL的输入信号,这个信号在读写PCI配置寄存器的时候很是有用。但每每不少时候PCI主设备在给从设备写配置寄存器的时候并不会提供一个IDSEL的输出信号。对于非X86架构的处理器,读写PCI配置寄存器不能经过访问config_address(地址0CF8h) config_data(地址0CFCh)的方式。此时须要从AD线上引一根地址线到IDSEL引脚上。例如BM3803上最多容许挂7个PCI从设备,若某个PCI从设备插在1号槽上,则REQ_N接到pci_arb_req[0],IDSEL接到AD[31],此时配置寄存器的起始地址即为0x8000_0000;IDSEL引脚与AD[31]必须在硬件上连好,不能经过FPGA内部逻辑实现链接。依次推演,当插在2号槽时,REQ_N接到pci_arb_req[1],IDSEL接到AD[30],此时配置寄存器的起始地址即为0x4000_0000.blog
二、 PCI从设备接口上的双向端口要上拉,未使用到的输出引脚要记得赋值接口
例如"SERR_N"、"PERR_N"、"STOP_N"、"DEVSEL_N"、"TRDY_N"、"IRDY_N"、"FRAME_N" "INTA_N"都上拉。未使用到的pci_arb_req和pci_int要赋相应值。内存
三、 PCI地址映射问题
地址映射一直是纯硬件工程师或纯软件工程师理解PCI设备最大的障碍。这是一个软硬件相互配合的过程。先从硬件提及,每一个PCI设备都有一个配置空间(CONFIG_BAR), 在PCI总线上只有这个配置空间是可见的。配置空间以下图:
若FPGA做为PCI从设备,那么在用coregen生成pci32_v4_8硬核时须要输入Device ID、Vendor ID、BAR0空间的大小。当FPGA挂在BM3803的PCI总线一号槽上时,BM3803能够经过读写0x8000_0000+offset来访问到FPGA的配置空间。三个必须的的配置操做是:DMA_CONFIG_WRITE(0x80000004,0xff00_0147, 0x04)//往0x80000004写入4字节数0xff00_0147。DMA_CONFIG_WRITE(0x80000010,0xD0000000, 0x04)//往0x80000010写入4字节数0xD0000000。DMA_CONFIG_WRITE(0x8000001C,0x40000000, 0x04)//往0x8000001C写入4字节数0x40000000。设置完毕,若是此时BM3803想要读写FPGA的BAR0空间,只须要往0xD000000+offset写数就能够了,具体这个offset有多大由FPGA生成IP核时设置的BAR0空间的大小决定。例如DMA_MEM_WRITE(0xD0001000,0x40000000, 0x04)// 往0xD0001000写入4字节数0x40000000。此时BM3803就会在总线上发起地址为0xD0001000的Memory Write操做,做为从设备的FPGA PCI由于上一步配置过BAR0的基地址为0xD0000000,因此能HIT到这个操做,若发起地址为0xA0001000的Memory Write操做,FPGA是HIT不到的,这个操做通常用来实现主设备经过PCI总线来读写FPGA的寄存器。若FPGA想要经过DMA的方式来写内存,此时FPGA逻辑实现的控制器须要发起一个地址为0x40000000的Memory Write操做,若地址为0x50000000,BM3803是不会响应的,由于BM3803芯片手册设置了BAR3-BAR5为主设备接收数据的内存基地址,上一步咱们已经配置了BAR3的基地址为0x40000000。