Kintex-7のXC7K160T FGG484は、GTXのBankが1個しかありません。
このGTX Bankには4つのGTXのチャネルが入っていますが、それぞれのチャネルを異なるプロトコルにできるでしょうか?
答えはYESです。
実際にどういうことかというと、例えば、Kintex-7にPCI Expressをインプリメントすると、CoreGenではGTXと内蔵EndPointを使うデザインが作られます。PCI Expressをx1にすればあと3個のGTXチャネルは自由に使えるはずです。
残った3個のGTXを使うにはどうしたらよいでしょうか。
やり方は簡単。まずはCoreGenでGTXのコアを作ります。
作ったコアをgtx_transceiverという名前にしておくと、ipcore/ディレクトリにgtx_transceiver.vhdとgtx_transceiver_gt.vhdというファイルが生成されます。
ここで、プロジェクトからCoreGenの.xcoを外します。
そして、gtx_transceiver.vhdとgtx_transceiver_gt.vhdを手動で追加します。
ポイントはCoreGenの.xcoを外して、.vhdを見つけてきて手動で追加する、ということです。
PCI Expressとオリジナルプロトコルを両方追加するとこんな感じになります。
CoreGenのプロジェクトではなく、ただのVHDファイルになっています。
基本的にはこれでよいのですが、PCI ExpressのGTXと、自分で作ったGTXの両方でGTXE2_COMMONというプリミティブを内部でインスタンシエートしているので、リソースが競合してしまい、インプリメントでエラーとなります。
したがって、PCI Expressか、自分プロトコルか、どちらかのGTXからGTXE2_COMMONを外さなければなりません。
当然、自分プロトコルの方から外します。CoreGenが作ったPCI Expressのコードはさわらぬ神にたたりなしというほど複雑なので、いじりたくありません。
素性のわかっているgtx_transceiver_GT.vhdを開きます。そして、GTXE2_COMMONをコメントアウトします。
-- gtxe2_common_0_i : GTXE2_COMMON
-- generic map
-- (
-- -- Simulation attributes
-- SIM_RESET_SPEEDUP => WRAPPER_SIM_GTRESET_SPEEDUP,
-- SIM_QPLLREFCLK_SEL => ("001"),
-- SIM_VERSION => "4.0",
--
--
-- ------------------COMMON BLOCK Attributes---------------
-- BIAS_CFG => (x"0000040000001000"),
-- COMMON_CFG => (x"00000000"),
-- QPLL_CFG => (x"0680181"),
・・・中略・・・
-- BGPDB => tied_to_vcc_i,
-- BGRCALOVRD => "00000",
-- PMARSVD => "00000000",
-- RCALENB => tied_to_vcc_i
--
-- );
GTXE2_COMMONはデバイスに1個しかないから、これをコメントアウトしないとPCI Expressのものと競合してしまうのです。
そもそもCOMMONが何をしているかというと、QPLLとクロックのルーティングくらいのようです。
CPLLを使うようにしておけば、QPLLは使わないので、PCI Expressのほうのデザインにお任せしてしまってもいいわけなのです。
これで、PCI Expressと独自プロトコルのGTXが1つのGTX Bankに同居できました。
速度や形式の異なる2つ以上のプロトコルを同居させる際のご参考にしてください。
最近のコメント