2012/09/03

FPGA / Verilog-HDL入門 - スロットマシンの設計

これまで主にVHDLを使用していたのですが,所属環境が変わってVerilog-HDLを使用する機会が多くなりました. 回路設計自体も初心者から抜け出せていないのに,違う言語に手を出すのは危険な気がしますが,仕方がありません. 今回は,Verilog-HDLの練習として簡単なスロットマシンを設計・記述し,FPGAに実装してみました.200行程度のシンプルな回路ですが,スロットマシンとしての主要な機能は抑えていると思います.

スロットマシンの仕様

今回設計したスロットマシンは,下記のような簡単な仕様を基に設計しました.

  1. スライドスイッチをhigh(= 1)にするとリセット動作
  2. 3個の7セグメントLEDに"0"を表示
  3. スライドスイッチをlow(= 0)にすると7セグメントLEDの数字が回転
  4. "0"~"7"(8種類)の数字を順に表示
  5. 各タクトスイッチを押すと対応する数字の回転が停止
  6. 数字が揃えばフィーバーとし,10個のLEDが点滅
FPGAボード

今回使用したFPGAボードは,Terasic社のDE0です. 下記のソースコードは,Quartus II 12.0 Web Editionでコンパイル可能であり,DE0上で正常に動作することを確認しています. ソースコードは自己責任の上でご利用ください.

スロットマシンの回路構成

下図に今回設計したスロットマシンの回路構成を示します. 青色のブロックは順序回路を,緑色のブロックは組合せ回路を表しており,合計5種類のモジュールで構成されています. 斜体の白字はモジュール名を,黄色の字はモジュールの入出力を示していますが,clk入力は字を省略し,赤色の配線で表現しています.


スロットマシンの回路構成
スロットマシン・コントローラのステートマシン

下図にコントローラのステートマシンを示します. 黒字は各状態への遷移条件,赤字は状態遷移時の動作を示しています. 各7セグメントLEDに同時に表示される数字が異なるように,各カウンタの回転開始時期をずらしています(全タクトスイッチ同時押下によるフィーバーの防止).


スロットマシン・コントローラのステートマシン
ソースコードの解説

下にソースコードを示します.slot_machineモジュール内には,コントローラのステートマシンとフィーバー判定器が記述されています. 35行目がフィーバー判定器の記述です. ステートマシンの状態がslot_waitかつ全数字の回転が停止しているときに,3個のカウンタの数字が同一であれば,led10モジュールのen信号を"1"にします.

decoderモジュールは,カウンタが保持している数字を2進数表現から7セグメントLED用の信号パターンに変換する組合せ回路です.

led10モジュールは,フィーバーのときに10個のLEDを点滅させる回路です. slot_machineモジュール内のフィーバー判定器が出力するen信号により点滅動作が制御されます.

counterモジュールは,7セグメントLEDに表示する数字を変化させ,その数字を保持するための回路です. 数字の変化は,slot_machineモジュール内のコントローラが出力するen信号により制御されます.

clk_generatorモジュールは簡易的なクロック分周器です. クロック周波数が高いと7セグメントLEDの数字を視認できないため,クロック周波数を落としています. なお,ここでは,FPGAに外部から入力されるクロックの周波数は50MHzを想定しています.

ソースコード
製品紹介
FPGA ボードで学ぶ組込みシステム開発入門 ~Altera編~
小林 優
技術評論社
売り上げランキング: 80089

0 件のコメント:

コメントを投稿