使用Xilinx K7 KC705開發板調試PCIe中的問題【持續更新】


開發板:Xilinx K7 KC705

軟件:ISE14.7

 

1.由於應用需求,我們要將開發板作為主機端,通過PCIe接口轉接板外接一個NVMe PCIe SSD。並由FPGA控制SSD的數據讀寫。

因此我們例化生成了一個作為主機端的 PCIe IP核。

類型選擇為Root Complex

這里我們將可設置的幾項配置成抓取到的PCIe NVMe SSD的內部相應參數。

生成pcie核之后,在其目錄下將example文件夾中的例程導入ISE中。

閱讀其ucf文件,發現其中並沒有約束sys_clk_p和sys_clk_n這一組差分時鍾信號。取而代之的是如下的代碼:

# SYS clock 100 MHz (input) signal. The sys_clk_p and sys_clk_n
# signals are the PCI Express reference clock. Virtex-7 GT
# Transceiver architecture requires the use of a dedicated clock
# resources (FPGA input pins) associated with each GT Transceiver.
# To use these pins an IBUFDS primitive (refclk_ibuf) is
# instantiated in user's design.
# Please refer to the Virtex-7 GT Transceiver User Guide
# (UG) for guidelines regarding clock resource selection.
#
INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y3;

這樣的配置就可以了嗎?還需要添加或修改什么代碼嗎?

參考網上的一些類似問題:如http://www.newsmth.net/nForum/#!article/FPGATech/45472?au=biscuit123。

我們推斷,這里約束了buffer "refclk_ibuf"的位置,即同時將sys_clk_p和sys_clk_n的LOC確定了。因為在頂層文件xilinx_pcie_2_1_rport_7x中例化了

IBUFDS_GTE2 refclk_ibuf (.O(sys_clk), .ODIV2(), .I(sys_clk_p), .CEB(1'b0), .IB(sys_clk_n));

ucf中的上述約束即為將refclk_ibuf確定為IBUFDS_GTE2_X0Y3,而這個buffer的位置是固定的,因而輸入端的sys_clk_p和sys_clk_n也就確定了,不需要再進行約束。

上述分析純屬個人推斷,如有誤,還請留言指出。

同時在綜合之后,打開PlanAhead以查看管腳映射:

發現sys_clk_p的管腳位置確實已經配置。並且修改IBUFDS_GTE2_X0Y3的值,綜合后得到的管腳映射位置不一樣,如下:

                                                                FPGA管腳號     Bank            時鍾來源位置

IBUFDS_GTE2_X0Y0:sys_clk_p       R8                                         未連接

IBUFDS_GTE2_X0Y1:sys_clk_p       V8                    115               PCIE_8LANE_EDGE

IBUFDS_GTE2_X0Y2:sys_clk_p       L8                    116               SI5324C-C-GM

IBUFDS_GTE2_X0Y3:sys_clk_p       N8                   116               FMC接口

IBUFDS_GTE2_X0Y4:sys_clk_p       G8                   117               

IBUFDS_GTE2_X0Y5:sys_clk_p       J8                    117               FPGA管腳J16

IBUFDS_GTE2_X0Y6:sys_clk_p       C8                   117               HPC接口

IBUFDS_GTE2_X0Y7:sys_clk_p       E8   

具體連接位置可參照開發板的原理圖。

 

在這里我們應該寫成INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y1;

這樣兩個輸入時鍾信號將接到金手指上,其輸入來源是PCIe插槽轉接板上的100MHz時鍾。

具體PCIe接口信息可參見博文:http://blog.csdn.net/michaelcao1980/article/details/42778405

 

2.PCIe和NVMe的初始化完成,CSTS.RDY信號拉高,按照協議要求,我們想發送第一個指令:Identify。按照要求,我們修改了Admin SQ Doorbell寄存器。想要等待SSD給主機返回 讀TLP包,但是在PCIe核的數據返回接口並沒有抓到數據,過了一段時間之后,收到一個MXI中斷包。

這是什么問題?

轉載:https://blog.csdn.net/ssbls/article/details/55272114


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM