FPGAボードのDE0-Nanoには、アナログデバイス社製の3軸加速度センサーADXL345が実装されています。
今回はNiosから加速度センサーADXL345のデータを読み取り、コンソールウインドウに表示させてみたいと思います。
![]() | 超入門!FPGAスタータ・キットDE0で始めるVerilog HDL: すぐ始められる!USB対応・書き込み器不要・大容量FPGA搭載! (トライアルシリーズ) 新品価格 |

DE0-Nanoボード上の、FPGAとADXL345のインターフェース
まず、ADXL345のインターフェースですが、ホストとの通信はSPI(3線式または4線式)およびI2Cになります。
一方、DE0-Nanoボードですが、FPGAと加速度センサーは下図のようになっています。(以下は、DE0-NanoのUser Manualからの抜粋です。)

同じくDE0-NanoのUser Manualには以下の記載があります。
SPI (3-wire) or I2C (2-wire) digital interface
ということで、ADXL345は、3と4線式のSPIおよびI2Cに対応していますが、DE0-Nanoでは、ハードウェアが4線式のSPIに対応していません。
そのため、DE0-Nanoで、ADXL345にアクセスするためには、3線式SPIかI2Cの2択になります。
ちなみに、私は4線式SPIは知っていましたが、3線式SPIは初めて知りました。まだ3線式SPIの仕様を理解していませんが、I2Cみたいに1本の信号線でデータの入出力を行うんですかね???
加速度センサーADXL345へのアクセスはIntel(Altera)のIPを使用
FPGAからADXL345へのアクセスは、3線式SPIかI2Cになりますが、そのためのロジックは組まず、Intel(Altera)のIPを使用したいと思います。
Niosも使用したいので、今回はNiosとADXL345用のIPの組み合わせになります。
Platform Designerを使ってハードウェア設計
では、QuartusのPlatform Designerを使って必要なハードウェアを追加していきます。
まずは、以下の基本機能を追加します。
- Nios II Processor
- On-Chip Memory (RAM or ROM) Intel FPGA IP
- JTAG UART Intel FPGA IP
QuartusのPlatform Designerの使い方は、以下の記事を参考にしてください。
次に、ADXL345にアクセスするためのIPを追加します。
追加するのは、下図の”Accelerometer SPI Mode”です。

追加が終わったら、下図のように結線します。(IPの名前は変更しています)

結線が終わったら、HDL(ここではVHDL)を生成します。
ここでは、以下のようにVHDLモジュールを作成しました。
library ieee; use ieee.std_logic_1164.all; entity nios_gsen is port( CLK50M : in std_logic; IRQ : in std_logic; SDAT : inout std_logic; CS : out std_logic; SCLK : out std_logic ); end nios_gsen; architecture rtl of nios_gsen is component gsensor_qsys is port ( accelerometer_spi_external_interface_I2C_SDAT : inout std_logic := 'X'; -- I2C_SDAT accelerometer_spi_external_interface_I2C_SCLK : out std_logic; -- I2C_SCLK accelerometer_spi_external_interface_G_SENSOR_CS_N : out std_logic; -- G_SENSOR_CS_N accelerometer_spi_external_interface_G_SENSOR_INT : in std_logic := 'X'; -- G_SENSOR_INT clk_clk : in std_logic := 'X' -- clk ); end component gsensor_qsys; begin u0 : component gsensor_qsys port map ( accelerometer_spi_external_interface_I2C_SDAT => SDAT, -- accelerometer_spi_external_interface.I2C_SDAT accelerometer_spi_external_interface_I2C_SCLK => SCLK, -- .I2C_SCLK accelerometer_spi_external_interface_G_SENSOR_CS_N => CS, -- .G_SENSOR_CS_N accelerometer_spi_external_interface_G_SENSOR_INT => IRQ, -- .G_SENSOR_INT clk_clk => CLK50M -- clk.clk ); end rtl;
HDLの生成など、詳細は”第2回 Nios IIで遊ぼう Quartus Platform Designer編“の記事を参照してください。
私は設計階層のトップは回路図にするのが好きなので、生成したVHDLをシンボル化し、階層トップを以下のようにしました。

ピンの割付けを行い、コンパイルでエラーが出ないことを確認します。
それが終わったら、FPGAに書き込みを行っておきます。
Nios II Software Build Tools for Eclipseを使ってソフトウェア設計
FPGAへの書き込みが終わったら、次にソフトウェア設計を行います。
FPGAへの書き込み先がRAMの場合には、DE0-Nanoの電源を落とさないままソフトウェア設計を行います。電源を落とすと書き込みデータが消えてしまうので。
ソフトウェア設計は、”Nios II Software Build Tools for Eclipse”を使います。
QuartusメニューのTools -> Nios II Software Build Tools for Eclipseを選択します。

Eclipseが立ち上がったら、以下の記事を参考に、プロジェクト生成や初期設定を行ってください。
準備ができたらソースコードです。
今回は以下のようにしました。
#include "sys/alt_stdio.h" #include "system.h" #include "altera_up_avalon_accelerometer_spi.h" #include <stdio.h> #include <unistd.h> int main() { alt_up_accelerometer_spi_dev * acc_dev; alt_32 xData = 0; alt_32 yData = 0; alt_32 zData = 0; alt_u8 data; int ret; alt_printf("Hello ADXL345 !!\n"); acc_dev = alt_up_accelerometer_spi_open_dev("/dev/accelerometer_spi"); if(acc_dev == NULL){ alt_printf("error\n"); } else{ alt_printf("ok\n"); } ret = alt_up_accelerometer_spi_read(acc_dev, 0x00, &data); if(ret == 0){ alt_printf("ID=%x\n", data); } else{ alt_printf("ID Error\n"); } while(1){ alt_up_accelerometer_spi_read_x_axis(acc_dev, &xData); alt_up_accelerometer_spi_read_y_axis(acc_dev, &yData); alt_up_accelerometer_spi_read_z_axis(acc_dev, &zData); alt_printf("%x %x %x\n", xData, yData,zData); usleep(100000); } return (0); }
以下は、ADXL345のデバイスIDを読み込んでいます。デバイスIDは、アドレス0x00に設定されており、その値は”1110 0101(0xE5)”です。
alt_up_accelerometer_spi_read(acc_dev, 0x00, &data);
以下は、x,y,z軸のデータを読み取り、コンソールウインドウに表示させ、ウェイトしています。
alt_up_accelerometer_spi_read_x_axis(acc_dev, &xData); alt_up_accelerometer_spi_read_y_axis(acc_dev, &yData); alt_up_accelerometer_spi_read_z_axis(acc_dev, &zData); alt_printf("%x %x %x\n", xData, yData,zData); usleep(100000);
実行
それでは、実行して、ADXL345からデータを読み取ってみたいと思います。
まずは、DE0-Nanoを机の上に置いた状態で実行します。
その場合の、コンソールウインドウに表示された結果です。

アドレス0x00に設定されたデバイスIDはちゃんと読み込めていそうです。
x,y,z軸のデータはどうなんでしょう???あっているのか?
試しにDE0-Nanoを右や左、上や下に振ってみました。
その結果がこちら。

机の上に置いていた時とはデータが変わりました。
なので、おそらくデータは読み込めているでしょう。
![]() | FPGAチャレンジャー入門編:ALTERA-Cyclone-IV版 キット CD (キットで学ぶ! シリーズ) 新品価格 |

![]() | VHDLによるハードウェア設計入門?言語入力によるロジック回路設計手法を身につけよう (Design wave basic) 新品価格 |

まとめ
とりあえず、何となく加速度センサーADXL345からデータを読み込むことができました。
しかし、まだADXL345がどういう機能を持ったICなのか理解できていません。
加速度を計測するものだと思うのですが、傾きとかも計測できるのかな???
しかも、読み込んだ数値の意味もわかりません。
それは今後の課題とします。