はじめに
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とかが詳しい資料出してるからね。
前提知識
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)
- データ送信
ハンドシェイクは、下記の順番で行われます。
- CGS (code group synchronization)
- SYNC~がHになるまで、レーンに/K/ を送信し続ける
- SYNC~がHになったら、ILASに遷移
- ILAS (initial lane synchronization)
- 4個の特殊なマルチフレームをLANEに送信
- マルチフレーム1: 先頭は/R/、末尾は/A/。残りはダミーデータで埋める(今回は8b/10bエンコードされた0x00)
- マルチフレーム2:/R/ /Q/で開始、次に14オクテットのリンク接続パラメータ。末尾は/A/。残りはダミーデータ。
- マルチフレーム3:マルチフレーム1と同じ。
- マルチフレーム4:マルチフレーム1と同じ。
- ILASのマルチフレーム1個はK個のフレーム、(K*F)個のオクテットで構成される。
- 4個のマルチフレームの送信が終わったら、データ送信を開始。
- SYNC~がLになったら(エラー発生)、CGSからやり直す。
- 4個の特殊なマルチフレームをLANEに送信
- データ送信
- DACに送りたいデータを8b/10b変換してLANEに送信
- サンプルを送る順番(アライメント)は、データシートを読んで調べる。
- SYNC~がLになったら(エラー発生)、CGSからやり直す。
単純にいうと、こういうことです。
- SYNC~がLなら、/K/を送信し続けろ。
- SYNC~がHなら、ILASを送信しろ。
- ILASが送信し終わったら、データ送信を開始しろ。
- SYNC~がLになったら、最初からやり直せ。
この4つをFPGAに実装すればDAコンバーターを動かすことができます。
Xilinx Kintex-7の高速シリアル通信トランシーバー(GTX)
JESD204Bで必要な高速シリアル通信には、Kintex-7の高速シリアル通信トランシーバー(GTX)を使用します。GTXは8b/10b変換もやってくれるので実際便利。このGTXは、Vivadoで”7 Series FPGAs Transceivers Wizard”を使うことで構成できます。
具体的な手順は以下の通りです。
- JESD204Bの信号をどのGTXから出力するのか設定
- RX offを設定
- 基準クロック入力端子を設定
- プロトコルをJESD204に設定
- ビットレートと基準クロックを設定
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コンバーターの設定を行う必要があります。
- PLLクロックジェネレーターのレジスタの設定をSPIで行い、規定のクロックを発振させる
- DACのレジスタの設定をSPIで行う
- JESD204Bのレーン数
- 補完の有無
- スクランブルの有無
- NCO設定
- JESD204Bのハンドシェイクを開始する
- JESD204Bでデータを送信する
- DACが正常にデータを受信できているかSPIで確認する
今回使用したAD9161-FMCC-EBZは、PCと評価ボードをUSB接続し、付属の”ACE”というソフトを使うことでSPI経由での設定をすべて行うことができます。
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インターフェースとデータ・コンバータ基礎編」資料