« セキュリティキャンプへ応募を検討している皆様へ | トップページ | ADS54J60を交換してみたけれど »

2017.06.06

ZYNQのAXI HPポートを250MHzで動かすにはレジスタが必要

古い設計で恐縮なのですが、ISE+XPSでZYNQの開発をするときの注意点を見つけました。おそらくVivadoでも同じだと思います。

こういう↓フーリエ変換マシンを作っていて、

Fft_machine

たまに起こる演算間違いをなくそうして、この問題に気が付いた次第です。

sun

さて、AXI HPポートを使ってPLからPSのDDR3メモリを読み出したいのですが、AXI HPポートのクロックを250MHzにすると、-1のスピードグレードのZYNQではタイミングエラーが出てしまいます。

-1グレードのZYNQは250MHzでHPポートを動かせない・・というわけではなく、XPSの設定画面を開いて、HPポートの各チャネルをFULLY_REGISTEREDにすればタイミングエラーは出なくなります。Vivadoの場合でもAXI Interconnectの中に似たような設定があります。

Interconnect Settings for BUSIFの中のS_AXI_HP1の設定で、以下の部分を変更します。

Fully_reg

ここのデフォルトの設定であるBYPASSというのは、AXIを100MHzとか125MHzで動かすためのものであって、クロック250MHzで動かす場合はレジスタを入れろと解釈できます。

レジスタを入れてレイテンシを増やして高い周波数でも動くようにするという当たり前の話です。

しかし、困ったことにAXIのプロトコルも変わってしまうのです。

下の図は、FULLY_REGISTEREDにしたときのAXIバスの波形です。DDR3メモリからデータを読み出すべく、バースト長256にして読み出しリクエストを発行しました。

Rvalid

何ということでしょう。

RVALID='0'なのに、RLAST='1'というパターンが出てきてしまうのです。

このパターンは出たり出なかったりなので、推測ですが、AXIのバーストリードを発行したものの、DDR3メモリがリフレッシュ等でデータを用意できないときに偶然、こういうパターンになるのかと思われます。

下の波形は、5回目のバーストまではうまくいっているのですが、6回目のバーストリードでLASTが出てしまってそれきりステートマシンがハングしてしまっています。

Last_5burst

データがまだ残っているのにLASTと判断しているため、この後の通信がハングしてしまっています。そこで、RVALIDが0ならば、RLASTは無視して、ステートマシンを止めないようにしたところ、続きから正しいデータを読み出すことができました。

このパターンはInterconnect Settings for BUSIFで各チャネルのUse RegisterをBYPASSにすると出ません。よって、FULLY_REGISTEREDにしたときに自動的に挿入されるロジックの問題だと思われます。

つまり、RVALID='0'かつRLAST='1'は無視して良いのだと思います。

このようにすることで、250MHzでAXI HPポートを安定して動かすことができるようになりました。

|

« セキュリティキャンプへ応募を検討している皆様へ | トップページ | ADS54J60を交換してみたけれど »

コメント

コメントを書く



(ウェブ上には掲載しません)




« セキュリティキャンプへ応募を検討している皆様へ | トップページ | ADS54J60を交換してみたけれど »