DE0-Nano Quartus II 14.0 QSYS 入門1

Terasic の DE0-Nano ボードで、メモリマップド I/O のテストを PC 側のコンソールから出来るらしいので試してみます。

スクリーンショット 2014-08-31 09.53.13

DE0-Nano ボード付属 CD にあるサンプルプロジェクト DE0_Nano_GOLDEN_TOP フォルダをコピー・ペーストして作業用フォルダを作成します。DE0_Nano.qpf をダブルクリックして、Quartus II を立ち上げます。

スクリーンショット 2014-08-31 09.55.43

プロジェクトに作業フォルダ内の DE0_Nano.v ファイルを追加します。

スクリーンショット 2014-08-31 09.56.07

Project メニューから Add/Remove Files in Project でファイル追加を行います。

スクリーンショット 2014-08-31 09.57.09

Qsys を起動します。

スクリーンショット 2014-08-31 10.03.12

Qsys を起動して、JTAG to Avalon Master Bridge と PIO (Parallel I/O) を追加します。

JTAG to Avalon Master Bridge 追加時の設定変更なし
PIO (Parallel I/O) 追加時の設定変更なし(Direction が Output でなければ Output にする)

各コンポーネントの配線は、画面コピー参照

Export 名の設定は、PIO の出力を、FPGA のポートに付けないといけないので PIO external_connection 行にある export 欄をダブルクリックして export します。今回は名前変更せずそのまま使用しています。

PIO の S1 のメモリマップ上のアドレスを入れます。今回は試しに 0x8000_0000 にしました。アドレスのところをクリックして修正します。

スクリーンショット 2014-08-31 10.04.02
スクリーンショット 2014-08-31 10.04.20

設定が終れば、Generate -> Generate HDL を選択して Qsys の HDL を生成します。Generate ボタンを押すと処理開始ですが、作成した設定を保存していないので、セーブのダイアログが出ます。今回は qsysPio という名前で保存しました。

スクリーンショット 2014-08-31 10.05.02

Qsys の Generate が完了したら、 DE0_Nano.v に Qsys のインスタンス作成するためのコードを書かないといけません。 Generate -> HDL Example を選択して インスタンスするコードをクリップボードにコピーします。そして DE0_Nano.v を開いてペーストします。


    qsysPio u0 (
        .clk_clk                          (CLOCK_50),                          //                       clk.clk
        .pio_0_external_connection_export (LED)  // pio_0_external_connection.export
    );

endmodule

ファイルの最後に endmodule がありますが、その手前にペーストして、() 括弧の中を書き換えます。
クロック入力は、CLOCK_50 、LED 出力は LED という名前です。修正が終れば CTRL-S で上書き保存。

次に Qsys の Generate 時に保存した、qsysPio.qsys をプロジェクトに追加します。 DE0_Nano.v を追加したときと同じ手順で追加します。

Processing -> Start Compilation や、コンパイルボタンを押してコンパイルします。

スクリーンショット 2014-08-31 10.09.00

コンパイル完了したらプログラマで DE0-Nano ボードへ .sof ファイルを書き込みます


スクリーンショット 2014-08-31 10.30.37

書き込み完了すれば早速テストを行ってみます。Tools -> System Debugging Tools -> System Console メニューを選択してシステムコンソールを起動します。ALTERA の オンライン資料: Quartus II 開発ソフトウェア に Analyzing and Debugging Designs with System Console という pdf があり、これにコマンド説明があります。

% set master_path [lindex [get_service_paths master] 0]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% open_service master $master_path
% master_write_32 $master_path 0x80000000 0x55

という方法も動きますが、先程の PDF では open_service はサポートされなくなり claim_service を使ってとありますので注意必要です。

% set service_paths [get_service_paths master]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% set master_service_path [lindex $service_paths 0]
/devices/EP3C25|EP4CE22@1#USB-0/(link)/JTAG/master_0.jtag/phy_0/master_0.master
% set claim_path [claim_service master $master_service_path mylib]
/channels/local/mylib/master_1
% master_write_32 $claim_path 0x80000000 0x55

% master_write_32 $claim_path 0x80000000 0xaa

% master_write_32 $claim_path 0x80000000 0x33

% close_service master $claim_path

ということで、claim_service 版で 0x8000_0000 に値を書き込みして LED の表示が変るかやってみます。

2014-08-31 10.27.12

2014-08-31 10.27.22

無事動いてよかったです。