KC705でSATA (1)

SATAは別ボードで気楽に使うAxfmc6040というアプローチがいいんじゃないかなーと思いながらも,ロジックをのせたFPGAから直接SATAにアクセスできる方が嬉しいというケースもあります.というわけで,2015年4月時点でまだまだコストパフォーマンスに優れている(個人の印象です)KC705にSATAをつないでみましょう.

Spartan6のGTPのコンフィギュレーションにはSATAプリセットが用意されていて便利だったのですが,Kintex-7のGTXのコンフィギュレーションにはSATAプリセットが用意されていません.というわけで,ドキュメント読みつつSpartan6のパラメタも参考にしつつパラメタを設定してみました.

この記事は現在試行錯誤中の内容につき,パラメタなど正しくない可能性があります.参考にされる場合は自己責任でお願いいたします.

実験環境

PCIeエッジをSATAコネクタに変換するデザインゲートウェイさんのアダプタを使って,KC705とSATAを接続しました.

Exif_JPEG_PICTURE

コンポーネント図

コンポーネントは,こんな感じです(あとで書く)

クロックは,オンボードの200MHzオシレータの出力をCPLLのREFCLOCKに直接供給(IBUFDSだけを経由)し,GTXのTXOUTPUTCLKからでてきたものを300MHz,150MHz,75MHzに変換して使いました.

GTXのコンフィギュレーション

一般人の味方,CoreGeneratorで作成します.冒頭にも書いた通り,SATA用のプリセットがないので,自分でパラメタを入力していきます.ちなみに,sata_gtxという名前をつけました.ウィザードは1/7〜7/7までの7ページあります.

1/7

GTXしか選べないので,そのまま.

2/7

Protocol templateは”Start from scratch”を選択します.まずはGen2を試すことにして,Line Rateを3Gbpsに設定.リファレンスクロックは供給する200MHzを指定します.PLLはChannel PLLを選びました.

3/7

TX/RXともに,データ幅 16Bits,Encoding 8B/10Bに設定.自動的に内部データ幅は20 Bitsになります.Enable TX Buffer/Enable RX Bufferはチェックをいれます(多分デフォルト).

4/7

RXCOMMA Alignmentはそのままに.Optional PortsでRXSLIDEとRXBYTEISALIGN,RXCOMMADETを有効にします.この辺りはSpartan6のGTPの設定を参考にしました.また,この画面で,Terminal and Equalizationの設定として,RX Terminaton Voltageを800mVに設定.

5/7

OOBの設定です.ここは,いろいろと変更.試行錯誤中なので不要なものもあるかもしれません.

  • SATA COM sequenceはデフォルトのBurst/Idles=7/7のままでおいておきました.GTPの設定のときはTXのBurst=15,RXがBurst/Idles=4/4だったのだけど…
  • “PCI Express Parameters”の”Transition Time”はSpartan6の設定を参考に,To P2=100,From P2=60,To/From Non P2=25に変更.”Optional Ports”では,RXSTATUS,COMINITDET,COMWAKEDET,TXCOMINIT,TXCOMWAKE,TXELECIDLEを有効にしました.
  • “OOB signalling and PRBS”の”Use RX OOB Signal Detection”を有効に.
  • GTPの設定ではClock correctionのシーケンスが有効だったので,同じように有効にします.”Use Clock Correction”のチェックを有効にし,シーケンス長を4に設定.

6/7

5/7で指定したClock correctionのシーケンスを指定.次の通り.

  • 10111100, K Character
  • 01001010
  • 01001010
  • 01111011

7/7

サマリです.TXUSRCLKは300MHz,TXUSRCLK2は150MHzなんじゃないかな…と思いますが,特に何もせず.”Generate”をクリックしてウィザードを完了します.

生成されたコードの修正

AR# 53364 に従って,RXCDR_CFGの値を設定します.CoreGenで生成した プロジェクトディレクトリ/ipcore_dir の下に,sata_gtx_gt.vhdというファイルの値を変更します.(sata_gtxはCoreGenでGTXラッパーのIPコアにつけた名前に由来しています)

リンクアップ・シーケンス

SATAの初期化シーケンスでGTXコアをたたいてあげます.こんな感じですね.

  • OOB操作なCOMINIT→COMWAKE
  • D10.2を送り
  • 続いてALIGNを検出(D10.2-K28.5を送り合う)し
  • 最後にSYNCが送りあう

リンクがあがった?

というわけで,COMINIT→COMWAKE→ALIGNの検出→SYNCまでの一連の初期化が完了したところが次のスクリーンショットです.

init_wake

linkup

デバイスIDを読んでみる

リンクが確立できたので,以前開発したSATAコアの上位層とつなぎこんで,デバイスIDを読んでみます.デバイスIDを読むFISは

0x00ec8027
0x00000000
0x00000000
0x00000000
0x00000000

 ですね.で,読んでみたところ結果が下の写真.5F605800(のひっくり返った値)を先頭に,データが返ってきました.

device_id

シェアする

  • このエントリーをはてなブックマークに追加

フォローする