一:相關基本配置:架構
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。