- 公開日:2025年09月24日
- | 更新日:2025年09月29日

ルネサス製品ForgeFPGAの評価ボードを使ってI2C温度センサーに接続してみた
- ライター:Wakasugi
- その他
背景
ForgeFPGAに興味はあるものの、どの様なことができるのか分からず、手が出しにくいと採用を躊躇されているお客様に対して、実際に温度センサーに接続することで、使い易さと手軽さをアピールしたいと考えています。
ForgeFPGAでは、各種センサーとのインタフェースで使用されるI2CやSPI等のシリアルインタフェースをライブラリ(Module Library)として準備しています。そのライブラリを使用することで簡単にセンサーとのインタフェースを実現できます。
今回はI2Cインタフェースを持つ温度センターとForgeFPGAの評価ボードを接続し、センサーから取り込んだデータを7SegmentLEDに表示させることがModule Libraryで簡単にできるか検証します。
製品概要および開発環境の準備
ForgeFPGAの製品概要及び開発環境設定方法に関しては、
https://emb.macnica.co.jp/articles/23639/
をご参照下さい。ここからは、ForgeFPGAの開発環境が正常にセットアップされていることを前提として解説を進めていきます。
開発ボード
使用する評価ボードは、ForgeFPGA“SLG47910V”を搭載したSLG7EVBFRGEです。USB Type-CポートでGo Configure Software Hub搭載のPCに接続して使用します。電源は、PCからUSB経由で給電されます。
SLG7EVBFORGE Renesas / Dialog | Mouser Japan
評価ボードの両サイドのGPIO端子でForgeFPGAの端子19本が全て使用可能になっています。
対象システムの検討
ForgeFPGAのModule Libraryの一つI2Cライブラリを活用するために、対象となるセンサーとしてアナログ・デバイセズ社の温度センサーADT7410を選択しました。また、温度を表示するために7Segment LEDは、4桁表示のOSL40363-IRYGを使用します。ForgeFPGAの評価ボードを使用して下記構成で、温度センサーから温度情報を受け取り、7 Segment LEDに表示を行います。
接続イメージは、下図の通りです。
ForgeFPGA内部を機能ブロック図で示すと以下のようになります。
ブレッドボードは、ユニバーサル基板を使用して、
としました。
ターゲット・デバイス(ADT7410)の仕様確認
温度センサーから情報を取得するために、ADT7410の動作仕様を確認します。
ADT7410の仕様書から下記情報が得られます。
動作電圧:2.7~5.5V
測定範囲:-55~150℃
SCL周波数:max400KHz
Slave Address:0x48(デフォルト値)
インタフェース:I2C 16bit
データ:13bit 2の補数表記、少数部4bit
この仕様を踏まえて、制御回路の仕様を検討します。
ForgeFPGA Module Libraryの確認
次に、ADT7410にアクセスするForgeFPGAのライブラリの確認を行います。
まずGo Configure Software Hubを立ち上げます。
ここで①、②、③の順にクリックしてください。ForgeFPGAのSLG47910V(RevBB)を選択します。
更に進めて④をクリックすると下記のような表示になります。
NAMEはプロジェクト名(任意)、Locationは作業ディレクトリ(任意)を指定し、⑤をクリックします。Project SettingというVDDを設定する画面が登場しますが、⑥N/Dの右横の矢印の上を押すと最大値に変化しますので、順番にN/Dをすべて最大値に設定ください。完了すると赤枠の⑦のようになります。ここで⑧のOKをクリックします。
すると下記のような開発画面GUIが現れますので赤枠の⑨”FPGA Editor”をクリックしてください。
FPGA Editorの画面が開いたら、Module Libraryを呼び出します。
左上の“Modules Library”をクリックします。
次に、I2Cを選択します。(I2Cの先頭の▶をクリックする)
I2Cをクリックすると下の画面が表示され、右側にI2C MasterとI2C Slaveが見えますが、表示のみで選択できませんので注意して下さい。
I2Cの先頭の▶をクリックすると下記画面になります。
I2C Masterをクリックすると、右側にI2C Masterの仕様が表示されます。
この右画面をスクロールして、端子情報を確認します。
端子情報から、ライブラリを動作させるために必要な信号などの情報が得られます。
このLibraryは、ソースクロックとSCL周波数が設定できるようになっています。初期値としてソースクロック50MHz、SCL100KHzとなっていますが、使用するOSC周波数は50MHzなのでそのまま使用します。SCL周波数は、ADT7410の仕様でmax400KHzとなっていましたので、こちらも100KHzをそのまま使用します。
ライブラリを取得するために、”NEXT”をクリックすると
この様な画面が立ち上がり、ダウンロードする際のライブラリ名(Module名)が設定できます。今回はそのまま使用します。
“Finish”をクリックするとEDIT画面に戻ります。
FPGA EDITORの画面でI2C Masterというモジュールが取得できたことが確認できます。テストベンチも取得できているので、このままシミュレーションを実行してみます。
上記開発画面の左上にある、ToolsからTools→Run Synthesisを実行します。左下の”Synthesize“をクリックしても実行できます。
General Logにsuccessfullyが表示されたら、Tools→simulation→simulate testbenchを選択し
下記の画面が現れますので、Simulateをクリックします。右上の“Simulate Tesetbench”ボタンも使用できます。
下記の画面が立ち上がります。こちらがシミュレーション結果表示画面となります。
ここで、下記の①~⑥の順にクリック頂けると、シミュレーション画面を走らせることが可能です。
特に③では必要な信号のみ選んで頂ければ問題ありません。その内容は④に表示され、⑤を押すと⑥の通りシミュレーション画面で動作を確認できます。
この結果からI2C_Master ModuleがI2Cに正常にアクセスできていることが分かります。
I2Cタイミング仕様の検討
I2C_Masterのシミュレーション結果とADT7410の動作仕様から、I2C部のタイミング仕様は下記のようにします。
I2Cは、アドレス(i_address)に“0x48”とリードコマンド(i_rd_nwr )にHighをセットした状態で、
①ENABLEをHighします。
②BUSY信号にHighを出力して通信が始まります。
③Slaveに対してアドレスとコマンドを出力します。
④リードモードであれば、そのまま受信が発生し、8bitデータを受信します。
⑤受信が終わるとBUSY信号がLowになります。
⑥ENABLEがHighであれば2度目の受信が始まり、それを受けて再度BUSY信号をHighになります。
⑦ENABLEをそのままHighにしておくと3度目の受信が始まってしまうので、2度目の受信期間中にENABLEをLowに戻します。BUSY信号が立ち上がれば受信は最後まで行いますので、2度目のBUSY信号の立ち上がりでENABLEをLowにします。
⑧受信中にENABLEがLowになると受信終了後にBUSY信号がLowになり、I2C通信が終了します。
データの取り込みは、BUSY信号の立下り⑤および⑧で実施します。
本システムでは、設計者が制御を必要とする信号はENABLEだけです。ENABLEをデータ入手のタイミングで立ち上げ、2度目のデータ取得中に立ち下げる”①と⑦“これだけで、I2C通信が完了します。
ここでは、一つ目のデータをHDATA[7:0]に二つ目のデータをLDATA[7:0]に取り込むものとします。
I2C制御回路の検討
I2C部のタイミング仕様から、受信データをHDATA[7:0]およびLDATA[7:0]に格納するまでのI2C制御回路のフローチャートは
となります。受信データを7Segment LEDに表示する部分は、別処理とします。この処理をRTLで記述します。
// I2C Temperature
wire BUSY,EN ;
reg EN_tmp, BUSY_tmp ; //Edge detection signal
wire [7:0] r_data_tx ; //Send data, unused this time
wire [7:0] w_data_rx ; //Received data
reg [1:0] rd_num ; //Read Count counter
wire w_stretch,w_ack_err ;
wire [6:0] addreg ; // Sensor Address
wire rd_nwr ; // I2C access mode
assign ACK_ERROR = w_ack_err ;
assign addreg = 7’h48 ; // Sensor Address
assign rd_nwr = 1’b1 ; // Read Only
assign r_data_tx = 8’b00000000 ; // dummy transfer data
// I2C access timing
always @(posedge clk or negedge Reset) begin
if (!Reset) div_counter <= 0;
else div_counter <= div_counter + 1;
end
assign EN = div_counter[DEPTH] ;
always @(posedge clk) begin
EN_tmp <= EN ;
BUSY_tmp <= BUSY ;
end
// BUSY signal down edge count
always @(posedge clk or negedge Reset) begin
if (!Reset) rd_num <= 0;
else if (!EN) rd_num <= 0;
else if (!BUSY_tmp && BUSY) rd_num <= rd_num + 1 ;
end
// I2C enable controll
always @(posedge clk or negedge Reset) begin
if (!Reset) ENABLE <= 1’b0;
else if (!EN_tmp && EN ) ENABLE <= 1’b1 ; //Detects rising edge of EN
else if (rd_num[1]) ENABLE <= 1’b0 ; //Detect the second falling edge of BUSY
end
//I2C access i2c_master Library
i2c_master #( .IN_CLK_HZ(IN_CLK_HZ), .SCL_SPEED_MODE_HZ(SCL_SPEED_MODE_HZ) ) dut (
.i_clk(clk), .i_rst(!Reset), .i_en(ENABLE), .o_busy(BUSY),
.i_scl(i_scl), .o_scl(o_scl), .o_scl_oe(scl_oe), .i_sda(i_sda), .o_sda(o_sda), .o_sda_oe(sda_oe),
.i_address(addreg),.i_rd_nwr(rd_nwr), .i_data_tx(r_data_tx), .o_data_rx (w_data_rx),
.o_stretch (w_stretch), .o_ack_err (w_ack_err)
);
// Output Data register
always @(posedge clk or negedge Reset) begin
if (!Reset) begin HDATA <= 0 ; LDATA <= 0 ; end
else if ( rd_num[0] && (BUSY_tmp && !BUSY) && rd_nwr ) HDATA <= w_data_rx;
else if (!rd_num[0] && (BUSY_tmp && !BUSY) && rd_nwr ) LDATA <= w_data_rx;
end
となります。これで温度センサーからの16bitデータが受信され、上位8bitがHDATA[7:0]に、下位8bitがLDATA[7:0]に取り込めました。
7 Segment LED 表示部の設計
I2Cから取り込んだHDATA[7:0]とLDATA[7:0]を使用して、温度を7Segment LEDに表示します。
処理フローは以下の通りです。
I2Cから取り込んだHDATA[7:0]とLDATA[7:0]は16bitデータとして扱います。ADT7410から出力される16bitデータは、13bitを有効桁として2の補数で出力されるので、BCD変換してから7Segment LEDに出力することで温度が表示されます。処理手順としては、
①DA←HDATA[7:0]、LDATA[7:0] 結合
②DB←DA符号補正と下位3bitの切り捨て
③DC←DB 小数部(4bit)と整数部(8bit)を分けてBCD変換
④DO←DC DA[15]を使って符号処理(4桁目にマイナスの表示)
⑤7 Seg Decode & 出力
となります。HDATA[7:0]とLDATA[7:0]から7 Segment LEDへの変換部のRTLは、一般的な処理であるため省略します。
実際に評価ボードを使ってADT7410にアクセスしてみよう!
さて、次はいよいよ、実際のAdvanced Hardware Kitとブレッドボードを用いて、ADT7410を動作させます。
まずは、RTLのポート宣言を行います。内蔵オシレータ有効設定、ポート方向の設定を決めるためのポートおよびOSCの分周回路部を追加します。また、I2C_Masterで使用しているParameterも追記が必要です。
ポート設定
RTLのポート設定部(ヘッド部)とセンサー制御信号の定義は以下の通りです。
(*top*)module I2C_Bridge #(
//Parameters
parameter DEPTH = 19,
parameter IN_CLK_HZ = 50_000_000,
parameter SCL_SPEED_MODE_HZ = 100_000
)(
(* iopad_external_pin *)input nReset,
(* iopad_external_pin *)input RSTB,
(* iopad_external_pin, clkbuf_inhibit *)input clk,
(* iopad_external_pin *) output [6:0] segment,
(* iopad_external_pin *) output [6:0] seg_oe,
(* iopad_external_pin *) output [3:0] dig,
(* iopad_external_pin *) output [3:0] dig_oe,
(* iopad_external_pin *)output DP,
(* iopad_external_pin *)output DP_oe,
(* iopad_external_pin *)input i_scl,
(* iopad_external_pin *)output o_scl,
(* iopad_external_pin *)output scl_oe,
(* iopad_external_pin *)input i_sda,
(* iopad_external_pin *)output o_sda,
(* iopad_external_pin *)output sda_oe,
(* iopad_external_pin *) output osc_en,
(* iopad_external_pin *)output ACK_ERROR,
(* iopad_external_pin *)output error_oe
);
reg [DEPTH:0] div_counter ;
reg [7:0] LDATA,HDATA ;
reg ENABLE ;
wire [3:0] comm ;
wire Reset ;
reg [3:0] seg_counter ;
assign dig = comm ;
wire ACK_ERROR,error_oe ;
wire [15:0] DA ;
wire [11:0] DB ;
wire [15:0] DC ;
wire [15:0] DO ;
// Reset Signal: nReser is POR : RSTB is out signal
assign Reset = nReset & RSTB ;
//Output enable need to be specified only for outputs
assign seg_oe = 7’b1111111;
assign dig_oe = 4’b1111;
assign DP_oe = 1’b1 ;
assign error_oe = 1’b1 ;
assign osc_en = 1’b1; //Internal Oscillator Activate
この後ろに、I2C制御回路部と7Segment表示部を連結するとRTLは完成します。
このRTLをFPGA Editorのmain.vタグのウインドウに記載し、synthesisを実行します。
Synthesis tool successfullyとなったら、次に下記の通り、program画面中央上部のIOプランナータブを選択し、各ポートの入出力を設定します。下記の通り、設定してください。
Misc/CLK/OSC_ctrl部
GPIO部
IOプランナーで端子が設定し終わったら、“Generate Bitstream”を実行します。
次に、IOプランナーの設定の通り評価ボードとブレットボードを配線します。(下記の図)
評価ボードとブレッドボードの接続
評価ボードのピン情報等は下記のURLからデータシートをご参考ください。
SLG7EVBFORGE – 1K LUT ForgeFPGA評価ボード | Renesas ルネサス
配線が完了しましたら、下記の通り中央上部の①デバッグ→②エミュレートの順にクリックします。
データ転送が終了すると、7Segment LEDが0℃を表示します。その後リセットボタンを押すと温度センサーからデータを受信し現在の室温が表示されます。
まとめ
I2Cセンサーの制御については、Raspberry Pi(ラズパイ)を活用した多くの記事や豊富なドライバが存在します。しかし、既存のシステムにセンサーをもう一つ追加したい場合、マイコンを新たに導入するよりも、ForgeFPGAのような小型FPGAを用いる方が、安価に機能拡張が実現できます。ただし、FPGAはマイコンとは扱い方が異なり、インターネット上でも具体的な利用方法を見つけるのが難しい状況です。そこで今回は、ForgeFPGAのライブラリを活用したコントロール回路の設計により、初心者でも手軽にI2Cセンサーとの通信が行える方法を紹介しました。 本記事によってForgeFPGAのユーザが増えることを期待しています。
お問い合わせはこちら
ルネサス製品をお探しの方は、メーカーページもぜひご覧ください。
【マクニカ ルネサスページはこちら】