JESD204BでDACにデータ送信

DJC3geTUwAQpmyz.jpg

はじめに

JESD204B接続のDAコンバーターを高価なIPコアなしで使えるようになるまでの記録です。

今回は、Xilinx Kintex-7からJESD204B/1Lane/6.25Gbps/Subclass0の信号を出力し、DAコンバーター(AD9161)を動作させることに成功しました。

「このDAコンバーターはJESD204Bで接続する必要があるらしい」

「JESD204BのIPコアが必要らしいよ」

「代理店にIPコアの値段聞いたら信じられないお値段が返ってきた」

「自分で実装してみた」

必要なもの

  • FPGAボード KC705 (Xilinx Kintex-7)
    • FMCコネクタにギガビットトランシーバーの端子が出てるやつならどれでもOKだと思う
    • ギガビットトランシーバのレーン数とDACの対応によって、DAC内蔵の補間機能を無効化できないことがあるので注意
    • 例:AD9162は8レーン接続でないと補間機能を無効化できない
  • DAコンバーター AD9161-FMCC-EBZ
    • Analog Devices製 最高6GspsとかいうバケモノみたいなDAC
    • 上位機種のAD9162では8レーン接続の場合は補間機能を無効にできるが、AD9161は無効にできない
    • 上位機種のAD9162では8レーン接続の場合はIQ変調なし直接出力できるが、AD9161は内蔵のIQ変調を無効にできない
  • FPGA開発環境 Vivado

AD9161について

AD9161の重要な特徴は、IQ変調にのみ対応という点です。(上位機種のAD9162は、8レーンの場合のみIQ変調なし直接出力が可能)

IQ変調の詳細な説明は省きます。

IQ変調では、実数成分と虚数成分の2つのDAコンバーターが必要です。ここで重要なことは、AD9161は内部に仮想的に2個のDAコンバーターが内蔵され、JESD204BではDAC2個分のデータを送信する必要があります。

AD9161を1レーンで使用するときのリンク接続パラメータ

  • L(レーン数):1
  • M(コンバーターの数):2
    • IQ変調なので2個
  • F(1フレームのオクテットの数):4
  • S:1
  • K(1マルチフレームのフレームの数):32
  • N(1サンプルのビット数):16
    • DACの分解能のビット数+コントロールビットの数+ダミービットの数
  • N'(DACの分解能のビット数):16
    • Nからコントロールビット・ダミービットの数を引いたもの

JESD204Bって何

JESD204Bとは、高速なDAコンバーター/ADコンバーターを接続するための規格です。詳しくはググって。Analog Devicesとかが詳しい資料出してるからね。

http://www.analog.com/jp/applications/landing-pages/001/jesd204-serial-interface-jedec-standard-data-converters.html

http://www.analog.com/media/jp/technical-documentation/technical-articles/JESD204B-Survival-Guide_jp.pdf

前提知識

8b/10b

IBMが開発した、8bitを10bitに変換する方式。1シンボルは10bitで1オクテットの情報を表す。通常のデータを送信するためのDコードと、制御信号のためのKコードの2種類のシンボルがあります。

オクテット

8b/10b変換される前の8bitのこと。1オクテット(8bit)を8b/10b変換すると1シンボル(10bit)になる。

フレーム

オクテットを何個か組み合わせたもの。1フレームが何個のオクテットで構成されているか、Fというパラメータで表される。

マルチフレーム

フレームを何個か組み合わせたもの。1マルチフレームが何個のフレームで構成されているか、Kというパラメータで表される。

8b/10bのKコード

8b/10bには、制御のためのKコードが含まれる。Kコードには、2種類の表記方法がある。/K/ というように、スラッシュで囲む方法、K28.5のように、Kの後に番号をつける方法。これらの文字が出てきたら、8b/10bのKコードである。

JESD204Bでは、下記の4種類のKコードが使われる。

  • /K/ [K28.5]   グループ・シンクロ文字
  • /R/ [K28.0] マルチ・フレーム先頭文字
  • /Q/ [K28.4] リンク・コンフィギュ先頭文字
  • /F/ [K28.7] フレーム・アライメント
  • /A/ [K28.3] レーン・アライメント文字

JESD204Bのプロトコル

JESD204Bのプロトコルについて、DAコンバーターを最低限動作させるだけに必要な知識をまとめます。JESD204B/SubClass0/1レーン/スクランブル無効 について解説します。

JESD204Bの信号線

JESD204Bには、下記の3種類の信号線があります。

  • Lane
    • 方向:FPGA→DAC
    • メインのデータ線
    • 8b/10b変換されたデータを流す
  • SYNC~
    • 方向:DAC→FPGA
    • 受信側から送信側に正常に受信できているかどうかを通知する
    • H:正常に受信中 L:受信に失敗した
    • Lレベルになったら、送信側はハンドシェイクを最初からやり直す
  • SYSREF
    • Subclass0では関係ないので考慮しない

JESD204Bの接続の確立(ハンドシェイク)

JESD204Bには、下記の3つのフェーズがあります。CGSとILASが完了すると、接続が確立し、データ送信が始まります。

  • CGS (code group synchronization)
  • ILAS (initial lane synchronization)
  • データ送信

ハンドシェイクは、下記の順番で行われます。

  1. CGS (code group synchronization)
    1. SYNC~がHになるまで、レーンに/K/ を送信し続ける
    2. SYNC~がHになったら、ILASに遷移
  2. ILAS (initial lane synchronization)
    1. 4個の特殊なマルチフレームをLANEに送信
      1. マルチフレーム1: 先頭は/R/、末尾は/A/。残りはダミーデータで埋める(今回は8b/10bエンコードされた0x00)
      2. マルチフレーム2:/R/ /Q/で開始、次に14オクテットのリンク接続パラメータ。末尾は/A/。残りはダミーデータ。
      3. マルチフレーム3:マルチフレーム1と同じ。
      4. マルチフレーム4:マルチフレーム1と同じ。
      5. ILASのマルチフレーム1個はK個のフレーム、(K*F)個のオクテットで構成される。
    2.  4個のマルチフレームの送信が終わったら、データ送信を開始。
    3. SYNC~がLになったら(エラー発生)、CGSからやり直す。
  3. データ送信
    1. DACに送りたいデータを8b/10b変換してLANEに送信
    2. サンプルを送る順番(アライメント)は、データシートを読んで調べる。
    3. SYNC~がLになったら(エラー発生)、CGSからやり直す。

単純にいうと、こういうことです。

  1. SYNC~がLなら、/K/を送信し続けろ。
  2. SYNC~がHなら、ILASを送信しろ。
  3. ILASが送信し終わったら、データ送信を開始しろ。
  4. SYNC~がLになったら、最初からやり直せ。

この4つをFPGAに実装すればDAコンバーターを動かすことができます。

Xilinx Kintex-7の高速シリアル通信トランシーバー(GTX)

JESD204Bで必要な高速シリアル通信には、Kintex-7の高速シリアル通信トランシーバー(GTX)を使用します。GTXは8b/10b変換もやってくれるので実際便利。このGTXは、Vivadoで”7 Series FPGAs Transceivers Wizard”を使うことで構成できます。

具体的な手順は以下の通りです。

  1. JESD204Bの信号をどのGTXから出力するのか設定
  2. RX offを設定
  3. 基準クロック入力端子を設定
  4. プロトコルをJESD204に設定
  5. ビットレートと基準クロックを設定

GTXのデータ入力について

GTXの [31:0]gt0_txdata_in,[3:0]gt0_txcharisk_in が、データ入力です。この入力を8b/10b変換したものがGTXのSerDesによってレーンに送信されます。

GTXには、一回に4オクテットを送信するように32bitに設定しました。gt0_txdata_in[7:0]が最初に送信されるオクテット、gt0_txdata_in[31:24]が最後に送信されるオクテットです。

gt0_txcharisk[0]が、1個目のオクテットがKコードかどうかを示します。1ならKコード(制御コード)、0ならDコード(通常のデータ)です。同様に、gt0_txcharisk[1]が2個目のオクテット……といったように続きます。

txchariskが1のとき、txdataに入れたデータと出てくるKコードの対応は以下の通りです。

  • /K/ [K28.5] → 0xBC
  • /R/ [K28.0] → 0x1C
  • /Q/ [K28.4] → 0x9C
  • /F/ [K28.7] → 0xFC
  • /A/ [K28.3] → 0x7C

8b/10bエンコードする前の信号の波形

(模式的に作ったものなので実際の波形とは違うかも)

txdata[31:0]とtxcharisk[3:0]がGTXに渡されるデータです。

lane0_data0,lane0_data1,lane0_data2,lane0_data3は、txdata[31:0]とtxcharisk[3:0]をわかりやすいように1オクテットごとに分けたものです。data0が最初に送信されます。1〜8ビットがtxdata、9ビット目はtxchariskです。

CGS→ILAS1

/K/ /K/ /K/

/R/ 0x00 0x00 0x00 0x00 …

(/K/ : 0xBC,  /R/ : 0x1C)

このように、CGSでは/K/を送信し続けることがわかります。

また、SYNC~が立ち上がることでILAS1の送信が開始されます。ILAS1のマルチフレームの先頭は/R/です。

ILAS2 – リンク接続パラメータ

ILAS1の末尾とILAS2の先頭です。

ILAS1が/A/で終了しています。

また、ILAS2が/R/ /Q/から開始し、次に14オクテットのリンク接続パラメータが続きます。

/R/ /Q/ 0x00 0x00 0x00 0x00 0x03 0x1f 0x01 0x0f 0x0f 0x20 0x80 0x00 0x00 0x43 …

DAコンバーターのSPI設定

DAコンバーターを使えるようにするためには、JESD204Bのハンドシェイクを更新する前に、SPI経由でクロックジェネレーターとDAコンバーターの設定を行う必要があります。

  1. PLLクロックジェネレーターのレジスタの設定をSPIで行い、規定のクロックを発振させる
  2. DACのレジスタの設定をSPIで行う
    • JESD204Bのレーン数
    • 補完の有無
    • スクランブルの有無
    • NCO設定
  3. JESD204Bのハンドシェイクを開始する
  4. JESD204Bでデータを送信する
  5. DACが正常にデータを受信できているかSPIで確認する

今回使用したAD9161-FMCC-EBZは、PCと評価ボードをUSB接続し、付属の”ACE”というソフトを使うことでSPI経由での設定をすべて行うことができます。

スクリーンショット 2017-09-06 21.01.49.png

ACEでの注意点

  • JESD204Bのスクランブル無効化は、”AD9161 Memory Map”で設定する必要がある
  • Good Checksumが点灯する条件は、ILASのチェックサム検証が正しいとき。データ全部を検証しているわけではない
    • JESD204Bでは、誤り検出は8b/10bのランニングディスパリティのみ規定

参考資料

「JESD204B サバイバル・ガイド」 Analog Devices, Inc.
http://www.analog.com/media/jp/technical-documentation/technical-articles/JESD204B-Survival-Guide_jp.pdf

JESD204Bのはじめてのデータ受信: なひたふJTAG日記
http://nahitafu.cocolog-nifty.com/nahitafu/2017/01/jesd204b-d2b7.html

トランジスタ技術 2016年9月号

Analog Devices 無料セミナー「JESD204Bインターフェースとデータ・コンバータ基礎編」資料

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中