以前、ボタンを押すとLEDが点灯するサンプルを真似して動かしたが、自力で書いてみたい。
module blink_led( output ld0, input btn ); reg led = 0; assign ld0 = led; always @(btn) begin if (btn == 1) begin led = 1; end else begin led = 0; end end endmodule
ld0にLEDを割り振っているのだが、直接代入させるとエラーが出た。
regみたいなやつじゃ無いとだめ、ということらしいが、reg変数をwire変数には突っ込めないということか。
btnを一度INPUTして、そのままOUTPUTしてld0に入っていくだけだ。
無駄無駄なのだが、if文を書いてみたかったのだ。
最初、if文をalways()の外に書いていたけどエラーになってね。。。
たぶん、always()の中に書いた文は順次処理文、外に書いた文は同時処理文と呼ばれているようなので、ifのように順番に処理するものはalways()の中に書かないといかんのだろう。
1回押したものが出ていくだけでは面白くないので、8回押したら点灯するようにしようとした。
always()の引数に書いた端子に変化があれば呼ばれるのだろうから、両エッジ割込みみたいなものか?
module blink_led( output ld0, input btn ); reg [2:0] cnt = 0; reg led = 0; assign ld0 = led; always @(btn) begin if (btn) begin cnt <= cnt + 1; end if (cnt == 0) begin led = 1; end else begin led = 0; end end endmodule
cntという3bitのreg変数を追加し、btnがHIGHだったらカウントし、ビットがあふれて0になったらLEDを点灯させようという考えだ。
そう悪くないと思うのだが、、エラーになってBitstream生成までのどこかでエラーになった。
[Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the use of this override is highly discouraged. These examples can be used directly in the .xdc file to override this clock rule.
< set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets btn_IBUF] >btn_IBUF_inst (IBUF.O) is locked to IOB_X0Y36
and btn_IBUF_BUFG_inst (BUFG.I) is provisionally placed by clockplacer on BUFGCTRL_X0Y0
IOピンとBUFG間のルーティングが足りてないという意味か?
ルーティングというのは、配線のことだと思う。
btn_IBUFなどと書かれているが、btnはY16ピンに当てていて、前回から変えていない。
CLOCK_DEDICATED_ROUTEがどうのこうのと書かれているが。。。
検索すると、XilinxのPDFが出てきた。
CLOCK_DEDICATED_ROUTE を使用すると、 クロックソースがそのロードクロックバッファーに比べて不適切な箇所に配置されている場合に、 クロック配置の DRC をエラーから警告に変更できます。
注意:CLOCK_DEDICATED_ROUTE を False にすると、 クロック遅延に問題が出て、潜在的なタイ ミングおよびその他の問題が発生することがあります。
なにやら、制約を外すオプションらしい。
XDCファイルに、こんな感じで行を追加すればよいそうだ。
set_property CLOCK_DEDICATED_ROUTE value [get_nets net_name]
net_nameは他の設定を真似して書いた。
set_property CLOCK_DEDICATED_ROUTE false [get_nets btn]
が、これは途中でエラーになった・・・。
エラーメッセージに書かれている内容にすると通ったけど、warningが出てくるのよねぇ。
気にしなくてよいものか。
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets btn_IBUF]
そして、動作はもっと気に入らない。
LoadさせるとLEDが点灯状態で始まり、ボタンを押すと消えたのだが、ボタンを押した回数とLEDが点灯するタイミングが不定だ。
なんだ、私のどこが間違っているというのだ。。。
CLOCK_DEDICATED_ROUTEで回避するという方法ではダメだったのだろうか?
I/OピンとBUFGを最適に接続できないから出てくるエラーらしい。
Vivadoで[Place 30-574]エラーが発生した時の対処法 | 彩の国・さきたま研究所
PC-9801Vm Style CLOCK_DEDICATED_ROUTE てナニ?
BUFGなんて使ってないよ!と思ったが、最初の方に載せた図を見るとbtn_IBUFというやつがいるな。
この図は最初のverilogから生成しているのだが、それにもかかわらず最初はそんなエラーは出ていない。
ということは、ソースを追加したことで、この図に変化が生じたのだろうか?
生じていた・・・。
コンパイルした結果みたいなものだから、これを読み解けば何が起こったか分かるだろう。
まず、左上のbtnが入力となる端子で、右側のld0が出力となる端子だ。
btnはRTL_LATCHのGに入り、Dの方は丸っこいのの出力になっている。
丸っこいのは、プラスマークが入っているから、加算器だろう。
今回で言えば、cnt <= cnt + 1、の部分だ。
上側のI1というやつが、上から吊られているからHIGHの1bit分ということか(Input1、なのかな?)。
そして、下側はI0(Input0 ?)で、これが右辺のcntに当たるやつだ。
その出力がRTL_LATCHに入って、Qから出ていく。
これが3bit分のメモリのようなものか。
マウスオーバーで説明が出てくるのだが、Typeが"RTL Register"になっていた。
その出力は、RTL_ROMの入力になっていて、そのままld0につながっている。
RTL_ROMのTypeは"RTL Memory"だ。
えー、btn_IBUFがないやん!
CLOCK_DEDICATED_ROUTEをfalseにしたことで、クロックが仕事に専念(dedicate)しなくなったため、スイッチをクロック代わりに使おうとしても、スイッチのINPUTを定期的に読む人がおらず、不定期に反応してしまったとか、そういう現象だろうか?
だったら、何とかしてクロックを入れてやればよいのかもしれない。
ZYBOのPDFを見ると、PL部にはCLK125からL16へクロックが入っているように見える。
が、なんでEthernetのPHYからなんだ?
50MHzということはRMIIだろうか。
あるいは、PS_CLKへのINPUTからPLLが動かないとPL部にはクロックが入っていないことになるのだろうか?
ソフトにとってはクロックってINPUTというよりは別次元で餌が与え続けられているようなイメージなので気にしなかったのだが、明示的に何かしないといかんのかもしれん。
CLOCK_DEDICATED_ROUTEの説明も「クロックソースがそのロードクロックバッファーに比べて不適切な箇所に配置されている場合に」だったので、適切な位置に配置すればよいだけなのか。
と推測したけど、何をしてよいかわからん。
検索だ!
PiTs laboratory: ZYBOのPLだけを使う場合のクロックソース
PSが動いていないとFCLK_CLKは動かないようだが、L16の方はクロックとして使えるらしい。
らしいが・・・だからなんなのだ?
btn_IBUFとかいうInput用のバッファを使うためにclkがどうのこうのという話だと思うので、btn_IBUFとかいう部品にクロックを突っ込んでやればよいとかじゃないのか???
そういえば、最初に参照したサイトは、自分でXDCファイルを変更していたな。。。
【Zynq】ZyboでPLのみ使用してLチカしてみた
よくわからんが、btnをやめて、clkをコメントアウトし、btnの代わりにclkを使うようにしてみた。
カウント数は8では足りないだろうから、どこかのサイトを見て増やした。
(ブラウザを閉じてしまって、どのサイトかわからなくなってしまった。。。)
そうすると、動くのだよ、動いたのだよ!
btnもclkも割込みで動くようなイメージで考えていたのだけど、そこは考え方が間違っているようだ。
うーむ、奥が深い。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。