今回はexStickGE上のMicroBlazeでLinuxを動かしてみます.
簡易的にJTAGから書き込む形です.
Linuxについて開発するので開発環境もWindowsではなくLinuxが必要です.
Ubuntu 18.04上で開発します.
Vitis 2020.1 と PetaLinuxを導入しておきます.
PetaLinux のインストールはUG1144などを参考にしました.
ハードウェア側の設計
前回作成したボードファイルを使用します.
GitHubからダウンロードし Vivado のボードファイルディレクトリにコピーします.
/tools/Xilinx/Vivado/2020.1/data/boards/board_files
その後 Vivado を起動します.
source /tools/Xilinx/Vivado/2020.1/settings64.sh vivado &
/home/dev/Project の下に linuxprj というプロジェクト名で生成します.
Create Project をクリックし進めていきます.
Default Part では先程追加した exStickGE を選択して最後まで進めます.
ブロックデザインの作成
ブロックデザインを作っていきます.
左側の Flow Navigator から Create Block Design でそのまま生成します.
その他に System Reset, System Differential Clock, 3 LEDs を追加します.
どれも初期設定で生成します.
Add IP から Clocking Wizard を1個追加します.
クロックの設定を変えていきます.
clk_wiz_0 は以下の変更を行います.
- 出力クロックを 100MHz と 200MHz
- リセットタイプはActive Low
clk_wiz_1 は以下の変更を行います.
- 出力クロックを 310MHz
- リセットタイプはActive Low
次に配線します.
- clk_wiz_0 と clk_wiz_1 の resetn は 外部端子の reset へ接続
- clk_wiz_1 の clk_in1 は clk_wiz_0 の CLK100M へ接続
- mig の sys_rst は外部端子の reset へ接続
- mig の clk_ref_i 及び sys_clk_i につながる外部端子を削除
- mig の clk_ref_i は clk_wiz_0 の CLK200MHz へ接続
- mig の sys_clk_i は clk_wiz_1 の CLK310MHz へ接続
次は MicroBlaze を追加します.
Run Block Automationをクリックして,パラメタを変更します.
ここでは,メモリサイズは最大にしておき Interrupt Controller にもチェックを入れておきます.
生成された MicroBlaze をダブルクリックで設定画面を開きます.
Predefined Configurations を Linux with MMU にします.
Linuxを動かすのにシリアル通信,タイマー,QSPIモジュールが必要なので追加します.
まずは Add IP から AXI Uartlite を追加します.
ダブルクリックで設定を開き,baudrate を 115200 に変更しておきます.
また AXI Timer と AXI Quad SPI も追加します.
AXI Quad SPI はダブルクリックで Mode を Quad,
Slave Device を Micron に変更します.
AXI Timer の interrupt を AXI Interrupt Controller につながっている
Concat の In0 に接続します.
Uartlite の interrupt も同じ Concat の In1 に接続します.
その後は上部の Run Connection Automation で全てにチェックを入れて自動接続します.
ブロックデザインの作成はここで完了です.
保存して Project Manager に戻りブロックデザインのラッパーファイルを作成します.
追加したシリアル通信モジュールとQSPI用にピンアサインの定義ファイルを作成します.
Project Manage->Add Sources から Add or create contraints ,
Create File で適当なファイルを生成します.
ファイルの内容は以下のとおりです.
#UART set_property PACKAGE_PIN R18 [get_ports uart_rtl_rxd] set_property PACKAGE_PIN T18 [get_ports uart_rtl_txd] set_property IOSTANDARD LVCMOS33 [get_ports uart_rtl_rxd] set_property IOSTANDARD LVCMOS33 [get_ports uart_rtl_txd] #QSPI set_property IOSTANDARD LVCMOS33 [get_ports spi_rtl_io0_io] set_property IOSTANDARD LVCMOS33 [get_ports spi_rtl_io1_io] set_property IOSTANDARD LVCMOS33 [get_ports spi_rtl_io2_io] set_property IOSTANDARD LVCMOS33 [get_ports spi_rtl_io3_io] set_property IOSTANDARD LVCMOS33 [get_ports {spi_rtl_ss_io[0]}] set_property PACKAGE_PIN P22 [get_ports spi_rtl_io0_io] set_property PACKAGE_PIN R22 [get_ports spi_rtl_io1_io] set_property PACKAGE_PIN P21 [get_ports spi_rtl_io2_io] set_property PACKAGE_PIN R21 [get_ports spi_rtl_io3_io] set_property PACKAGE_PIN T19 [get_ports {spi_rtl_ss_io[0]}]
ここまですべて終えたら Generate Bitstream で論理合成します.
生成を終えたらメニューバーから File->Export->Export Hardware で
ハードウェアファイルを生成します.
include bitstream にしておき最後まで進めます.
ソフトウェア側の生成
PetaLinux を用いて Linux を生成していきます.
おまじないを実行します.
(UG1144では/opt/pkg以下で説明されているので適時環境に応じて変更してください)
source /opt/petalinux/2020.1/settings.sh
~/Project/linuxprj へ移動しプロジェクトを作ります.
cd ~/Project/linuxprj petalinux-create -t project -n sw --template microblaze
次にハードウェア定義ファイルを反映します.(xsaファイルがあるディレクトリを指定します)
このとき端末ウィンドウサイズを大きくしておかないと
menuconfig が開けないよと怒られます.
cd sw petalinux-config --get-hw-description=../
menuconfig は設定する項目がないのでそのまま終了します.
次にビルドします.時間がかかるので気長に待ちましょう.
petalinux-build
ビルドが終わればソフトウェアは完成です.
実際に動かしてみる
動作確認をするためにシリアル通信モジュールを接続します.
FPGA側から見たピンアサインは 1:RXD ,2:TXD, 5:GND で IO レベルは 3.3V です.
LEDの数字は後で使用します.
JTAG ケーブルを接続し次のコマンドを実行します.
petalinux-boot --jtag --fpga petalinux-boot --jtag --kernel
そうすると FPGA にビットファイルが書き込まれメモリへ Linux が展開されます.
その後自動で走り始めるので待っているとログインプロンプトが表示されます.
ユーザ名及びパスワードはどちらも root です.
ログイン後情報を表示してみました.メモリの使用量すごく少ないですね.
LEDを光らせよう
MicroBlaze に LED を GPIO で接続しているので Linux 側から光らせてみましょう.
export へ GPIO の番号を入力すると有効化されるので入出力方向を設定します.
その後 value へ 0,1 を書き込むことで LED のオンオフができます.
cd /sys/class/gpio # enable echo 509 > export echo 510 > export echo 511 > export # set out dir echo out > gpio509/direction echo out > gpio510/direction echo out > gpio511/direction # set LED on echo 1 > gpio509/value echo 1 > gpio510/value echo 1 > gpio511/value # set LED off echo 0 > gpio509/value echo 0 > gpio510/value echo 0 > gpio511/value
まとめ
MicroBlaze 上で JTAG からのブートではありますが Linux を動かすことができました.
GPIO として接続した LED を Linux 上から簡易的に制御してみました.
ソフトウェアプロセッサでも Linux が動くので,できることが広がります!
是非試してみたください.
コメント
[…] 前回のプロジェクト linuxprj を開きます. その後左の Flow Navigator->PROJECT MANAGER->Add Sources をクリック. Add or create design sources で次へ進み Add Files で 最初にダウンロードしておいた mii2rgmii.v を追加します. […]