Helioボード: ユーザーランドからFPGA側のオンチップメモリーを読み書きする実験
はじめに
Helioボードのリファレンスデザインには、FPGA側にオンチップメモリーがすでに実装されています。 今回は、ユーザーランドからこのオンチップメモリーに読み書きしてみます。 ただし、Cでコーディングはせず、コマンドから任意のアドレスに対して読み書きできるユーティリティを導入して試みます。
このユーティリティを応用すれば、例えば、FPGAでDMAコントローラを用いたデバイスを作成した場合に、まだデバイスドライバが用意していない状況でも、DMAコントローラのレジスタを直接操作して動作確認する、といったことが可能になります。
メモリー読み書きユーティリティ
こちらで紹介されている、コマンドから任意のアドレスに対して読み書きできるユーティリティーを導入します。
このユーティリティでやっていることは、以前System IDを読み取るためにCで書いたコードと本質的には同じで、/dev/memを使ってメモリーマップで読み書きしているだけです。
以前構築したクロスコンパイル環境を使ってビルドします。
$ wget http://download.atmark-techno.com/misc/accessing-any-address/devmem2.tar.gz $ tar zxvf devmem2.tar.gz $ cd devmem2 $ /opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf-gcc devmem2.c -o devmem2
ビルドが成功すると、gccに-oオプションで指定した、devmem2という実行ファイルが作成されます。 これをHelioボードのrootユーザーのホームディレクトリにコピーします。
オンチップメモリーの読み書き
オンチップメモリー(onchip_memory2_0)は、Qsysで確認すると、h2f_axi_masterピンと接続されています。h2f_axi_masterピンは、HPS-to-FPGA Bridgeと接続されています。つまり、図にすると以下のようになります。
h2f_axi_master HPS <===> HPS-to-FPGA Bridge <==============> オンチップメモリー (FPGA slaves)
Cyclone V Hard Processor System Technical Reference Manualの「Table 1-2: Common Address Space Regions」を確認すると「FPGA slaves」のベースアドレスは0xC0000000とあります。
オンチップメモリーのベースアドレスは、0x0000_0000なので、オンチップメモリーの先頭アドレスは、FPGA slavesのベースアドレス(0xC0000000) + 0x0 = 0xC0000000になります。
実際に書き込んでみます。第1引数にアドレス、第2引数にデータ長(w = word = 32bit)、第3引数に書き込むデータを指定します。
root@socfpga:~# ./devmem2 0xC0000000 w 0x12345678 /dev/mem opened. Memory mapped at address 0x76f1a000. Value at address 0xC0000000 (0x76f1a000): 0x34567800 Written 0x12345678; readback 0x12345678
書き込んだ値を確認します。書き込めていることを確認できました。
root@socfpga:~# ./devmem2 0xC0000000 w /dev/mem opened. Memory mapped at address 0x76f10000. Value at address 0xC0000000 (0x76f10000): 0x12345678
おまけ: System IDの読み取り
以前はCでプログラムを書いてSystem IDを読み取りました。このユーティリティは任意のアドレスを読み書きできるので、System IDを読み取ることもできます。
Lightweight FPGA slavesのベースアドレスは0xFF200000で、sysid_qsysのベースアドレスは、0x0001_0000です。従って、System IDの先頭アドレスは、0xFF200000 + 0x0001_0000 = 0xff210000になります。
実際にやってみると、System IDが読み取れました。
root@socfpga:~# ./devmem2 0xff210000 w /dev/mem opened. Memory mapped at address 0x76f15000. Value at address 0xFF210000 (0x76f15000): 0xACD51402
おわりに
ユーザーランドからリファレンスデザインで実装されているオンチップメモリーを読み書きできるようになりました。 今回導入したユーティリティは、コマンドから任意のアドレスを読み書きできるので、ちょっとした実験をするのに便利でした。 次回は、FPGAで記述した回路からオンチップメモリーに書き込む実験を紹介予定です。