ZYNQのADCボード、ADCからの信号を確認!
ZYNQのADCボード「Cosmo-Z」で、ADCからの信号が確認できました。
このボードで使っているADCは、AnalogDevices社のAD9633というもの。最高125MHz 12bitのLVDS2組で信号を出してきます。125MHzで12bitということはビットレートが1500Mbpsにもなってしまうので、さすがのLVDSでも厳しくなります。そこで、2ペアのLVDSに分散させて信号を送ることでデータレートを750Mbpsに抑えることができます。
LVDSで送ってくる信号をZYNQで受けるときに、DIFF_TERMをONにしておくと、FPGA内で終端抵抗を入れてくれるので便利です。DIFF_TERMを使うには、IBUFDSをインスタンシエートするときに、genericで
inst_ibufds_adc2_0c : IBUFDS generic map (
DIFF_TERM => TRUE
)
port map (
I => adc2_d0c_p_ip,
IB => adc2_d0c_n_ip,
O => adc2_d0c
);
と指定します。またVCCO=1.8Vにしておく必要があります。(HR I/OでLVDS_25ならばVCCIOを2.5Vにする)
さて、AD9633から送られてきたデータはFPGAで正しく受け取れているでしょうか。それをサクッと調べるには、バウンダリスキャンが便利です。バウンダリスキャンというのは、瞬間瞬間のFPGAの端子の状態(H/L)をJTAGを通じて読み出すことができる技術です。
バウンダリスキャンを行うためのツールには、MITOUJTAG(みとうジェイタグ)というソフトウェアを使います。MITOUJTAGでバウンダリスキャンをして波形にしてみると・・
このように、PとNが対称的な波形になっていることがわかります。LVDSの+と-ですから、対称的になるのは当然なのですが、面白いことに、LVDSの信号は数百MHzで動いていて、バウンダリスキャンはせいぜいkHzのオーダーなのですが、ちゃんとPとNが対称的に動いているということです。
バウンダリスキャンのサンプリングは、すべての端子が時間的に同時に行われるので、遅いサンプリングでもLVDSの対称性が見えるのです。
さて、AD9633には内蔵レジスタがいくつもあって、SPIを通じて様々な値に設定できます。VREFの電圧とか、オフセットとか、様々なパラメータをSPI経由で設定できます。
ZYNQのソフトウェアを作って、この内蔵レジスタの値を表示してみることにしました。下記の図のような感じで、内蔵レジスタの設定が見えます。
見るだけではなく、レジスタを書き換えることができるようにもしました。それが、アドレスの0x0dのレジスタ。「Test mode」
このレジスタをいじると、LVDSの出力がADC変換値ではなく、テスト用のパターンに変更できます。つまり、100000000000とか、101010101010といった固定パターンを出すことができるようになります。この機能を使ってZYNQ内のISERDESのキャリブレーションをしようというわけです。
とりあえず、UARTのコンソールからwrreg d 1で、midscale shortというパターンを出してみました。
ADC変換値を出力していたのが、ピタッと止まります。デフォルトではADCは2の補数出力なので、midscaleは000000000000だからです。
次に、wrreg d 2とコマンドを与えます。これは+full scaleの出力です。
今度は動き出しますが、D1A、D1B、D1C、D1Dの方だけが動きます。D0Aは下位6ビット、D1Aは上位ビットを示しています。011111111111を出力しようとしているので下位6bitは1のまま、上位6bitは011111を出力しているから、H:Lは5:1の割合で出てくることになります。
どうやら、ADCはちゃんと動いているようです。PとNが対称的に見えているので、FPGAの端子への接続やクロストークも問題なさそうです。
このようにバウンダリスキャンを使うと、端子の状態をすぐに見ることができます。ChipScopeなどと違い、FPGAに何もプログラミングされていない状態でも使えるので、FPGAの中身をまだ作っていない開発の初期段階からすぐに使えるので便利です。
次はISERDESのDELAYを自動調整する回路を作ります。
| 固定リンク
コメント