50MHzを1250000分周して40Hzを作るen40hzの書き方をparameterを使用した書き方に変更させていただいた。(cnt==1250000-1);下にparameterを使用した書き方を示す。(cnt==DIV_VAL-1);これで、テストベンチから、DIV_VALの値を変更することができる。通常にシミュレーションしたのでは、en40hzが1になるまでに、1250000クロックかかってしまう。これではシミュレーション時間がとても長くなってしまう。そこで、シミュレーションの時だけ、DIV_VALを2に設定して、2クロック間スイッチに1を入れておけば動作するようにした。このテクニックはVerilogだけ使えて、VHDLは使用できない。シミュレーション時に再上位のテストベンチからシミュレーションしやすいようにのみ使うのが妥当だ。通常の論理合成可能な記述で使うと、何処でオーバーライトされているかわからずにバグの温床を抱えることになってしまう。1'b1;#(PERIOD*DUTY_CYCLE);endend上の部分はクロックを生成する記述だ。何処かで見て、参考にさせていただいている。これだと、クロックサイクル、デューテー・サイクル、オフセットを指定することができる。したら、きちんと割り切れる値にする必要が有ることだ。上の場合は例えば、PERIODを奇数にしてしまうと、小数点が出てしまい切り捨てられるので、思った波形にならない。下の部分で、defparamを使用して、btn_in.vのDIV_VALに2を代入している。CHATTERING_INTR;テストベンチの主な部分を下に示す。次のクロックの立ち上がりまで待つ記述となる。その後の#1の遅延は、現在、クロックの立ち上がりの瞬間にいるので、時刻を少しでもずらすために入れてある。うまく動作しない可能性があるからだ。UP_SWタスクは4ビット幅の引数を1つ持つ。引数にはUP_SWを押す回数を設定する。今回は10を設定している。DOWN_SWタスクは4ビット幅の引数を1つ持つ。引数にはDOWN_SWを押す回数を設定する。今回は7を設定している。RESE_SWタスクは引数を持たない。RESE_SWタスクを呼び出すと、RSETスイッチが1回押される。UP_SWタスクを下に示す。チャタリング防止用の期間待つi=i-4'd1;endendendtaskクロックの立ち上がりまで待って、遅延する。UP_SWを1にしている。CHATTERING_WAITタスクを呼び出して、チャタリングが収まるまで待ってから、UP_SWを0にして、またCHATTERING_WAITタスクを呼び出す。これをi回繰り返している。疲れてきたので、後の説明は省略する。URLhttps://marsee101.blog.fc2.com/tb.php/1952-b13aff4fこの記事にトラックバックする(FC2ブログユーザー)プロフィールAuthor:marseeFPGAの部屋へようこそ!FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。WEBブログデザイナ。