Cosmo-Zの外部クロック同期
Cosmo-Zを外部クロックで動作するように改造しています。
ADコンバータのサンプリングクロックに同期していない矩形波を入れると、下の図のように毎回すこしずつ違う波形が得られます。
これは、サンプリングポイントが毎回少しずつ変わるからです。
図にするとこんな感じです。
観測している信号とサンプリングクロックが同期していないので、毎回少しずつ違う場所を見てしまうのです。
それならば、観測している信号に同期したサンプリングクロックでサンプリングできるようにしてみましょう。
7シリーズにはBUFGMUXというプリミティブがあって2つのクロックを切り替えることができます。
実はBUFGMUXはBUFGと同じで、BUFGには元々クロック選択機能が備わっています。BUFGMUXから切り替え機能を無効にしたものがBUFGです。そのためBUFGから出たクロックをBUFGMUXに入れると「BUFG-BUFG接続」というWarningが出るのですが、無視して無理やり論理合成させることで、ADコンバータのクロックだけを外部クロックに同期させることができました。
ついでに、Vivadoでパッケージ化する際にgenericのパラメータに応じて出現させたりさせなかったりする方法を身に付けました。
やり方としては、VivadoでEdit Portする際に、Port Presenceに$の後ろにパラメータの名前を書けばいいようです。
これで、オプション的なポートをユーザのカスタマイズに応じて出したり出さなかったりできるようになります。
さて、実験用の回路は以下のようになっています。この基板はZYNQのメインクロックの100MHzとは別に、150MHzのGTX用の水晶が乗っています。GTX用水晶の150MHzをIBUFDS_GTE2で一般信号にひっぱってきて、それをPLLに入れて50MHzを作ります。その50MHzをピンヘッダ(ext_bp)から出して、別のピンヘッダのピン(extclk_ip)から入力し、PLLで100MHzに上げてAD変換モジュールに入れています。
言葉で書くと簡単なのですが、いざVivadoでやってみると、ImplementのRoutingで止まってしまって論理合成が進みません。どうやらクロックが多数あるような回路では、クロックをMRCCのピンから入れるだけではなく明示的にBUFGを追加しないといけないのかもしれません。BUFGMUXを使うとクロックの解析がとても大変になるのでしょう。
こうしてAD変換器に行くクロックだけを外部クロックに同期させてみたところ、下の図のように、何度サンプリングしても形が変わらないようになりました。
ちなみに、サンプリングするポイントを少しずつ動かしていくと等価サンプリングができますが、それは別の機会に。
| 固定リンク
コメント