2017/07/01

[zybo]ibufの謎

Verilogでやろうかと思っていたけど、知ってる人がVHDL派だったので、私もVHDLでやることにした。
0を代入するのですらビット幅を合わせないといけないのだけど、そのくらい厳密な方がいいんじゃなかろうかね。


さて、まだまだ悩んでいるibufについてだ。

あらすじ

VerilogでLEDをチカチカさせるサンプルを真似して、それは動いた。
では、クロックを数えてチカチカさせるのではなく、ボタンを押した回数でチカチカさせようとした。
XDCファイルでbtnを有効にしているのだが、なぜかbtn_IBUFがどうのこうのといわれてしまう。

VHDL版のLEDチカチカも動かして、それを同じように変更すると、同じようにエラーが出た。
ただ、こっちはCLOCK_DEDICATED_ROUTEをfalseにしてやると、ボタンを押した回数でちゃんと動いた。
まあ、Verilogで書いたのがどこか間違っていたのだろうが、もうそちらは追うまい。


気にしているのは、CLOCK_DEDICATED_ROUTEをfalseにするだけが解決法なのか、他にもっとよい解決方法があるのか、だ。


https://www.xilinx.com/support/documentation/sw_manuals_j/xilinx2012_2/ug901-vivado-synthesis.pdf

このPDFを読むと、「デフォルトでは入力にIBUFが使用されます」と書かれている。
だから、誰も書いていないのに btn_IBUF というものができたのだろう。

これはBUFFER_TYPEというもののようで、文字通りバッファーのタイプを指定するものとのこと。
"ibuf"か"none"が指定できて、"none"の場合はバッファーを使用しないようにできるらしい。
じゃあ、そうしよう。


・・・エラーだ。

[DRC RPBF-1] IO port is missing a buffer: Device port btn should be connected to an IO cell such as an [IO]BUF*.

DRCというものがエラーを出している。
Design Rule Checkの略のようだから、ルールに反しているのか。
I/Oポートがバッファを見失ったようだが、「should be connnected」といっているので、バッファは必須なのだろう。
ちっ。


Vivadoで[Place 30-574]エラーが発生した時の対処法 | 彩の国・さきたま研究所

ほう。
専用のクロック配線が用意されているピンに変更すればよいのか。
・・・専用の?
PL部にはL16へクロックが供給されているからOK、という話ではないということか。

ZYBOのマニュアルでクロック部を見直すと「7 Series FPGAs Clocking Resources User Guideを読め」となっていた。
7 Series? と思ってマニュアルの先頭を読むと、PL部はArtix-7と同等品らしい。
FPGA初心者なのでよく知らんが、Xilinxといえば7 Seriesなのかもしれん。


https://japan.xilinx.com/support/documentation/user_guides/j_ug472_7Series_Clocking.pdf

うーん、用語がさっぱりわからん。。。

7 Seriesは4ファミリあって、Artix-7は「GTPトランシーバーからCMTおよびBUFMRへの直接接続はありません。GTPトランシーバーからCMTへの接続には、BUFHまたはBUFGが必要です」らしい。
さっぱりわからん。

IBUFで検索するか。
DCLK(ダイナミックリコンフィギュレーション基準クロック)、PSCLK(位相シフトクロック)に載っていたが、よくわからん。



https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx13_3/7series_scm.pdf

image

これがIBUFなの?
なんか、よくあるバッファー、じゃないか。
これにクロックを挿すところがあるのかと思ったけど、これしか載っていない。


Vivadoでボタンに使っているY16を見てみると、こういう情報が出てきた。

image

Clock regionはX1Y0らしい。
このX1Y0にclkを突っ込めばよいのか?
でも、なんかそういう話でもない気がする。


vhdl - How to solve routing issues in Artix7? - Electrical Engineering Stack Exchange

単純に、clkが変化したタイミングでボタンの状態を見るようにすれば良いだけ?

やってみると、確かにエラーが出なくなった。
が、

process(clk, btn)
begin
     if clk'event and clk = '1' and btn = '1' then
        ...

という書き方になったので、ボタンを押している間もclkはパタパタしているからTRUEになってしまうのだった。


btnが一度LOになるのをチェックすればよいのだけど、それならCLOCK_DEDICATED_ROUTEをfalseにした方がまだシンプルだ。
あー、でもチャタリングの処理を書くのだったら、そういうイメージで実装する方が普通なのかな。
ソフトで書くときは、エッジ割込みのタイミングでタイマを動かしてポーリングしているのだけど、タイマの代わりにクロックが使えるから単に数えればよいだけか。


まだお作法がわかっていないのが、自分でも腹立たしい。
何を勉強するとよいのだろうねぇ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。