一:前言
很多和我一樣初學pcie的硬件工程師都會遇到這樣一個問題,看了不少pcie相關的資料,還是搞不清這玩意兒到底該怎麼用。於是我們打開ISE的core_generator工具,生成了一個pcie的ip核,用modelsim仿真一下example design,仔細分析一下,好像對協議部分理解更深了。至於怎麼用,呵呵……
當然,多數硬件工程師都是有上進心的!於是我們上網找資料,發現了一個xilinx官方出品的demo:xapp1052。全稱是Bus Master DMA Performance Demonstration Reference Design for the Xilinx Endpoint PCI Express® Solutions。高大上啊,終於知道用在什麼地方了,果斷下載下來。打開一看,東西不少,按照裏面xapp1052.pdf的說明,一步一步生成bit,下載到開發板裏,然後安裝上位機軟件,最後測試並且用chipscope抓信號分析。但事實上,你愚蠢得連bit都生成不了(遇到相同情況的朋友請默默爲我點贊)。就在你乾着急的時候,你看到了這篇偉大的博客……接下來,我將手把手教你如何使用這個xapp1052。
二:前期準備
1、pcie基礎還是要有,尤其是協議部分。推薦一本電子書,很經典,請耐心讀它(Addison.Wesley.PCI.Express.System.Architecture.eBook-LiB.chm)下載地址:http://download.csdn.net/download/yuzeren48/7723815
2、一塊開發板,我使用的是Xilinx ML605。
3、一臺帶PCIE插槽的主機。
4、Xapp1052 Demo(http://download.csdn.net/download/yuzeren48/7723795)
5、ISE14.1套件
三:使用說明
1、打開coregenerator生成一個4通道gen2的pcie ip核,配置部分見下圖,尤其注意classcode必須是’h058000,否則無法正常安裝驅動。除圖中幾處需要更改外,其餘均爲默認設置
圖1 配置1
圖2 配置2
圖3 配置3
圖4 配置4
圖5 Pcie核目錄
2、建立BMD_Dsign 工程。完整工程文件下載地址(http://download.csdn.net/download/yuzeren48/7723831)。下載需要積分,推薦大家按照以下說明一步一步自己建立。首先打開ise,新建工程,添加文件。文件來自:
..\v6_pcie_v1_7\source全部
..\v6_pcie_v1_7\example_design中的xilinx_pcie_2_0_ep_v6_04_lane_gen2_xc6vlx240t-ff1156-1_ML605.ucf和xilinx_pcie_2_0_ep_v6.v
..\xapp1052\dma_performance_demo\fpga\BMD\common全部
..\xapp1052\dma_performance_demo\fpga\BMD中的BMD_64_RX_ENGINE.v和BMD_64_TX_ENGINE.v和v6_pci_exp_64b_app.v
然後編譯,由於要先編譯BMD_PCIE_20.v,所以右鍵選擇manual compile order,如圖6所示。
圖6 編譯工程
選中所有.v和.ucf文件,完成綜合以及佈局佈線,並生成bit文件,如圖7所示。
圖7 生成bit文件
注意:如果覺得這樣編譯不舒服,看不清層次結構。可以將BMD_PCIE_20.v刪除,並把所有文件中的`ifdef PCIE2_0去掉。
3、modelsim仿真
很多人覺得直接把bit寫入開發板,用chipscope在線調試即可。小編覺得最好還是先用modelsim做一下仿真,確定邏輯沒有問題再燒板子。小編曾好幾次燒了錯誤的bit,用chipscope怎麼都抓不到信號。接下來我們講如何仿真。
首先將..\v6_pcie_v1_7\example_design文件夾下的文件(除xilinx_pcie_2_0_ep_v6.v以外)全部刪除,將..\dma_performance_demo\fpga\BMD\common下的全部文件以及..\dma_performance_demo\fpga\BMD下的BMD_64_RX_ENGINE.v和BMD_64_TX_ENGINE.v和v6_pci_exp_64b_app.v複製到..\v6_pcie_v1_7\example_design文件夾下。
然後修改..\v6_pcie_v1_7\simulation\functional下的board.f文件,注意BMD_PCIE_20.v必須放在最前面編譯,修改後的board.f文件如圖8所示:
圖8 修改後的board.f
最後,打開Modelsim SE10.1b軟件,更改目錄至. .\v6_pcie_v1_7\simulation\functional
輸入腳本do simulate_mti.do 仿真結果如圖9圖10所示
圖9 仿真結果1
圖10 仿真結果2
備註:這裏的modelsim仿真並沒有用到DMA功能,只是測試我們的代碼完整性。如果需要仿真DMA功能,可以自己調用pci_exp_usrapp_tx.v中的函數,往DMA控制寄存器中寫入地址、長度等數據,然後啓動DMA讀或者寫。
4、Chipscopes抓包分析
首先需要在ise工程裏添加chipscope核,chipscope的使用方法詳見(http://download.csdn.net/download/yuzeren48/7705033),這裏給出帶有chipscope核的ise工程文件下載地址(http://download.csdn.net/download/yuzeren48/7723831)
插入cdc,生成了bit之後,下載到開發板中,將開發板插入主機的PCIE插槽,上電設備管理器檢測到有PCI內存控制器。用xapp1052.pdf中的步驟,強制安裝驅動。安裝完驅動後打開軟件如圖11所示
圖11 上位機軟件
先測試write:
將pattern to write 改成0x01020304,其餘保持默認設置。點擊start,在chipscope中我們就可以看到DMA控制寄存器一共收到了來自主機的多個數據包,如圖12所示(注意,將windows設成8,depth設成8,同時設置觸發信號如圖13所示)。
圖12 主機寫DMA控制寄存器
圖13 設置觸發信號
這些包都是用來寫DMA控制寄存器的,這幾個包的發包順序如下:
當主機向偏移地址爲04的寄存器寫入0x00000001時,DMA啓動寫內存模式,如圖14所示。(我們可以通過設置觸發信號trn_rd的低32位爲0x01000000來檢測DMA寫開始)
圖14 DMA寫內存
同樣的方法,測試read。我們可以通過DMA來讀內存。如圖15所示
圖15 DMA讀內存