Kyoto Maker

Software & Hardware Laboratory Found In Kyoto, 2015.

Helioボード: FPGAに定数を出力する自作モジュールを追加してユーザーランドから値を取得する実験

はじめに

前回、Helioのリファレンスデザインに実装されているSystem IDをユーザーランドから取得する実験をしました。今回は一歩進んで、FPGAに自作モジュールを追加してみます。 と言っても、System IDと同じで定数を返すだけのものです。 ユーザーランドから自作モジュールにアクセスできるようにすることに注力します。

今回のハイライト: 以下の中央にある「deadbeef_0」を自作します。

f:id:fixme:20150124114046p:plain

自作モジュールのコード

ここは今回は注力すべき所ではないため手抜きです。

System IDコアをsynthesisしたら生成されるコードがsynthesis/submodules/soc_system_sysid_qsys.vにあります。 このコードを参考に、定数を出力するモジュールを実装します。 出力する値は、ぱっと見で正しいことがわかるように、16進数でdeadbeefとします。

System IDコアのインタフェースを踏襲するので、Avalon Memory-Mapped Interfaceのスレーブ側に接続可能なモジュールになります。

deadbeef.vとして保存します。

module deadbeef(
  clk,
  reset_n,
  address,
  readdata
);

  input            clk;
  input            reset_n;
  input            address;
  output  [ 31: 0] readdata;

  wire    [ 31: 0] readdata;
  assign readdata = 32'hDEADBEEF;

endmodule

自作モジュールの追加

ここが今回のメインの作業です。 Helioのリファレンスデザインをベースに自作モジュールを追加していきます。

1. Qsysを開きます。リファレンスデザインのsoc_system.qsysを開きます。

2. IP CatalogからNew Componentをダブルクリックします。

3. Content Typeタブにて、NameとDisplay nameに「deadbeef」と入力します。

f:id:fixme:20150116223548p:plain

4. Filesタブにて、Synthesis Fileにある「+」を選択します。「deadbeef.v」を選択します。 Analyze Synthesis Filesを選択します。

f:id:fixme:20150116223611p:plain

5. Signalsタブにて、図の通りであることを確認します。

f:id:fixme:20150116223649p:plain

6. Interfacesタブにて、avalon_slave_0のAssociated Resetにresetを選択します。 選択すると、先ほどまでMessagesに出ていたエラーが無くなります。

f:id:fixme:20150116223718p:plain

7. Finishを選択します。

8. Yes, Saveを選択します。

9. IP Catalogに追加されたdeadbeefをダブルクリックします。

10. Finishを選択します。

11. System Contentsタブにて、deadbeef_0のclock、reset、avalon_slave_0を結線します。

12. deadbeef_0のBaseアドレスを0x0001_0010に変更します。既存のsysid_qsysモジュールのBaseアドレスと重複しないように配慮します。

f:id:fixme:20150116223815p:plain

Schematicを確認してみます。単に雰囲気を味わうだけ。QsysのメニューのView -> Schematicを選択します。そうすると、以下のように中央にdeadbeef_0モジュールが配置されているのがわかります。Schematicを確認することで、より直感的に理解できます。

f:id:fixme:20150124114046p:plain

13. Generate -> Generate HDLを選択します。

14 デフォルトのままでGenerateを選択します。

15. 生成が終わったらQsysを閉じます。

コンパイルFPGAへの書き込み

Quartus IIでコンパイルしてsofファイルをFPGAに書き込みます。手順は以前のLチカと同じです。

ユーザーランドのコード

ここも今回注力すべきではないので手を抜きます。 以前実験で実装したコードをそのまま流用します。 以前のコードで「off_t SYSTEM_ID_BASE = 0x10000;」としていたアドレスを0x10010に変更します。これはdeadbeef_0のBaseアドレスです。変更するのは、ここだけです。

このコードを前回と同様の手順でクロスコンパイラでコンパイルして、Helioボードに実行ファイルをscpでコピーします。

実行

実行してみると、deadbeefモジュールで実装した「32'hDEADBEEF;」が出力されます。ユーザーランドからFPGAの自作モジュールにアクセスできました。

root@socfpga:~# ./sysid
System ID: 0xdeadbeef

参考情報

前回と同様のサイトのチュートリアルが参考になりました。

おわりに

自作モジュールにユーザーランドからアクセスできるようになりました。 HelioでFPGAをはじめる前よりかは、ハードウェアとソフトウェアのつながりがより理解できるようになってきました。 引き続き実験をしていこうと思います。