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/ のディレクトリが作られ 一式インストールされます
次に Nios II SBT(Software Build Tools for Eclipse) の導入です
Nios II とは FPGA上で合成できるソフトウェア CPUです
つまり FPGAをマイコンとして利用したり 頑張れば OSが動きます
SBTは Nios II上で動くファームウェア(プログラム)の開発ツールです
Eclipseをベースとしており 統合開発環境となっています
導入にあたって 古いバージョンの Eclipseが別途必要です
Intelのサイトから CDTをダウンロードします
Quartus Primeのインストール先ディレクトリには 既に
nios2eds/bin ディレクトリがあるので ダウンロードした
CDT (つまり Eclipse本体) をそこへ解凍します
解凍されできた eclipseディレクトリを eclipse_nios2 へリネームします
$ 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_plugins.tar.gz) があるので
次のコマンドで eclipse_nios2/ 内へ上書き適用します
$ tar -xzf eclipse_nios2_plugins.tar.gz $
上記 Elipseとプラグインは JAVA8系でしか動作しません
そのためシステム(Linux)で 複数バージョンを切り替えて使える
alternativesシステムの仕組みを使って JAVA8へ切り替えます
詳細説明は省きますが 次のコマンドを参考にしてください
$ sudo apt install openjdk-8-jdk ~ $ sudo update-alternatives --config java [sudo] admin のパスワード: alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711 自動モード 1 /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711 手動モード 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 手動モード 現在の選択 [*] を保持するには 〈Enter〉、さもなければ選択肢の番号のキーを押してください: 2 update-alternatives: /usr/bin/java (java) を提供するためにマニュアルモードで /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java を使います $ update-alternatives --display java java - 手動モード 最適なリンクのバージョンは '/usr/lib/jvm/java-17-openjdk-amd64/bin/java' です リンクは現在 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java を指しています リンク java は /usr/bin/java です スレーブ java.1.gz は /usr/share/man/man1/java.1.gz です /usr/lib/jvm/java-17-openjdk-amd64/bin/java - 優先度 1711 スレーブ java.1.gz: /usr/lib/jvm/java-17-openjdk-amd64/man/man1/java.1.gz /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java - 優先度 1081 スレーブ java.1.gz: /usr/lib/jvm/java-8-openjdk-amd64/jre/man/man1/java.1.gz $ java -version openjdk version "1.8.0_362" OpenJDK Runtime Environment (build 1.8.0_362-8u372-ga~us1-0ubuntu1~22.04-b09) OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode) $
なお環境変数 JAVA_HOME は alternativesで切り替わらないため
別途設定する必要があります
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 ディレクトリを作り
そこにプロジェクト毎のディレクトリを作るようにしました
次の画面で Project Typeを選択しますが Empty Projectとします
次の Add Files はプロジェクトへ追加するファイルを指定しますが
(後から メニューの File – Add からでも追加できる)
ここは Nextを押してスキップします
次は ターゲットデバイスの指定です
Family にて MAX10 を指定して Available devicesにて
ターゲットのチップ 10M08SAE144C8G を選択します
ボード製品を購入したのであれば Boardタブから
ターゲットを指定することも可能ですが
あいにく MAX10-FB製品は登録されてないようです
次に 関連ツール(EDA:半導体設計支援)の選択画面が出た場合 次のように選択します
Design Entry/Synthesis ではとりあえず Precison Synthesis を選択
(後からメニューの Assignments – Settings にて変更可能)
Simulation では MAXシリーズ用に ModelSim と Formatに Verilog HDL を選択
(後からメニューの Tools – Options の General にて変更可能)
最後 Summary画面にて設定内容を確認して Finishを押せば
プロジェクトが生成されます
まず Verilog-HDLのソースファイル(拡張子 .v)を作ります
なお参考に QuartusPrime関連の拡張子は次の種類があります
(こちらで 把握できた分なので 全てを網羅していません)
.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 で一旦ファイル名を変えます
また その際 Add file to current project へチェックを入れておきます
Lchika1.v の名前でプロジェクトへ追加しました
これで図の通り Lchika1.v が編集用に開かれ
また Navigator を Files に切り替えると プロジェクトに加わった
状態となっていることが分かります
次のように Verilog-HDLの文法で記載します
`define COUNT_MS 1000000 module Lchika1 ( input wire clock, input wire button, output wire [2:0] led ); reg [2:0] led_counter; reg [25:0] counter; 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; if (button) begin led_counter <= led_counter + 3'd1; end end end assign led = led_counter; endmodule
ここでは HDLの文法解説は省略しますが
入力として clock (クロック) と button (基板の押しボタン)
出力として 3bit長の led (各bit R G B の LED光に対応)
の 3パラメータ を使った回路です
動作としては clock変化をトリガとして
led値をインクリメントすることで LEDを 8色順番に光らせます
clock は 100万カウント(約0.1秒)後にトリガを出します
button が押されている間は色の変化は停止します
これを一度コンパイルしてみます
メニューの 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 にて Compile test bench を選択した上で
Test Benches... ボタンを押すとテストベンチ登録画面が出ます
登録画面で Newを押して登録します
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 を選択します (高機能版は 有償かもしれないため)
Finish を押せば System Contens 一覧にコンポーネントが追加反映されます
同様の要領で 次のコンポーネントを追加しました
On-Chip Memory | Basic Functionsカテゴリ配下にある RAMに相当 デフォルトの4KBを指定 また MAX10の場合は memory initialization機能が使えないためこのチェックを外す必要があった |
On-Chip Flash | これも Basic Functions配下 ROMに相当 ファームウェアを格納する Confiurationは Sigle Uncompressed Imageを選択 また Initialize flash contentはチェックを外す |
JTAG UART | Interface Protocols → Serial配下 JTAG外部接続機能 irqを Nios IIの irqへ結線する必要あり (後述) |
PIO | Processors & Peripherals配下 メモリマップド可能なパラレルポート 今回は LEDの3色へ接続するため 3bit(Width) OUTPUTを指定 Finish後 System Contents欄にて External connectionピンをLEDへ結線するための Export蘭に識別名をつける設定をしておきます Export列をダブルクリックして 識別名「pled」を付与します |
一覧の Connections欄をいじって 必要な結線を指定します
Messages欄に 構成チェックによるエラーが表示され
上記結線によりある程度解消されますが まだエラーが残ります
まず 2つある ~slave is not specified については
Nios II(nios2_gen2_0)の設定を開きなおして Vectors タブを設定します
Reset Vector や Exception Vectorに On-Chip Memoryを指定します
overlaps のエラーが複数残っていますが
アドレスマップのアドレス衝突が原因です
Address Mapタブからアドレス割り当てを調整します
×マークの付いている所が衝突個所で アドレスを図のように調整します
これで一通り Nios IIの構成は完成しているはずなので
一旦メニューの File - Save As で名前を付けて保存します
指定名称.qsys の拡張子で設計ファイルとて保存されます
続けて
メニューの Generate - Generate HDL により HDLを生成させます
付けた名前/synthesis/付けた名前.qip をはじめとするデザイン
が生成されるはずです
これら Platform Designerの生成物は 元のプロジェクトへ
自動的に組み込まれるわけではなく 手動で組み込む必要があります
メニューの Generate - Show Instantiation Template を見ると
モジュールの呼び出しの文例を確認することができます
文例は後で貼り付けるのでどこかへコピーして退避しておき
Platform Designer は閉じます
次のような案内ダイアログが出ますが
生成された .qip や .sip ファイルをプロジェクトに追加しろ
という内容で このすぐ後段で対応するので参照してください
Quartus Primeのプロジェクトに戻ったら
トップデザイン.v を新規に登録して (メニューの File - New)
先ほど退避した Platform Designer の文例を貼り付けて修正します
修正個所は引数部分で トップモジュール側のワイヤを指定します
後述しますが JTAG用のピン tck, tdl, tdo, tms を割り当てています
デザインは Processing - Start Compilation でコンパイルしておきます
また Platform Designer で生成した .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 へ繋げています
これにより ピン59~62 を通じ Nios IIへデバッガを接続できます
次に必要となるのは Nios II にファームウェアを与えること
つまり Nios II上で動作するプログラムを作ることです
メニュー Tools - Nios II Software Build Tools for Eclipse
を選択して Eclipse開発環境 (Nios II EDS) を立ち上げます
FPGA関連へ戻る