FPGAの部屋FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。スパルタン3スタータキットでのISE8.1iのチュートリアル1(導入編)なぜかダイナミック点灯やISE8.1iでの検索が多いようなのでチュートリアルを書こうと思う。出来るだけ初心者のレベルで書こうと思う。初めは導入編で回路の説明だ。ダイナミック点灯やスイッチのチャタリングの除去方法など。以前自分のホームページに載せていたものの焼き直しだ。LEDテスト回路LEDテスト回路は、評価基板の4つの7セグメントLED(以下、LEDとします)をテストするためのゲームです。初期状態では、すべてのLEDが0になります。BTN0を押すと左端の7セグメントLED(D1)が8になり、BTN0を押している間、8が右のLEDに移動し続けます。右端のLED(D4)まできたら、左端のLEDに戻ります。つのLEDの内の1つに停止します。一度、SW5を押すと、前に停止した8の位置からスタートします。BTN3はリセットで、これを押すと初期状態に戻ります。このようにどこに止まるかわからないルーレットの様なゲームになっています。LED駆動方式LEDの点灯方法としては、スタティク点灯とダイナミック点灯に分けられまが、評価基板はダイナミック点灯方式でLEDを点灯します。ダイナミック点灯方式は、すべてのLEDのセグメントの入力を共通バスで結んで、個数分のデータを時分割で出力ます。対応するセグメントのデータが出力される時間だけイネーブル(OE)をアクティブにする点灯方式です。ダイナミック点灯方式のタイミングチャートダイナミック点灯方式はスタティク点灯方式に比べて、線の数は少なくなりますが、駆動するLEDの数が増えると暗くなります。スタティク点灯に比べて、駆動回路が複雑になります。図2は評価基板のLED駆動回路のブロック図です。50MHzクロックを分周してダイナミック点灯の駆動回路の基準クロックを作っています。LEDのデータやOEを切り替えるタイミングを取るのに使用しています。CRTのリフレッシュと同一です。この周波数はあまり気にする必要は無いかもしれませんが、一応1KHzに設定しています。スイッチ回路スイッチは、押した時や離したときにチャタリングと言う波形の乱れが発生します。これは、スイッチの接点と接点がついたり、離れたりした時に、接点同士のバウンドによって信号が乱れる現象です。普通、数100uSから数msくらい続きます。図3のスイッチ回路で、OUTPUTをディジタルオシロスコープで見た波形を下に示します。このスイッチ回路の波形は評価基板のものではありません。スイッチはトグルスイッチです。これがVCCからGNDへOUTPUTが変化する時の波形です。600usec程度波形が乱れているのが見えると思います。それがチャタリングです。これを直接、ステートマシンの入力などに入れると、ステートマシンのレジスタのセットアップタイム、ホールドタイム違反などで不正ステートに行ってしまうことがあります。GNDからVCCへOUTPUTが変化する場合にも、数は少ないですが、チャタリングは起こります。それではチャタリングを直接、評価基板で見てみましょう。BTN0の出力を16ビットバイナリカウンタのクロック入力に入れて、バイナリカウンタの出力を4ビット単位でLED駆動回路に入力してみます。BTN0を押したときに、カウントが+1されるはずですが、チャタリングのため複数カウントが進むと思います。BTN3がリセットです。私のブログの記事”スイッチのチャタリング”を参照ください。FPGAの回路方式としては、あまり良くないので、実用回路を作る場合は、なるべく完全同期回路で回路を作ってください。)次に、チャタリングを防止する方法ですが、積分回路でチャタリングを除去してシュミットトリガのゲートを通して波形整形する方法、RSフリップフロップを使用する方法、Dフリップフロップでチャタリング持続時間以上のサンプル周期でサンプルする方法の3つが通常使われる方法です。このページで使用しているのは3番目のサンプルする方法です。チャタリング持続時間以上のサンプル周期でサンプルすれば、1回目でチャタリングが出ていても、2回目には収束しているので、チャタリングが除去できます。回路を図4に示します。スイッチのチャタリング除去回路サンプリング周期は5msecです。このくらいのサンプリング時間をとるとチャタリングは除去できるでしょう。チャタリングが原因で動作がおかしくなるようだったら、もう少しサンプリング時間を長くします。サンプリング除去回路を入れた後の回路はここに置いておきますので、試してみてください。今度はスイッチを押した時だけ、1増えると思います。(私のブログの記事”スイッチのチャタリング”を参照ください。)図4では、クロックに200Hzを入力していますが、実際のFPGAのデザインではDフリップフロップのクロックにボードのクロック50MHzを入力し、イネーブル端子に200Hzごとに1になるイネーブル信号を入れてチャタリングを除去しています。(ちなみにリレーでも同じです、機械接点を持っているものはチャタリングが出ると思います。昔に、水銀リレーと言うのを扱ったことがあるのですが、チャタリングが出ないのはそれくらいみたいです。水銀リレーは水銀が接点なので傾けると動かないし、ひどく扱いが難しかったです。LEDテスト回路トップLEDテスト回路のトップファイルは、今までの回路を統合してインスタンスを作製しています。スイッチを押している間だけ、図2のバイナリ0から3に8を順番に入れていくステートマシンをつければ、LEDテスト回路は完成です。ステートマシンの図を図5に示します。LEDテスト回路ステートマシン図5でSW_ONは前のスイッチのチャタリング除去回路で、チャタリングを除いたスイッチ入力です。SW_ENAは200Hzごとのスイッチのサンプリング信号です。SW_ONだけで遷移すると、遷移が早すぎてLEDの表示が追いつかないからです。SW_ENAがステート遷移に入っていると、スイッチを押している間は、すべてのLEDが8に見えますが、入っていないとすべて0のままです。ステートマシンにチャタリングを除いていないスイッチの波形を入れるたらどうなるかは下の注意をご覧ください。バイナリ3~0をLED駆動回路に入力します。バイナリ3~0は通常は0ですが、スイッチが押されいている間、順番に8になります。バイナリデータからLED表示用のデータを作るデコーダ(図2の7セグメントLEDデコーダ)ISEのプロジェクトは今スパルタン3スタータキットが手元に無いので確認してから出します。次はISEプロジェクトの作り方から。URLhttps://marsee101.blog.fc2.com/tb.php/142-6583f19eこの記事にトラックバックする(FC2ブログユーザー)プロフィールAuthor:marseeFPGAの部屋へようこそ!FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。WEBブログデザイナ。