FC2カウンター FPGAの部屋 2006年02月04日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx 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に戻ります。そしてBTN0を離すと、8の移動が停止して4 つのLEDの内の1つに停止します。もう一度、SW5を押すと、前に停止した8の位置からスタートします。BTN3はリセットで、これを押すと初期状態に戻ります。
 このようにどこに止まるかわからないルーレットの様なゲームになっています。

*  回路構成の説明
o LED駆動方式

  LEDの点灯方法としては、スタティク点灯とダイナミック点灯に分けられまが、評価基板はダイナミック点灯方式でLEDを点灯します。ダイナミック点灯方式は、すべてのLEDのセグメントの入力を共通バスで結んで、個数分のデータを時分割で出力ます。そして、対応するセグメントのデータが出力される時間だけイネーブル(OE)をアクティブにする点灯方式です。下の図参照
eval_board_html_m33f.gif

図1 ダイナミック点灯方式のタイミングチャート

 ダイナミック点灯方式はスタティク点灯方式に比べて、線の数は少なくなりますが、駆動するLEDの数が増えると暗くなります。また、スタティク点灯に比べて、駆動回路が複雑になります。
 図2は評価基板のLED駆動回路のブロック図です。50MHzクロックを分周してダイナミック点灯の駆動回路の基準クロックを作っています。これは、 LEDのデータやOEを切り替えるタイミングを取るのに使用しています。CRTのリフレッシュと同一です。周波数は違いますが。。。この周波数はあまり気にする必要は無いかもしれませんが、一応1KHzに設定しています。
dynamic_led_circuit_060204.png

図2 LED駆動回路(ssegdisp.vhd)ブロック図

* スイッチ回路

 スイッチは、押した時や離したときにチャタリングと言う波形の乱れが発生します。これは、スイッチの接点と接点がついたり、離れたりした時に、接点同士のバウンドによって信号が乱れる現象です。普通、数100uSから数msくらい続きます。
sw_circuit.jpg

図3 スイッチ回路

 図3のスイッチ回路で、OUTPUTをディジタルオシロスコープで見た波形を下に示します。尚、このスイッチ回路の波形は評価基板のものではありません。スイッチはトグルスイッチです。
chatting_of_fall.jpg

これがVCCからGNDへOUTPUTが変化する時の波形です。600usec程度波形が乱れているのが見えると思います。それがチャタリングです。これを直接、ステートマシンの入力などに入れると、ステートマシンのレジスタのセットアップタイム、ホールドタイム違反などで不正ステートに行ってしまうことがあります。また、GNDからVCCへOUTPUTが変化する場合にも、数は少ないですが、チャタリングは起こります。
それではチャタリングを直接、評価基板で見てみましょう。
BTN0の出力を16ビットバイナリカウンタのクロック入力に入れて、バイナリカウンタの出力を4ビット単位でLED駆動回路に入力してみます。BTN0を押したときに、カウントが+1されるはずですが、チャタリングのため複数カウントが進むと思います。BTN3がリセットです。
私のブログの記事”スイッチのチャタリング”を参照ください。(この回路のバイナリカウンタはクロックがスイッチから入力されていて、非同期回路となっています。通常、非同期回路はFPGAの回路方式としては、あまり良くないので、実用回路を作る場合は、なるべく完全同期回路で回路を作ってください。)

 次に、チャタリングを防止する方法ですが、積分回路でチャタリングを除去してシュミットトリガのゲートを通して波形整形する方法、RSフリップフロップを使用する方法、Dフリップフロップでチャタリング持続時間以上のサンプル周期でサンプルする方法の3つが通常使われる方法です。このページで使用しているのは3番目のサンプルする方法です。チャタリング持続時間以上のサンプル周期でサンプルすれば、1回目でチャタリングが出ていても、2回目には収束しているので、チャタリングが除去できます。回路を図4に示します。
sw_circuit_wo_chatti.jpg

図4 スイッチのチャタリング除去回路

 サンプリング周期は5msecです。このくらいのサンプリング時間をとるとチャタリングは除去できるでしょう。もし、チャタリングが原因で動作がおかしくなるようだったら、もう少しサンプリング時間を長くします。
サンプリング除去回路を入れた後の回路はここに置いておきますので、試してみてください。今度はスイッチを押した時だけ、1増えると思います。(私のブログの記事”スイッチのチャタリング”を参照ください。)
図4では、クロックに200Hzを入力していますが、実際のFPGAのデザインではDフリップフロップのクロックにボードのクロック50MHzを入力し、イネーブル端子に200Hzごとに1になるイネーブル信号を入れてチャタリングを除去しています。
(ちなみにリレーでも同じです、機械接点を持っているものはチャタリングが出ると思います。昔に、水銀リレーと言うのを扱ったことがあるのですが、チャタリングが出ないのはそれくらいみたいです。水銀リレーは水銀が接点なので傾けると動かないし、ひどく扱いが難しかったです。)

* LEDテスト回路トップ

 LEDテスト回路のトップファイルは、今までの回路を統合してインスタンスを作製しています。スイッチを押している間だけ、図2のバイナリ0から3に8を順番に入れていくステートマシンをつければ、LEDテスト回路は完成です。ステートマシンの図を図5に示します。
state_machine.jpg

図5 LEDテスト回路ステートマシン

 図5でSW_ONは前のスイッチのチャタリング除去回路で、チャタリングを除いたスイッチ入力です。SW_ENAは200Hzごとのスイッチのサンプリング信号です。なぜ、SW_ONだけでステートを遷移してはいけないかと言うと、 SW_ONだけで遷移すると、遷移が早すぎてLEDの表示が追いつかないからです。SW_ENAがステート遷移に入っていると、スイッチを押している間は、すべてのLEDが8に見えますが、入っていないとすべて0のままです。ステートマシンにチャタリングを除いていないスイッチの波形を入れるたらどうなるかは下の注意をご覧ください。

* ファイルの構成

 ledtest.vhg --- swdiv.vhd
          |- ssegdisp.vhd --- b27segdec.vhd
                     |- freqdiv.vhd

 ledtest.vhd : トップファイル。バイナリ3~0をLED駆動回路に入力します。バイナリ3~0は通常は0ですが、スイッチが押されいている間、順番に8になります。
swdiv.vhd : スイッチのチャタリングを取り除くために5msごとにイネーブル信号を出力する回路
 ssegdisp.vhd : LEDの駆動回路(図2参照)
 freqdiv.vhd : 33MHzのマスタークロックから1kHzのLED表示イネーブルを出力する(図2の分周器)
 B27segdec.vhd : バイナリデータからLED表示用のデータを作るデコーダ(図2の7セグメントLEDデコーダ)

ISEのプロジェクトは今スパルタン3スタータキットが手元に無いので確認してから出します。次はISEプロジェクトの作り方から。
  1. 2006年02月04日 16:55 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:1