FPGAでLチカ!スイッチでLEDを点灯させる回路をVHDLで記述する【超初心者のFPGA開発1】

こんにちは。
4月に入社したばかりの”モーションT.K”です。
担当が未経験の回路設計およびFPGA開発になりましたので、知らないことばかりですが、日々前向きに取り組んでチャレンジしております。

さて今回は、FPGA超初心者がFPGAの回路設計をしてLチカするところまでできたので、その記録です。

スイッチを押すとLEDが点灯するFPGA回路
スイッチを押すとLEDが点灯するFPGA回路

FPGA開発は、そもそもFPGAとは何か?というところから始まりました。

FPGAとは?

FPGAとは、Field Programmable Gate Array 略で、ユーザーが中身のデジタル回路を専用の記述言語を使って、自由に設計したり書き換えたりできるICチップのことです。
FPGAの中のデジタル回路(論理回路)を記述する言語がHDL(Hardware Description Language:ハードウェア記述言語)で、Verilog-HDL、SystemVerilogやVHDLといった種類がありますが、今回はVHDLを使用しました。

また、FPGA開発の流れは以下のようになっています。

FPGA回路の流れ
FPGA開発の流れ

一連の作業は、使用するFPGAの開発メーカが提供する開発環境ですべて行えるようになっています。今回はインテルFPGAを使用するので、開発環境は無償版のQuartus Prime Lite Edition を使用しました。

次は、VHDLでどうやって回路を記述するの?という疑問です。

VHDLとは?

VHDLは、デジタル回路設計用の記述言語 HDLの一つで、国際規格として定められています。VHDLのプログラムファイルは大きく以下の3つの部分に分かれています。

  • パッケージ呼び出し部:必要なライブラリの呼び出し
  • エンティティ宣言部:回路名や入出力信号名、入出力信号タイプなど回路のインターフェースを宣言
  • アーキテクチャ本体部:入力信号に応じた回路内部の機能を記述
VHDLファイルのプログラム構成
VHDLファイルのプログラム構成

パッケージ呼び出し部は、ファイルの冒頭に書きます。この記述によって回路設計に必要なライブラリを呼び出します。自作のライブラリを呼び出すことも可能ですが、基本的には用意されたライブラリを呼び出します。

エンティティ部は、パッケージ呼び出し部の後に記述します。エンティティ名として回路の名前を宣言し、その回路で使用する入出力信号名と信号のタイプを宣言します。入力は in 、出力は out と記述し、信号のタイプは、配線が単線の場合は std_logic、複数線の場合は std_logic_vectorを使用します。信号のタイプは他にもいくつか種類があります。

アーキテクチャ部は、エンティティ部の後に記述します。ここで回路の機能を記述します。同時並列的に処理される文法と順番に処理される文法があり、実現したい機能やタイミングによって使い分けます。

具体的なプログラム記述の意味や活用方法は、実現したい回路を記述しながら理解し覚えていくようにします。

それでは、実践です。

スイッチを押すとLED点灯するFPGAの回路をVHDLで記述する!

今回の目標は、スイッチを押すとLED点灯するFPGAの開発です。
具体的な作業は次のようになります。

用意するもの

今回の実験に使用したものは以下の通りです。

  • Windowsパソコン
  • インテルFPGA開発ソフトウェア Quartus Prime Lite Edition
  • FPGA評価ボード EDA-301 (Cyclone IV 搭載)
  • EDA-301 用コンフィギュレーションソフト
  • USBケーブル
  • 直流安定化電源

新規プロジェクトの作成

Quartus Prime Lite Editionを起動し、New Project Wizard を開いて新規プロジェクトを作成します。
図のように対象となるFPGAを選択します。今回は Cyclone IV Eを使用しました。

FPGAファミリの設定
FPGAファミリの選択

シミュレーションツールは、Quartus Prime Lite Edition と同時にインストールされた ModelSim を選択し、フォーマットはVHDLを選びます。

シミュレーションツールの選択
シミュレーションツールの選択

VHDLファイルの作成

新規VHDLファイルを作成し、スイッチでLチカする論理回路を記述します。スイッチ入力とLED出力を配線する(つなぐ)だけなので、簡単でした。ここまで来るまでに時間がかかりました。(汗)

スイッチでLED点灯する回路のVHDL記述
スイッチでLED点灯する回路のVHDL記述

SWが入力で、LEDが出力の SWPUSH_LED という名前の回路を作成しました。回路の機能は、SWの入力をLEDに出力するだけです。LED <= SW; でスイッチの入力をLEDの出力に代入しています。

テストベンチの作成

論理回路ができたら、作成した回路がうまく動作するか論理シミュレーションを行います。シミュレーションには、どういう入力条件で実行するのかを記述したテストベンチを使用します。テストベンチの記述もHDLで行われ、今回はVHDLを使用しました。以下の図がテストベンチのVHDL記述です。

テストベンチのVHDL記述
テストベンチのVHDL記述

テストベンチの記述方法を簡単に見ていきます。
エンティティ部でTESTBENCH回路を作成します。ここでは、信号名や信号タイプが宣言されていません。これは TESTBENCH 回路と外部とのインターフェースが存在しないためです。

次にアーキテクチャ部を見ます。
冒頭に constant という記述があります。これは定数の宣言で、任意のタイミングで入力信号を発生させるために使用します。
signal は回路内のみで使用する信号を宣言する際に使用します。
component文でTESTBENCH回路の下位階層として、作成したLED点灯回路のSWPUSH_LEDを使用する宣言をします。

begin以下の記述は回路の機能を示しています。TESTBENCH回路の内部信号とSWPUSH_LED回路のインターフェース信号を接続し、スイッチの入力に該当する SW_t を任意のタイミングで’1’や’0’にパタパタさせています。

TESTBENCH回路とSWPUSH_LED回路の関係は以下の図で表せます。

テストベンチと作成した論理回路の関係
TESTBENCH と SWPUSH_LED の関係

論理シミュレーション

作成したテストベンチをシミュレーションで使用します。設定は、以下の図のような手順で行います。

テストベンチをシミュレーションで使用するための設定
作成したテストベンチを使用する設定

続いてシミュレーションを実行します。

シミュレーション結果

想定通りに動きました!

ピンの設定とコンパイル

論理シミュレーションがうまくいったので、論理回路の入出力をFPGAのピンに割り当てます。
Pin Plannerを立ち上げて、Node Nameの欄にある SW と LEDを対応するピン番号へドラッグ&ドロップします。今回使用した評価ボード EDA-301搭載のFPGA では、SWをピン番号A2、LEDをピン番号C11に割り当てました。

ピン設定
FPGA ピンの割り当て

I/O Standard 項目で対応する電圧を設定し、Pin Planner を閉じ、コンパイルを行います。

FPGAにプログラミング

コンパイルしてできたファイルをFPGAに焼き込みます。FPGA評価ボードEDA-301の場合、USBケーブルと専用のコンフィギュレーションソフトウェアを使用することでファイルの焼き込みが可能です。その際、.rbf(raw binary file)形式のファイルが必要で、ここで結構時間を使いました。.rbfを出力するには以下の図のように、Device and Pin Options の Programming Files で Raw Binary File にチェックを入れる必要があります。

Quartus Prime における rbfファイルの出力設定
.rbfファイルを出力する設定

FPGA評価ボード EDA-301 はDC5Vで駆動するので、直流安定化電源を利用してDC5Vを供給します。

LEDが点灯した!

ボタンを押すとLEDが点灯した

FPGAに焼き込みが成功し、ボタンを押すとLEDが点灯しました!やりました!
実際にモノが動く様子を見ると感動です。

次回の超初心者のFPGA開発は、クロック同期カウンタを使ったLED点滅 ~同期回路の設計 ~ です。
それでは、またお会いしましょう。

参考文献
・はじめてのVHDL(書籍)
インテル FPGA で はじめての L チカ! – 半導体事業 – マクニカ (macnica.co.jp)