後編ではIntel(旧Altera) FPGAの開発環境である「Quartus Prime」を使用してFPGA内で動作させる回路を作成していきます。
開発環境での手順
細かい部分で異なるところは多々ありますが、大雑把な流れはマイコンのファームウェア開発と似ています。
- Quartus Primeという開発環境を使用する
- 作成する回路のプロジェクトファイルを作成する
- ハードウェア記述言語(VerilogやVHDL)で回路を記述する(ソフトウェアでいうソースコードのようなもの)
- コンパイルを行う(論理合成や配置配線)
- 実機のFPGAボードに作成した回路データを転送する
- 作成した回路でFPGAボードが動作する【完成!】
※実際には作成した回路のシミュレーションやタイミングの検証などの作業も必要になってきますが、今回はとりあえず動かして見たいという強い気持ちと筆者の勉強不足のため、タイミング検証については割愛しました。。
今後勉強してタイミング検証も折を見てやってみるつもりです。
Quartus Primeの起動
まずは開発環境であるQuartus Primeを起動します。
Quartus Primeでプロジェクトを作成
- ウインドウ上部のメニューから「ファイル」>「New Project Wizard」を選択します。
- Introductionの画面で「Next」ボタンをクリック(この画面はPC設定によっては出ない場合もあるようです)
- プロジェクトを保存するディレクトリとプロジェクト名、最上位階層のファイル名を入力
- プロジェクトのタイプは「Empty project」を選択
- ファイルの追加はせずに次に進みます
デバイスの選択ウインドウでは下記のように選択するとデバイスのリストが表示されるので「10CL025YU256I7G」を選択します。
- Family:「Cyclone10 LP」
- Package:「UFBGA」
- Pin count:「256」
- Core speed grade:「7」
- 「Specific device selected in ‘Available devices’ list」を選択
- EDA Tool Settingsの画面は特に何もせずに次に進みます
- Summaryが表示されるので「Finish」ボタンをクリックしてプロジェクト作成が完了します
最上位階層の回路とPWM出力回路のファイルを作成(verilog HDL)
今回はVerilog HDLで回路を記述することにします。
PWM出力回路
まずはPWM出力回路から作成していきます。
- 上部メニューから「File」>「New」を選択
- 「Design Files」>「Verilog HDL」を選択して「OK」ボタンをクリック
すると、ウインドウ中央がエディター画面となり、Verilogファイルが編集できるようになります。
- PWM出力回路の記述が終わったら「pwm_test.v」というファイル名で保存します。(ファイル名は任意の名称で構いません)
最上位階層の回路(全体制御回路)
次は最上位階層の回路を作成します。
この回路は全体を制御する回路(ここではPWM回路を制御する回路)です。
今回は上記のPWM出力回路だけでも問題ないのですが、機能追加などの目的で別の回路を作成して追加する場合に全体を制御する回路を作っておいた方が良いと思いましたのでこのような構成にしました。
- 記述が終わったら「neopixel_test.v」というファイル名で保存します。(ファイルの作成方法は上記と同様です)
作成した回路のチェック
- 上部メニューから「Processing」>「Start」>「Start Analysis & Elaboration」を選択して実行します
- ウインドウ下部のメッセージ欄にエラーが表示されていなければひとまず完了です
シミュレーションを行う(シミュレーションの設定、テストベンチの作成、シミュレーションの実行)
作成した回路が期待通りの動作をするかシミュレーションを実行して確認します。
テストベンチの作成
- 上記で作成した回路と同じ要領でテストベンチのファイル(Verilog HDLファイル)を作成します
- テストベンチのファイル名は「neopixel_test_sim.v」 としました
シミュレーションの設定
はじめにQuartus Prime上からシミュレーションツール(ModelSim)を起動して結果を表示するための設定を行います。
- 上部メニューから「Tools」>「Options」を選択
- Optionsのウインドウで、Category内の「General」>「EDA Tool Options」をクリック
- ModelSim-Alteraの箇所にModelSimの実行ファイルがあるディレクトリを指定して「OK」ボタンをクリック
次に、上部メニューから「Assignment」>「Settings」を選択します。
- Settingsのウインドウで、Category内の「EDA Tool Settings」>「Simulation」をクリック
- Tool name:「ModelSim-Altera」
- Format for output netlist:「Verilog HDL」
- NativeLink Setting欄の「Compile test bench」を選択して「Test benches」ボタンをクリック
- 「New」ボタンをクリック
- Test bench name:「neopixel_test_sim」
- Top level module in test bench:「neopixel_test_sim」
- End simulation at:「200 ms」(あまり長すぎると時間がかかるので、100〜500msくらいで良いと思います)
- Filename:「neopixel_test_sim.v」を指定して「Add」ボタンをクリックする(上記で作成したテストベンチファイルを指定する)
「OK」ボタンをクリックして全てウインドウを閉じます。
シミュレーションの実行
- 上部メニューから「Tools」>「Run Simulation Tool」>「RTL Simulation」を選択して実行します
するとシミュレーションツール「ModelSim」のウインドウが開き、シミュレーションが実行されます。
シミュレーションの波形を見て期待通りの動作をしていればOKです。
※もし出力波形などが動いていなかったりした場合は、作成した回路(またはテストベンチ)に問題がある可能性がありますので再度見直しを行って修正します。
今回の実験も実際には何度も「回路の修正→シミュレーション」を繰り返した結果、ようやくまともに動いたという感じです。。。
ピンアサインの設定
次は実際にボードで動作させるために信号のピンアサインを行います。
- 上部メニューから「Assignments」>「Pin Planner」を選択して実行します
- 下図のようなウインドウが開き、下部に各信号(clock_50、clr、pwm)のリストが表示されます
- 各信号のピン割当先(Location)と信号の種類(I/O Standard)を設定します
ここでは下記のように設定しました。(実際はボードのユーザーガイドや回路図を見て使用する端子を確認する必要があります)
- clock_50 → Location:「PIN_E1」、I/O Standard:「3.3-V LVTTL」
- clr → Location:「PIN_C11」、I/O Standard:「3.3-V LVTTL」
- pwm → Location:「PIN_B1」、I/O Standard:「3.3-V LVTTL」
上記の設定が終わったらピンアサインは完了ですので、このままウインドウを閉じます。(特に保存などの操作は必要無いようです)
コンパイルの実行(論理合成、配置配線)
- 上部メニューから「Processing」>「Start Compilation」を選択し実行します
下部のメッセージ欄でエラーが表示されていなければ論理合成と配置配線は完了です。
実機で動作確認
- FPGAボードをUSBケーブルでPCに接続します
- 上部メニューから「Tools」>「Programmer」を選択
- Programmerのウインドウで、「Hardware Setup」ボタンをクリックします
- Currently selected hardware:「Cyclone 10 LP Evaluation Kit[USB-1]」
に設定してウインドウを閉じます。
- 下図の状態で左側の「Start」ボタンをクリックすると、ボードにデータが転送されます
FPGAボードからWS2812Bを点灯制御できました
ボードへデータ転送が完了すると即座に作成した回路が動作します。
なんとかFPGAボードを使ってNeopixel系のフルカラーLED(WS2812B)を制御することができました。
FPGAの勉強がてら、Cyclone10の評価ボードを使ってNeopixel系LED(いわゆるマイコン内蔵LED)を動かしてみました。 pic.twitter.com/FbRavuA2oO
— iw回路設計 (@iwCircuitDesign) 2018年11月14日
この結果をもとに
今回はFPGAを使ってWS2812Bを点灯させるだけの動作でしたが、これをもとにスイッチやセンサーなどのインターフェースをつけたり、LEDの複数制御させたりして最終的にFPGAを使ったLEDライトでも作って見たいですね。
前編 >【スキルアップ】FPGAでNeopixel系フルカラーLEDを制御してみました(前編)