FPGAでLVDS通信を
高速通信に使える差動信号LVDSの使い方について、Xilinxの7シリーズを例に説明します。
まず前提として、LVDSの説明を少しだけ。
LVDSは差動信号であり、2本の信号線をペアで使用して通信を行います。この方法は、シングルエンドの通信に比べてノイズに強く、高速信号で用いられます。
ノイズに強い分、電圧を低くすることが可能で、何ボルトを使用して何Ωで終端するかによって似た差動信号の規格がいくつか存在します。これらの差動信号は、例え信号の電圧が同じでも、駆動電流量が違ったり、終端方法が異なるため互換性はありません。必ず規格が一致していることを確認してから接続する必要があります。
では、具体的にFPGAでLVDSを扱う時はどうすればいいでしょうか。
必要な項目を上げます。
1.電源電圧
FPGAはBANKごとに電源電圧を決めて、それに応じた電圧を入力します。
LVDSを使用するBANKは、電源電圧は基本的には1.8Vにします。基本的には、です。
XilinxのFPGAにはLVDS_25、LVDS_33という名称で1.8V以外の電源電圧でもLVDSが使えるという条件があります。
ピンには内臓の終端が使用出来るものが使用出来なかったり、デバイスファミリーによって対応していなかったりと使用には条件があります。
例えば、7シリーズの場合には、HPポートではLVDSのみが使用可能で、電源電圧は1.8Vにするしかありませんが、HRポートはLVDS_25のみが使用可能で、こちらの電源電圧は2.5Vにするしかありません。使いたいデバイスのピン種類はよく確認し、満足する電源電圧を供給してください。
ちなみに、7シリーズではLVDS_33は使用出来ません。
7シリーズにおいては「7 Series FPGAs SelectIO Resources User Guide (UG471)」に詳細が記載されています。
2.ピン配置
LVDSをFPGAに接続するときは、ペアピンに配置する必要があります。
ピンの名称でIO_L7P_T1_33、IO_L7N_T1_33のように、PとNで対になっているピンを使用します。対になっていないピンでLVDSを設定しようとしてもコンパイルが通りません。
ピンの名称が分からない場合には、pinoutファイルで確認して下さい。7シリーズのpinoutファイルのURLは下記の通りです。
Artix-7 FPGA Package Device Pinout Files
https://japan.xilinx.com/support/package-pinout-files/artix-7-pkgs.html
Kintex-7 FPGA Package Files
https://japan.xilinx.com/support/package-pinout-files/kintex-7-pkgs.html
Virtex-7 FPGA Package Device Pinout FIles
https://japan.xilinx.com/support/package-pinout-files/virtex-7-pkgs.html
Spartan-7 FPGA Package Device Pinout FIles
https://japan.xilinx.com/support/package-pinout-files/spartan-7-pkgs.html
また、LVDSの受信クロックを受ける場合には、単にペアピンというだけではなく、クロック入力ピンであることが必要です。
ピンの名称でMRCCやSRCCと書かれているのがそうです。
MRCCは「Multi-region clock-capable」の略でSRCCは「Single-region clock-capable」の略です。MRCCのほうがMulti-region、つまり複数の領域に届くクロックです。どちらも空いている場合は、MRCCを優先的に使用してください。
LVDSは上記の通りペアピンへ接続することで使用出来ます。複数の同期したLVDS信号がある場合には、全て同じBANKへ接続します。
同じBANKに接続する理由はクロックです。特に、5ペアのLVDSがあり、そのうち1セットがクロックという場合、別のBANKに接続してはタイミングが満足出来なかったり、後述するリファレンスデザインが使えなくなったりします。
接続するピンを決定したら、IOSTANDARDでLVDSであることを宣言します。
set_property IOSTANDARD LVDS [get_ports "clkin1_*" ];
set_property IOSTANDARD LVDS [get_ports "datain1_*"] ;
のように、xdcファイルに記入します。これもリファレンスデザインのソースコードに含まれていますので、適時参照ください。
3.リファレンスデザイン
LVDSの通信にはリファレンスデザインを参考にします。
理由は周波数が高いからです。
信号の周波数が高いと、パターン配線長の違いによる位相のずれや、温度による位相のずれが無視出来なくなります。その補正を行うための方法やパラレル変換して、FPGA内で処理可能な周波数まで落とす機能がリファレンスデザインには含まれています。
Zunq-7000シリーズにおいては「LVDS Source Synchronous 7:1 Serialization and Deserialization Using Clock Multiplication (XAPP585)」というアプリケーションノートにリファレンスデザインの説明と、リファレンスデザインのソースコードのリンクが記載されています。
リファレンスデザインのソースコードをダウンロードするには、xilinxにユーザー登録が必要です。Vivadoをダウンロードするときに登録済みかと思います。ログインする期間が空いていたりすると、登録情報に変更がないのかの確認が入ります、費用がかかるわけではありません。
シリーズが違えばリファレンスデザインも異なります。UltraScale用にも別のリファレンスデザインがありますので、適したリファレンスデザインを使用して下さい。ただし、全てのデバイスに対してリファレンスデザインが用意されているわけでもありません。存在しない場合には、別のシリーズのリファレンスデザインをベースに変更します。
資料を見て頂ければ分かるのですが、リファレンスデザインは受信クロック1ペアと、データ5ペアで設計されています。作りたい設計とは違うと思いますので、ソースコードをダウンロードして、必要な変更をします。
このとき、LVDSで入ってくる信号は周波数が高く、そのままの信号をFPGAの中で引き回すのは無理だと認識してください。かならずISERDESと呼ばれる機能を使用して、パラレル信号に変換、周波数を下げてからロジックで処理します。
リファレンスデザインで理解するべきは、
1.クロックの再生に使用するPLL/MMCMの使い方
2.位相のずれを吸収するためのIDELAYの使い方、
3.シリアル/パラレル信号に変換するためのISERDES/OSERDESの使い方
の3点です。
ソースコードのトップ層はVerilog_exampleフォルダにあります。
top_txrx_0525m.v と top_txrx_1050m.v の2種類がありますが、これは周波数が違うだけですので、どちらを参考にしても構いません。
Verilog_src にはトップ層から呼び出されるソースコードがあります。
リファレンスデザインの資料と、ソースコードを見ながら作業が出来ますので、それほど難易度は高くないと思いまが、IDELAY、ISERDES、OSERDESとあまり使わない機能を使用しますので、そこだけは資料の読み込みが必要です。