Spartan3EのふつうのI/Oで、320MbpsのLVDS通信をやってみました。
ある仕事で、320Mbpsで送られてくるLVDSの信号を特別なチップを使うことなしに汎用のFPGAのI/Oポートで扱うことができるようにする必要がありました。その信号はシリアル通信なのでI/OからFPGAの中へ入れた後、パラレルに変換し、後はFPGAの中で数十MHzで処理するというものです。
FPGAの中の信号処理の部分は数十MHzでいいのですが、通信だけはめちゃ速いのです。
問題なのは、Spartan3EのI/Oが320MHzについてこれるかどうかです。
データシート上は320MHzでも大丈夫です。
ためしにWebPACK7.1で3ビットのカウンタを作ってみると、363MHzという数字をはじき出します。
4ビットでも362MHzですが、5ビットになると273MHz、6ビットなら228MHz、7ビットなら224MHz、16bitなら195MHz、32ビットで160MHzと、どんどん下がっていきます。
これはSpartan3Eの論理演算が4入力1出力を基本とするLUTでできているからです。そのため、4ビット以上の入力が出てくる論理式があるとそこがボトルネックとなって、速度が遅くなってしまいます。
Spartan3Eは、おそらく150~160MHzがちょうどよい速度なのでしょうか。
320Mbpsで動かすのはシリアル信号を入力する部分だけなので、入力に直結したシフトレジスタだけをすごく単純に作って320Mbpsで動いてくれればいいのですが、そのモジュールを何個もFPGAに入れて、そのほかにもSDRAMアクセス回路やいろんな演算回路を入れると、ちゃんと作ったモジュールがそのままの形で維持されるかどうかは不安です。
ちなみに、WebPACKがSpartan3Eでは260MHzだよとレポートした回路でも、Virtex2PやVirtex4でコンパイルしてみると700MHz台を出しました。すごいですねVirtexシリーズ。しかも、Virtex4には全入力にシリパラ変換機能が埋め込まれているとか。私が欲しいのはまさにそれですよ、ISERDES!
でも、今回使うFPGAはSpartan3Eにもう決まっているので、デシリアライザーみたいなのを自分で作らなければなりません。どうしたもんか、と考えていて、思いつきました。
Spartan3EのI/Oには、DDR用のレジスタが入っています。
今回の案件では、幸いなことに320MHzで送ってくる信号の元となるクロックはFPGAが作り出しています。
(データを送る側のPLLは別なので、ジッタが心配)
それならばDDRレジスタで受ければ、FPGAの中は160MHzで動けばいいんじゃないか、と。
そこで、やってみました。
手元にSpartan3E のSample Packがありました。
このSample Packにのっているクロック発振ICはジッタが多いので、24MHz水晶発振器を外付けしました。FPGAの中のDLLで320MHzに逓倍します。
まず、FPGAのODDRプリミティブをつかって、320Mbps相当の信号を作り出しました。
FPGAの中は160MHzで動作していますが、オシロで観測すると確かに320Mbps相当です。
DDRすごい。
100MHz帯域のオシロなので波形は綺麗に取れていませんが、ちゃんと見えます。
1(同期用ビット)→0(同期用ビット)→0(フラグ)→0(フラグ)→ランダムデータ(8bit)
という繰り返しがはっきりと見えます。
受信のモジュールは下のイメージ図のように、DDRで受けて中は160MHzで動かします。
送信側で擬似乱数のデータを送って、それを受信して乱数の系列に誤りがないことを確かめたところ、30分くらい動かしてみましたが、全く問題はなさそうでした。通信のレートは320Mですが、12bitで出来た1つのフレーム内で8ビットのデータを送っているので、毎秒26.6Mフレーム送ることになり、チェック対象データは1秒間に213Mビット送られます。30分動かしたので、送ったビットのうちチェック対象の部分は383Gbit。エラーは一つもありませんでした。
FPGAがデコードしたデータを、MITOUJTAG BASIC 1.2.4のBLOGANA機能で見てみます。BLOGANAというのは、MITOUJTAGに内蔵されているChipScopeみたいな機能です。
iMPACTに代わってMITOUJTAGでFPGAに書き込み、ChipScopeに代わってMITOUJTAGでFPGAの内部信号を観察します。160MHzの動作クロックでも余裕で動き、データの取り逃しもありません。最近のMITOUJTAGは、ウン百MHzの信号もちゃんと見えるんですよ。
なお、上の基板の写真の左側に映っている2本のひょろっとした線が、LVDSの配線です。
高周波的なことを考えれば劣悪な環境でしょうけど、ちゃんと通信できるのですから、LVDSってすごいですね。
もうちょっと頑張ってFPGAの中を240MHzで動かせば、通信を480Mbpsで動かせそうですね。
すると、普通のFPGAだけでUSB2.0HighSpeedを実現できる可能性が・・
目指せ、480M!
最近のコメント