一:相關基本配置:
FPGA: XILINX XC5VFX130T-1FFG1738
PCI接口部分使用XILINX提供的pci32_v4_8硬核;PCI控制器由FPGA邏輯實現,主要完成PCI設備到內存的DMA讀寫操作。Ps:此控制器網表文件可付費購買(100元/份,支付寶賬號:bubble_fish@yeah.net)
處理器:BM3803FMGRH
操作系統:Reworks/Vxworks
二:調試中遇到的問題
1、 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.
2、 PCI從設備接口上的雙向端口要上拉,未使用到的輸出引腳要記得賦值
例如"SERR_N"、"PERR_N"、"STOP_N"、"DEVSEL_N"、"TRDY_N"、"IRDY_N"、"FRAME_N" "INTA_N"都上拉。未使用到的pci_arb_req和pci_int要賦相應值。
3、 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。