第5回: 実習(2): FPGAへの論理回路の実装(カウンタ)
今回は、VHDLを用いて記述した順序回路の例として、
カウンタ回路を動作させてみましょう。
8ビットカウンタ
スイッチでカウントを進められる8ビットカウンタをつくってみます。
プロジェクトの作成
以前の実習(1)と同様に、
Xilinx ISE Project Navigatorを使ってVHDL記述の論理回路の
設計と論理合成(コンパイル)を行います。
基本的な操作は、実習(1)の手引き書を参考にしてください。
以下では、異なる点のみを記載しておきます。
- File→New Projectで、新しいプロジェクトの作成を開始します。
プロジェクト名は"count8"としておきましょう。
- "Create a new source"(新規にファイルを作る)の画面では、何も入力せずに次へ。
- "Add extisting sources"では、以下の4つのファイル(ダウンロードしてデスクトップ等に保存しておく)を、「Add Source」ボタンで指定して追加する。追加後、それらのファイルの中身を確認されるのでOKを押しておく。
今回作る回路の全成は3つのコンポーネント(部品)からなり、
3つのVHDLファイルはそれぞれの回路が記述されています。
それぞれのコンポーネントの役割は以下の通りです。
- count8_top : 全体のとりまとめ。実際のスイッチ・LEDがつながっている。
スイッチ・LEDともに「負論理」なので、わかりやすいようにnotを
とった信号(ia, ib, rst, q)を内部で使うようにしている点に注意。
- count8 : 8ビットカウンタの本体。
- sw_clk : スイッチ2個を使って、カウンタで使うクロック信号を
つくっている。
スイッチには1回押しただけのつもりでも何回かのON/OFFを繰り返してしまう
「チャタリング」という現象があるため、スイッチを直接カウンタの
クロック信号として使うと、1回押しただけのつもりでも何回かのクロックの
立ち上がりが入力されてしまい、一気にカウント値が増えてしまう。
そこでsw_clkではRS-FFを使ってチャタリングを除去している。
具体的にはSW(A)とSW(B)を交互に押すと、一発ずつクロック信号が
出るようになっている。(興味のある人は動作原理を調べてみましょう)
これで生成したクロックは、全体構成count8_topでは"clk_cnt"という名前の
信号にしている。
- あとは全体構成のcount8_topを選んだ状態でコンパイルをかけて、
作成されたcount8div_top.bitをEDX001に転送すれば、動作するはずです。
カウンタの値は8個のLEDに2進数で表記されていて(点灯="1")、
SW(A)とSW(B)を交互に押すと、値が1ずつ増えていくはずです。
SW(D)を押すとリセットがかかります。
全体構成を自分で描いてみてよく理解した上で、実際に動作をさせてみましょう。
シミュレーション
順序回路でもシミュレーションを行うことができます。
(本来は、シミュレーションで動作検証をしてデバッグをして、
その後で実機に転送して動作させる、という順序とするべきです)
順序回路は、基本的にクロック信号に同期して動作するため、
常時変化するクロック信号を与えることになりますが、
シミュレーションで使うテストベンチに、
0→1→0→1→・・・という変化をならべて書くのは非常に面倒なので、
次のように独立したprocess文をテストベンチ内に書いておくと、
自動的に周期的に変化するクロック信号が生成されるので便利です。
process begin
wait for 50 ns;
clk <= not clk;
end process;
この例では、50nsごとにclkの値を反転されているため、
結果として100ns周期のクロック信号が生成されます。
今回はシミュレーションを行うのは必須としませんが、
余裕のある人はぜひ試してみてください。
戻る