MAX10で Lチカまで開発環境構築メモ
FPGAチップの MAX10の開発環境を構築したメモ
図の左側 MAX10-JB基盤は オプションボードで
図の右側 MAX10-FB基盤 MAX10本体と合体させることで
JTAG接続の デバッガ兼ファームライタとして利用できます
なお MAX10-JB基盤は PIC18F14K50-I/P と 12MHz水晶が載って
ジャンパを外せば 純粋な PICマイコンとして単体利用できます
ここは普通に MAX10 とJTAG接続する USB Blaster互換基盤として
利用したいところですが 予想以上に初見殺しなデバイスでした
まず
中の説明書には明記されておらず ヒントだけ書かれていますが
「ジャンパピン」の接続が必要です
何も考えずに MAX10 と合体して USB繋いでも認識されません
- J1~J4オープン J5-J8ショートすることで USB Blaster利用
- J1~J4ショート J5-J8オープンすることで MAX10からPICへのファームウェア書き込み
- J1~J4オープン J5-J8オープンして MAX10-FBと繋げず 汎用のPICマイコンとして利用
と使い分けることになります
まずは本体 MAX10-FB から
本来 買った MAX10-FB にはファームウェアが書き込まれていて
MAX10-JB の J1~J4をショートしたうえで MAX10-FB と繋いで
電源を入れれば MAX10-JBの PICへファームウェアが転送される
仕組みだったようです
ところがうまく書き込まれず
後から気づいたのですが 次の図の裏面 12ヵ所の赤丸
ジャンパを全てはんだを盛ってショートさせる必要がありました
そうしないと MAX10に電源が入らない
表の J1 も黄色ジャンパ取りつけてショートしました
これは MAX10のブートセレクトらしく
バックアップファームウェアを使わないようにします
また うまく書き込まれたとしても
Windowsからしか USB Blasterを認識できないファームウェアのようです
結局 次の手順で Linux対応のファームウェアを
MAX10-JBへ直接書き込むことにしました
MAX10-JB の PICへ USB Blasterを直接書き込む
幸い PICライタが手元にあるので
PICライタを使って 次のように直接 MAX10-JB へ
ファームウェアを書き込む方法を取りました
PICkitとの接続ピンアサインは次の通り
5本のケーブルで PICkitへつなげます
(Vss と Vdd は分かりづらいですが それぞれ
裏面のピンヘッダで GND と 3.3V です)
次の書き込むファームウェアは何を使うかですが
当初 サポートサイト で配布されている
Linux対応ファームウェア「USB_JTAG.zip」 を
PIC用の開発環境 MPLAB X IDE にてビルドしたのですが
結局USBデバイスとして認識されませんでした
そこで見つけた別サイト USB-Blasterもどきの製作にて
ビルド済のファームウェアが配布されて使えたため この方法を紹介します
まず MAX10-JB を改造して USB-Blasterもどきの製作
紹介されている 回路図相当へ変更します (電子工作が必要)
この写真の赤丸の通り 次の改造を行います
- PICの 6番ピンと9番ピンを 100Ω抵抗経由で接続
- PICの 11番ピンと16番ピンを 100Ω抵抗経由で接続
- 抵抗R2の PIC側を切って 抵抗の足と PICの10番ピンを接続
- 裏面の写真の通り PICの 7番ピンと J7 の遠い側のピンを接続
次に USB-Blasterもどきの製作 から
ub7.zip をダウンロードして中に含まれている
Blaster7SPI.hex を取り出し
PICkit経由で MAX10-JBの PICへ書き込みます
さらに MAX10-JBの USB接続が Linuxで認識されたとき
/dev/usbblaster/ のデバイスファイルを作成するよう
UDEVへ設定を追加します
/etc/udev/rules.d/51-usbblaster.rules
の次の内容のファイルを作成しておきます
# Intel/Altera USB-Blaster SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666", SYMLINK+="usbblaster/%k" # # Intel/Altera USB-Blaster II SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666", SYMLINK+="usbblaster2/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666", SYMLINK+="usbblaster2/%k"
これでようやく準備が整ったので
MAX10-JB の J5, J6, J8 をショートして
MAX10-FB と合体した状態で LinuxへUSB接続します
dmesg で次のメッセージが出れば認識されてます
[1104123.251726] usb 8-1: new full-speed USB device number 66 using xhci_hcd [1104123.432341] usb 8-1: New USB device found, idVendor=09fb, idProduct=6001, bcdDevice= 4.00 [1104123.432346] usb 8-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [1104123.432349] usb 8-1: Product: USB-Blaster [1104123.432351] usb 8-1: Manufacturer: Altera [1104123.432353] usb 8-1: SerialNumber: 00000000
Quartus Primeのインストール
次にFPGAの開発環境を導入します
MAX10の場合 インテルから提供される Quartus Prime
が統合開発環境として利用可能です
ライトエディションは無料での提供ですが
FPGA開発に必要な次の機能を一通り備え 十分使えます
- 高位合成 C言語などの高級言語による回路動作の記述 (Quartus Primeではオプション機能の扱い)
- デザインとコンパイル VHDL や Verilog-HDL などの言語記述から論理合成
- テストベンチ スタティックタイミング解析などシミュレータ上にて回路の動作を検証
- インプリメント FPGAチップ固有のピンアサイン や 乗算器やDSPといったカスタムブロック を利用できるようにする
- プログラミング FPGA実機のフラッシュメモリやSRAMへ合成されたコードをダウンロード転送
- デバッグ FPGA実機に対してデバッガハードウェア経由で動作を解析
Quartus Prime ライトエディションを Ubuntu22.04LTSへインストールしました
ダウンロードしたファイルは次の通り
Quartus-lite とあるのが Quartus Prime本体
ModelSimSetup とあるのが シミュレータ
HLSProSetup とあるのが 高位合成(HLS)ツール
ファイルサイズが大きいので ダウンロードその他注意が必要
高位合成ツールは Quartus Prime Pro Edition の場所にあります
高位合成ツールだけなら無償で利用できるようです
まず Quartus Prime 本体のインストールから
tarアーカイブを一時ディレクトリに解凍して 中の setup.sh を実行
$ ./setup.sh The Intel software you are installing is 64-bit software and will not work on the 32-bit platform on which it is being installed. Do you want to continue to install the software? (y/n):
(ホームディレクトリ)/intelFPGA_lite/22.1std/ のような場所を指定します
続いて MAX10用のシミュレータとして ModelSimをインストールします
インストール先 は Quartus Primeをインストールした先を手動で指定します
(ホームディレクトリ)/intelFPGA_lite/22.1std/modelsim_ase/ のように
modelsim_ase/ ディレクトリが作られます
なおここで ~/intelFPGA_lite/22.1std/modelsim_ase/bin/vsim と打って
シミュレータがエラーで起動しない場合
32bit版の Linux共有ライブラリが不足しているので
次のコマンドでインストールしておきます
# apt-get install libxft2:i386 libxext6:i386 libstdc++6:i386
以下 HLSコンパイラの導入の記載ありますが
HLSコンパイラは動作未確認です
さらに 高位合成ツールとして HLSコンパイラもインストールします
HLSProSetup-~.run が起動しない場合 libtinfo.so.5 ライブラリが不足
していて 手元の環境では次の対応を行いました
# apt-get install libtinfo-dev # cd /usr/lib/x86_64-linux-gnu/ # ln -s libtinfo.so.6.3 libtinfo.so.5
バージョンが異なる libtinfo.so.6.3 を強引に libtinfo.so.5 へ
見せる どこにも推奨されてない方法と思います ご注意ください
これでようやく HLSコンパイラのインストーラが起動します
これもインストール場所を手作業で指定して
(ホームディレクトリ)/intelFPGA_lite/22.1std/ とします
gcc/ や hls/ のディレクトリが作られ 一式インストールされます
MAX10-FB で Lチカ
ここから実際に Quartus Primeで回路合成を試してみます
MAX10-FB には フルカラーLED が搭載されているので
まず簡単な記述で LEDを光らせます
Quartus Primeは 次のコマンドで起動します
$ ~/intelFPGA_lite/22.1std/quartus/bin/quartus &
本格的な IDE風の GUIです
他の IDEと同じく開発物は プロジェクト単位で管理します
メニュー File – New Project Wizard から新規プロジェクトを作成します
プロジェクトは ホーム直下に QuartusPrime ディレクトリを作り
そこにプロジェクト毎のディレクトリを作るようにしました
空のプロジェクトを作ったので 必要な設定を行います
ターゲットデバイスが MAX10で シミュレータが ModelSim であることを設定します
メニュー Assignments – Device にてターゲットデバイスを指定します
Family にて MAX10 を指定して Available device にて
今回の MAX10-FBに載っているチップ 10M08SAE144C8G を選択します
なお Boardタブを見ても MAX10-FBのボードは登録されてないようです
ピンアサインなどはこの後 手動で指定するので問題ないです
次に開発ツールの設定に入りますが その前に
Tools – Options の Generalにある EDA Tool Options にて
ModelSimの実行プログラム置き場所を設定しておきます
メニュー Assignments – Settings の EDA Tool Settings で
EDA(半導体設計支援) 関連の設定をしていきます
まず Design Entry/Synthesis にてコンパイラを指定します
とりあえず?的に Precision Synthesis を指定
次に Simulation にてシミュレータを指定します
先ほどインストールした ModelSim を選択します
Format for output netlist には回路記述言語を指定しますが
ここでは Verilog-HDL を使うことにします
それでは準備が整ったので 回路を記述していきます
今回は Verilog-HDL のみ使い 高位合成は使いません
Verilog-HDLのソースファイルをプロジェクトへ追加します
拡張子は .v なお関連する拡張子は次の種類があります
(こちらで 把握できた分なので 全てを網羅していません)
.qpf | Quartus Primeプロジェクト設定 プロジェクトに対して 1つ |
---|---|
.qsf | Quartus Primeプロジェクト設定 リビジョン毎に作られるファイルリスト デバイス 合成・配置配線制約 ピンなどレイアウト制約 |
.vhd | VHDL言語デザイン |
.v | Verilog-HDL言語デザイン |
.sv | System Verilog言語デザイン |
.vht .vt | テストベンチテンプレート .vhtはVHDL .vtはVerilog-HDL |
.bdf | 回路図ファイル |
.sof | SRAM向けプログラムイメージ |
.pof | フラッシュ向けプログラムイメージ |
.stp | オンチップデバッグの生成ファイル |
.vo | ネットリスト |
.vqm | EDAツール向け 論理合成済 ATOMレベルのネットリストファイル |
.edf | EDAツール向け 論理合成済 出力ファイル |
では メニューの File – New から
種類として Verilog HDL File を指定して新規ファイルを開きます
仮のファイル名のため File – Save As で一旦ファイル名を変えます
Lchika1.v としました
また その際 Add file to current project へチェックを入れておきます
これで図の通り Lchika1.v が編集用に開かれ
また Navigator を Files に切り替えると プロジェクトに加わった
状態となっていることが分かります
次のように Verilog-HDLの文法で記載します
`define COUNT_MS 4000000 module Lchika1 ( input wire clock, input wire button, output wire [2:0] led ); reg [2:0] led_counter; reg [25:0] counter; reg cnt_clock; reg cnt_user; initial begin led_counter = 3'd0; counter = 26'd0; end always@(posedge clock) begin counter <= counter + 26'd1; if (counter == `COUNT_MS) begin counter <= 26'd0; cnt_clock <= 1; end else begin cnt_clock <= 0; end end always@(button) begin cnt_user <= button; end always@(negedge (~cnt_user || cnt_clock)) begin led_counter <= led_counter + 3'd1; end assign led = led_counter; endmodule
ここでは HDLの文法解説は省略しますが
入力として clock (クロック) と button (基板の押しボタン)
出力として 3bit長の led (各bit R G B の LED光に対応)
の 3パラメータ を使った回路です
動作としては
clock もしくは button の変化をトリガとして
led値をインクリメントすることで LEDを 8色順番に光らせます
clock は 400万カウント(約0.1秒)後にトリガを出します
これを一度コンパイルしてみます
メニューの Processing - Start Compilation で
デザインに問題なければ Full Compilation was successful になります
デザインは問題なさそうなので
実機にプログラムする前に シミュレータで動作検証します
シミュレーションするには テストベンチを記述します
メニューの Processing - Start - Start Test Bench Template Writer
により テストベンチのテンプレートを生成してくれます
(プロジェクトの保存フォルダ)/simulation/modelsim/Lchika1.vt
が生成されます
これを File - Open から開いて必要な処理を記述します
図の赤枠部分が 変更・追記 した部分です
まず シミュレーションのタイムスケール設定
1 ps/ 1 ps
では ピコ秒単位のシミュレーションは細かすぎるので
10 ns/ 1 ns
としました
あとは initialの初期化ブロックや alwaysの順序回路ブロックへ
clockの挙動を記載しました
#1 clock <= ~clock;
というのは 1タイムスケール後に ビットを反転する指定です
これで 50MHz のクロック動作となり 実機の動作(48MHz)に近くなります
また alwaysブロック内の @eachvec の記載は
ループ処理が停まる要因なので コメントアウトします
出来上がったテストベンチを登録します
メニューの Assignments - Settings の EDA Tool Settings - Simulation
にて NativeLink Settings の Test Benches... ボタンを押します
テストベンチが登録できる画面で 次の図のように登録します
まず Test bench and simulation files で
使った Lchika1.vt を登録して (Add を押してリストに追加する)
デザインのモジュール名 や テストベンチのモジュール名 を指定
Simulation period は LEDの挙動を一通り見るため 500ms を指定
ModelSim を起動させてシミュレーションさせます
メニューの Tools - Run Simulation Tool - RTL Simulation
を実行します
500ms分のシミュレーション(run 500ms)が行われ 少し待たされます
結果は時系列グラフが表示されるので Zoom Full で全体を見渡します
led の挙動の変化を見て 意図通り動作していると確認できます
シミュレーションは Zoom In/Out で任意の時間帯を確認できます
clock の動作の詳細を見るため Zoom In を20回くらい押すと
図の通り 100ns間に 10回ほど切り替わっており 50MHzと確認できます
検証も問題なさそうなので 開発を継続します
今回の入出力となる clock button led を実機のI/Oピンと紐づけます
なお MAX10-FB のボードは次のピンアサインとなっているので
これに合わせる形です
IO | 接続 |
---|---|
PIN27 | クロック |
PIN120 | ~フルカラーLED 赤 |
PIN121 | ~フルカラーLED 緑 |
PIN122 | ~フルカラーLED 青 |
PIN123 | ~SW1 ボタン |
メニューの Assignments - Pin Planner を選択します
Pin Planner の画面では clock button led のワイヤが
既に登録されているので
それぞれ Locationの部分をダブルクリック PINを割り当てます
Pin Planner の設定が終わったら 再度コンパイルしておきます
メニュー Proccessing - Start Compilation
いよいよ 実機にプログラムします
メニューの Tools - Programmer が書き込みアプリケーションです
まず USB Blasterが認識されていることを確認します
次に書き込みイメージの確認です
今回は SRAMへ書き込むので .sof を指定します
SRAMへの書き込みは 即座に実機の回路へ反映されますが
電源を切ると設定内容が消えます
うまくいけば次の アニメーションGIFのように動作します
Platform Designer と Nios II
基本的な回路合成方法も解り 次はCPUでも作ってみたいところですが
その前に Quartus Primeには Platform Designerという機能があります
Platform Designerとは いわゆるライブラリにあたる便利機能で
USBや Ethernetの機能 あるいは 画像処理などの DSP機能など
必要に応じた機能が利用可能になっています
また Nios IIという 32bitアーキテクチャの ソフトウェアCPU があり
つまり FPGA上で CPUを合成して PCを作ることができます
ここでは Platform Designer を使い Nios II コンピュータを試します
Quartus Primeにて新しいプロジェクトを作成して
メニューの Tools - Platform Designer を選びます
Platform Designerの構成情報は .qsys という拡張子で保存されます
今回は 新規に構成情報を作ることになります
左上に IP Calalogの欄が見えていて これがいわゆるライブラリです
この中から欲しいものを選んで追加していきます
初期段階では Sytem Contents上に クロックソースである clk_0
のみが追加された状況であることが確認できます
カタログから 早速 Nios II を選んで追加(Add)します
コンポーネントを追加する毎に 詳細設定のダイアログが開きます
Nios II の場合 CPUのモデルが 2種類から選べるようです
今回は NiosII/e を選択します (高機能版は 有償かもしれないため)
同様に次のコンポーネントを追加しました
On-Chip Memory | RAMに相当 デフォルトの4KBで また MAX10の場合は memory initialization機能が使えないためこのチェックを外す必要があった |
On-Chip Flash | ROMに相当 ファームウェアを格納する Confiurationは Sigle Uncompressed Imageを選択 また Initialize flash contentはチェックを外す |
Serial JTAG UART | JTAG外部接続機能 irqを Nios IIの irqへ結線する必要あり |
PIO | メモリマップド可能なパラレルポート 今回は LEDの3色へ接続するため 3bitを指定 また External connectionピンをLEDへ結線するため Export蘭に識別名をつける |
で 次のようになります 各コンポーネント共通で設定が必要なのは
clk と reset ピンを Nios IIの clk と resetへ結線すること
data や csr や s1 ピンを Nios IIの instruction_master や data_master
へ結線すること
instruction_master や data_master の設定は
Message欄のエラーが消えるまで 設定を調整する必要あります
Address Mapタブの アドレスマップの割り当てを
各機能が被らないように アドレスを手作業で設定します
また Nios IIの設定を開きなおして Vectors の設定を行います
Reset Vector や Exception Vectorには メモリを指定します
これで一通り Nios IIの構成は完成しているはずなので
一旦メニューの File - Save As で名前を付けて保存します
指定名称.qsys の拡張子で設計ファイルとて保存されます
続けて
メニューの Generate - Generate HDL により HDLを生成させます
付けた名前/synthesis/付けた名前.qip をはじめとするデザイン
が生成されるはずです
これら Platform Designerの生成物は 元のプロジェクトへ
自動的に組み込まれるわけではなく 手動で組み込む必要があります
メニューの Generate - Show Instantiation Template を見ると
モジュールの呼び出しの文例を確認することができます
文例をコピーしたら Platform Designer は閉じて
元のプロジェクトのトップデザインへ貼り付けます
なお引数には トップモジュール側のワイヤを指定します
後述しますが JTAG用のピン tck, tdl, tdo, tms を割り当てています
\
さらに 生成した Nios IIとしての .qip もプロジェクトへ組み込みます
メニューの Project - Add/Remove Files in Project にて
次の図のように 一覧へ追加します
今回 ピンアサインは
メニューの Assignments - Pin Planner のように
clk(入力クロック), led(フルカラーLED) を物理ピンに割り当てます
また Nios II用の JTAGデバッグピンである altera_reserved_t* 4つも
作られているのでこれも同様に割り当て設定を行います
これら4つのピンアサインは固定なため 結局次のような割り当てです
altera_reserved_t* を外部向けの物理ピンへ直結するよう
先ほどのトップモジュールのコード assign構文にて
tck, tdl, tdo, tms へ繋げています
これにより PIN59~62 を通じ Nios IIへデバッガを接続できます
次に必要となるのは Nios II にファームウェアを与えること
つまり Nios IIが動作する システムプログラムを作ることです
メニュー Tools - Nios II Software Build Tools for Eclipse
(SBT) が提供する Eclipse開発環境 (Nios II EDS) を使います
ただ このメニューが起動するには 次の環境構築が必要です
(手元の環境 Ubuntu-22.4 + OpenJDK-17 にて確認)
まず 古いバージョンの Eclipseが必要です
Intelのサイトから CDTをダウンロードします
Quartus Primeのインストール先ディレクトリには 既に
nios2eds/bin ディレクトリがあるので ダウンロードした
CDT (つまり Eclipse本体) をそこへ解凍します
$ cd ~/intelFPGA_lite/22.1std/nios2eds/bin $ tar -xzf ~/eclipse-cpp-mars-2-linux-gtk-x86_64.tar.gz $ mv eclipse eclipse_nios2 $
解凍されできた eclipse ディレクトリを eclipse_nios2
へリネームしておきます
さらに次のコマンドで eclipse_nios2/ 内へ上書きする
形で Eclipseプラグインを追加します
$ tar -xzf eclipse_nios2_plugins.tar.gz $
Quartus Primeに含まれていて導入された JAVA
quartus/linux64/jre64/ はうまく動作しなかったため
これは削除して OSの最新 JAVA (openjdk-17-jdk)
を利用するように設定変更します
$ rm -r ~/intelFPGA_lite/22.1std/quartus/linux64/jre64 $ ln -s /usr/lib/jvm/java-17-openjdk-amd64 jre64 $
Eclipseの起動オプションも変更を加える必要あります
古い JAVA向けのもので Eclipseが起動しないため
~/intelFPGA_lite/22.1std/nios2eds/bin/eclipse_nios2/eclipse.ini
を次のように編集します
~ --launcher.appendVmargs -vmargs --add-opens=java.base/java.net=ALL-UNNAMED -Dosgi.requiredJavaVersion=1.7 #-XX:MaxPermSize=256m -Xms256m -Xmx1024m -Dosgi.configuration.cascaded=true -Dosgi.instance.area.default=@user.home/sbt4e-22.1-workspace ~
--add-opens=java.base/java.net=ALL-UNNAMED
のオプションを追加して
-XX:MaxPermSize=256m
のオプションを外す必要がありました
FPGA関連へ戻る