前提
module hoge(CLK, RESET, INPUT, OUTPUT);
のようなIPモジュールを使いこなしたいと考えております。
このIPはVerilogで記述されていて、やや規模の大きな順序回路、パイプラインになっています。
毎クロックINPUT端子からデータを取り込みます。4096回繰り返します。
数クロックのレイテンシが発生したのち、
毎クロックOUTPU端子からデータを吐き出します。4096回繰り返します。
実現したいこと
実現したいことは、このIPモジュールを上位の回路よりも低周波(1/256)で動作させたい、という内容になります。
しかしながら、このIPがイネーブル信号を持っていないため、上位の回路と同じクロックを供給すると同じ周波数で動作してしまいます。そこで、1/256のクロックを新規に用意するべきなのか?もしくはIPに手を加えてイネーブル信号を設けるべきか?(上位の回路がカウンターを持って256カウントに1回だけイネーブルをアサートすることで1/256動作にする、という方法。)
安易にクロックドメインを増やすことは推奨されない?
検証済みのIPの中に手を加えることはあまり良いことではない?
簡単かつ安全に実現するにはどのように考えるべきでしょうか?どのような方法がおすすめでしょうか?
該当のソースコード
IPモジュールの中では、以下のように、すべてのFFが毎クロックposedgeで動作してしまう記述になっていることが問題の発端だと思っています。
always@(posedge CLK or negedge RESET) begin if(!RESET) begin FF1 <= 16'h0000; end else begin FF1 <= INPUT;
補足情報(FW/ツールのバージョンなど)
この実装作業はXilinx FPGAのzynq上で行っており、ツールはVivado v2019.1 (64-bit)を使用しています。
[補足]そもそもなぜ上記のことをやりたかったのか
先に作ってしまった上位の回路が速い動作クロックで動いているためです。
特に、他のモジュールとのやり取りにおいて、同一のデータを取り扱いますが、データラインのbit lengthが違ったりします。シリアルでデータをやりとりしているブロックも存在します。それに対して、本題のIPモジュールはINPUT/OUTPUTはパラレルで構成されています。
そういった、スループットの違いから待ち時間が発生する、このブロックについては遅い周期でサンプリングしたい、といった背景から質問させていただきました。
回答3件
あなたの回答
tips
プレビュー