前回の、ボタンはダメでclockならOKという結果が気に入らない。
「俺とお前の何が違うんだぁぁぁ」とわめきたくなる。
clockは、こう。
set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { clk }];
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }];
L16はPL部のclock入力だから、じゃあL16をボタンのY16に変更すれば、入力がclockからボタンになるだろうと思う。
set_property -dict { PACKAGE_PIN Y16 IOSTANDARD LVCMOS33 } [get_ports { clk }];
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }];
こうやっても、前回のエラーがやはり発生する。
L16が特別なんだろうが、Vivadoはどうやってそれを見分けているのだろうか?
LEDをチカチカさせるアプリを作ったときにVivadoへ与えた情報といえば、
- Verilog HDL
- XDCファイル
- アプリ作成ウィザードでのボード情報
くらいだ。
VerilogもXDCも、特にZyboっぽい情報は入っていないので、L16を特別視するのはボード情報のためと思われる。
インストール手順に従い、Vivado\2017.2\data\boards\board_files\zyboにボード設定ファイルを置いている。
https://github.com/Digilent/vivado-boards/tree/master/new/board_files
"L16"で検索すると、part0_pins.xmlにこういう行があった。
<pin index="12" name ="sys_clk" iostandard="LVCMOS33" loc="L16"/>
Y16は、こう。
<pin index="3" name ="btns_4bits_tri_i_3" iostandard="LVCMOS33" loc="Y16"/>
nameだけの違いのように見えるが・・・。
"sys_clk"で検索すると、board.xmlにこういう行があった。
<port_map logical_port="CLK" physical_port="sys_clk" dir="in">
その付近にsystem_clockのような名前がちょくちょく見られるので、L16が特別というよりも、"sys_clk"という名前が付けられたものがシステムクロックとして定義されている、ということかな。
なんとなくだが、システムクロックは特別であっても不思議ではないという感触があるので、調べるのはここまでにしておこう。
では、clockでなはなくてボタンを割り当てるどどうしてエラーになるかという問題に戻るのだが、CLOCK_DEDICATED_ROUTEをfalseにするとクロック遅延に問題が出る可能性がある(が、warning扱いにする)ということなので、そういう状況をエラーにしたということだろう。
falseにせずに対処したかったなら、clockもINPUTに割り当てればよいのだろうか?
module blink_led( output ld0, input btn, input clk ); reg [2:0] cnt; reg led = 0; assign ld0 = led; always @(clk, btn) begin if (clk && btn) begin cnt <= cnt + 1; end if (cnt == 0) begin led = !led; end end endmodule
こうすると、とりあえずエラーは出なくなった。
が、ボタンを8回押してもLEDが反転しない。。。
しないというか、タイミングが不定期だ。
チャタリングが起きている可能性も否定できないのだけど、どうやって確認したものか。
使ったこと無いけど、シミュレータがよいのかな?
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。