例によってこちらのカメラの開発途中に、Spartan-7 のDPHY-TXの速度を動的に変更したいという要望が出てきました。
KV260 は DPHY の速度は 1レーンあたり 1250Mbps まで出るのですが、ZYBO Z7 では、950Mbps が上限だからです。
それぞれでROMを焼き直してもいいのですが、面倒も多いので、接続時に I2C から速度を変更できるようにしてみました。
具体的には、AMD の DPHY-TX のIP にはいくつかのクロックを供給しなければいけないのですが、このなかで通信速度の半分の周波数のクロックを位相が90度のものと合わせて2つ供給しなければなりません。
そこでこのクロックを生成しているMMCMの設定を動的に変更してみることにしました。MMCMやPLLの周波数変更はDRPポートを読み書きすることで可能で、詳細は XAPP888 にあります。
とはいえ、データシートを真面目に読んで値を作るよりも、コアジェネレータでIPを生成して、どういう値になっているか読み出してみる方が間違いが無さそうです。

そこで、ZYBO用の 950Mbps の為の、475MHz 設定の MMCM と、KV260 用の 1250Mbps の為の 625MHz の設定と2つの設定を作って値を読み出してみました。

GUIで生成したIPは開いていくと内部ソースが覗くことができ、MMCME2_ADV のインスタンス生成が見えます。
読み書きのやり方は意外に簡単で、UG427 に説明のある MMCME2_ADV に対して、リセットを掛けた状態でクロック(DCLK)を入れて、アドレス(DADDR[6:0])と、DEN、DWE、DI[15:0]、DO[15:0]、DRDY などを使って読み書きするだけです。注意点はデータが出てくる DRDY まで待つ必要がある点でしょうか。

今回はもともとI2C経由でイメージセンサーの16bitのレジスタにアクセスする為のインターフェースを準備していたので、同じ 16bit で比較的簡単に実装できました。
興味本位でデータシートにないアドレスも全部読んでみましたが下記のようになっていました。

灰色部分はXAPP888に記載のなかったアドレスですが何か値が入っている部分があるようです。
結果的に黄色い部分だけが差分となりました。
以上、作業記録みたいなものですが、同じことをしようとする方の参考になれば幸いです。
コメント