« Kintex-7 PCI Express基板の実装が上がってきた | トップページ | Kintex-7のPCI Expressリンク幅と速度 »

2016.11.09

Kintex-7のPCI Express EndPointを使う方法

Kintex-7搭載のPCI Expressボード「Cosmo-K」で、PCI Expressがあっさりと無事に認識されました。

やりかたは意外と簡単で、ISEのCoreGenでPCI Expressのコアを作って、その中にあるExample Designをビルドすればよいだけです。

K7pcie_1

sun

では、もう少し詳しく説明します。

まずISEを用意してCoreGenで新規にコアを作成します。Vivadoだとややこしくなるので、私はまずはISEで試します。

Standard Bus Interfacesの中にある7 Series Integrated Block for PCI Expressを選びます。

K7pcie_2

最初の画面では、レーンの幅や速度などを選びます。

K7pcie_3

最初のDevice / Port Typeというところは、PCI Express Endpoint Device(普通のターゲットボード)にするか、Legacy(I/O空間が使えたり)にするか、RootComplexにするかなどを選びます。(Rootになれるって、すごいですね。)

Gen2に対応させるには5.0GT/sを選びます。Interface Widthというのはユーザポートのデータバスの幅です。Cosmo-KはGen2 x4なので、64bit 250MHzか、128bit 125MHzになります。

sun

次はBAR空間の設定です。32bitメモリ空間ならば2GBytesまで、64bitメモリ空間ならば8ExaBytes要求できるようです。

これはCPUの物理アドレス空間のどの範囲をPCI Expressに割り当てるかということなのですが、好きなだけ確保してください。実際にそのサイズのメモリを用意しなくても良いわけです。

K7pcie_4

その次は、ベンダIDなどを指定します。1BC8というのは特殊電子回路のベンダIDです。

K7pcie_5

1BC8を10進数にすると7112なので、もう少し早く取れば7110(ないとう)になったので、すごく惜しかったと思います。

ベースクラス以下11 00 00というのは、汎用のData aquisition and signal processing controllersのDPIOモジュールを意味するので、FPGA拡張ボードなどの用途にぴったりです。

その次から先の数ページ分の画面では、特に設定する必要はありませんし、実際には変更してもメリットはないでしょう。拡張コンフィギュレーション空間とか、エラーレポートとか、パワーマネージメントとか使う必要ないでしょうね。

K7pcie_6

最後から2ページ目のここは、ちょっと気になります。デフォルトではトランザクション層のバッファに使われるBRAMにパイプラインレジスタを入れない設定(none)になっています。以前、数値計算回路でBRAMを250MHzで動作させた際に、タイミングエラーが生じたことがあるので、もしタイミングエラーが生じたときにはバッファを有効にしたほうがいいかもしれません。

最後のページも特に変更する必要はありません。レーン反転はUCFファイルの設定でも何とでもできてしまうので、ダイナミックに変える必要も感じません。

リファレンスクロックは100MHz、125MHz、250MHzが選べますが、マザーボードから送られてくるクロックは100MHzなので変更する必要もないでしょう。

K7pcie_8

まとめると、最低限設定する必要があるのはレーン速度、幅、ベンダID、デバイスID、BAR空間くらいです。簡単ですね。

sun

Generateすると、ipdore_dirにpcie_7x_v1_9というディレクトリができて、\ipcore_dir\pcie_7x_v1_9\example_designにxilinx_pcie_2_1_ep_7x.vhdというファイルができます。基本的にはこれをトップデザインとしてビルドすればよいのですが、このファイルはGenerateするたびに上書きされるので、そのまま使うのではなく、内容をコピーして自分で作ったVHDLファイルに貼り付けて使います。

UCFファイルもCoreGenのipcore_dirの中に見つかるはずです。

プロジェクトの構成は下の図のようになるはずです。

K7pcie_9

inst_pcieというのが、xilinx_pcie_2_1_ep_7x.vhdをコピーして作ったモジュールです。中にはpcie_7x_v1_9というコア(PCI Expressの本体)と、app(BARメモリ空間に実装されたメモリマップドI/O)などがあります。

そのほかに設定する必要があるのはsys_clk_p/nのピン配置とsys_rst_nのピン配置です。sys_rst_nは、PCI ExpressのPERSTBです。sys_clk_p/nはPCI ExpressのREFCLKをGTXに入れているピンです。UCFで設定すればよいでしょう。

NET "sys_rst_n" LOC = H13 | IOSTANDARD = "LVCMOS18" | PULLUP;
NET "wake_op" LOC = G14 | IOSTANDARD = "LVCMOS18";
NET "sys_clk_p" LOC = "H6";
NET "sys_clk_n" LOC = "H5";

回路設計上の問題として、PERSTBやREFCLKをそのままFPGAにつなぐのは避けたいところです。何らかのバッファICを入れたほうがいいでしょう。

sun

ただし、CoreGenのサンプルをそのままビルドしても動きません。

なぜならば、PIPE_MMCM_RST_Nという信号があるのですが、この信号は'0'のままでリセットがかかりっぱなしになっているからです。PIPE_MMCM_RST_Nという信号は

K7pcie_10


と、signal文の初期値を使って'1'に指定されているのですが、XSTはこれを無視します。example designではPIPE_MMCM_RST_Nに値を代入している部分はないので、source less signalとして常に0になってしまうのです。

だから、自分で

PIPE_MMCM_RST_N <= '1';

と書いてやらねばなりません。これに気が付かないと焦ります。

あと、UCFファイルはBRAMの位置をLOCで固定しているところと、GTXE2_CHANNEL_X0Y4などをLOCで固定している箇所はコメントアウトして、

NET "pci_exp_txp(0)"  LOC = "H2";
NET "pci_exp_txn(0)"  LOC = "H1";
NET "pci_exp_rxp(0)"  LOC = "J4";
NET "pci_exp_rxn(0)"  LOC = "J3";

のようにピン番号で配置を指定したほうがわかりやすいでしょう。

これでPCI Expressが認識されるようになりました。

K7pcie_11K7pcie_12

|

« Kintex-7 PCI Express基板の実装が上がってきた | トップページ | Kintex-7のPCI Expressリンク幅と速度 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Kintex-7 PCI Express基板の実装が上がってきた | トップページ | Kintex-7のPCI Expressリンク幅と速度 »