10月, 2024 | ディー・クル―・テクノロジーズ | Page 2

bookmark_borderシステムLSIのブレイクスルー技術② 動的電圧周波数スケーリング(DVFS)(2)

こんにちは。今日はDVFS機能搭載プロセッサとDVFSの動作原理についてお伝えします。

DVFS機能搭載プロセッサのブロック図

まず、DVFS機能搭載プロセッサについてです。図1に弊社が電源ICで用いているDVFS機能搭載プロセッサのブロック図を事例として示します。

図1 DVFS機能搭載プロセッサのブロック図

CPU内にクロック周波数/電源テーブルが配置され、負荷の大きさに対応するクロック周波数及び電源電圧Vddの指示情報をテーブルから出力します。

指示情報に基づきPLL及び可変電源を制御し、DVFSを実行します。すなわち、負荷の大きさに適合したクロック周波数、電源電圧を用いてDVFSが最適な値を選択実行することになります。

半導体企業の可変電源(DVFS対応電源IC)の製品例

半導体企業の可変電源(DVFS対応電源IC)の製品例を以下に示します。

半導体企業製品例
  1. TI LM25066A
  2. リニアテクノロジーLTC3886
3. ダイアログ・セミコンダクタDA9063
4. ルネサスISL69269
  5. オンセミコンダクタNCP81022
  6. ADI  LTM4680 
7. ディークルーテクノロジーズ DCT013C(開発品)
半導体企業のDVFS対応製品(2024年9月 弊社調べ)

また、Appleは、iOSなどのソフトウェアとAシリーズチップなどのハードウェアを密接に統合し、DVFSを効果的に活用しています。

Apple Mobile Processor における動的電圧スケーリング技術(DVFS)(2024年9月 弊社調べ)

  • プロセッサの負荷監視: プロセッサ内部のセンサーやモニタリング機能が、プロセッサの負荷状況を定期的に監視する。これには、タスクの実行中の処理負荷や電力消費の推定が含まれる。
  • 電圧と周波数の調整: 負荷の高い場面では、プロセッサの動作周波数を上げ、同時に電圧も増加させることで性能を最大限に引き出す。一方、負荷が低いときには、動作周波数を下げ、電圧を低く保ちながらも十分な処理能力を維持する。
  • スケーリングアルゴリズム: モバイルプロセッサには、動的電圧スケーリングを行う専用のアルゴリズムが組み込まれている。これらのアルゴリズムは、プロセッサの状態を評価し、最適な電圧と周波数の組み合わせを決定する。
  • バッテリー管理: バッテリーの残量や充電状態なども考慮に入れながら、電圧と周波数を調整する。

DVFSの動作原理

図2にDVFSの原理を示します。

図2 DVFSの原理

まず上段の説明です。一般に低消費電力化を図るため、SoCではゲーテッドクロックが用いられます。Gated Clockは負荷が軽い場合、所要の処理が終了するとクロックを止めます。これで、タスク処理割当時間後半にはクロックを止めるので、1動作時間を半分=消費電力1/2を図れます。

次に下段の説明です。DVFSではタスク処理割当時間丁度で処理が終了する様に、1/2の電源電圧、1/2のクロック周波数でSoCを動作させます。 すなわちDVFSはゲーテッドクロックに比べて、さらに1/4の消費削減を図れます。

なお、CMOSの特性から、クロック周波数に比例して電源電圧を下げる事ができます。

プロセスバラツキを考慮したDVFS機能搭載SoC/MPU/GPU

次に図3にプロセスバラツキを考慮したDVFS機能搭載SoC/MPU/GPUのブロック図を示します。

図3 プロセスバラツキを考慮したDVFS機能搭載SoC/MPU/GPUのブロック図

リングオシレータ(Ring Osc)の発振周波数からMOSトランジスタの閾値(Vth)を推定します。例えばVthが低い方向に0.05Vばらついた場合、回路の動作周波数が上がります。同一周波数で動作させる場合、電源電圧(Vdd)を下げる事ができるので、消費電力を更に低減できます。一般にVthが低下するとトランジスタのリーク電流が増加しますが、Vdd低減による低消費電力化により相殺できます。こうした工夫によりプロセスバラツキを考慮した設計ができます。

なお、SoCの作りに応じて、リングオシレータは複数個所に挿入されることがあります。

参考までに各CMOS世代におけるVthのプロセスバラツキを示します。

図4 各CMOS世代におけるVthのプロセスバラツキ(2024年9月 弊社調べ)

いかがでしょうか。
次は、動的電圧スケーリング(DVS)開発の背景をお伝えしようと思います。

bookmark_borderUVをセンサで計測してみよう!⑤ ~外で実際に動作を確認してみよう ~準備編Ⅱ

ついにセンサー情報をBLEで飛ばし、無線化しますよ~

動作結果イメージ

今回は、こんな風にUVインデックスが出てくるようにしたいですね。

スマホアプリ画面

ハードウェア

使用するLeafonyのリーフが1枚、追加になります。

AC02 BLE Sugar

Al01 4-Sensors

AP01 AVR MCU

AZ01 USB

AV01 CR2032

AZ01 USBは、ソフトウェア書き込み時のみ使用し、動作時には外します。AV01 CR2032は前回同様、ねじ止めとして使用します。

leafの積み重ね方

重ね方は、こんな感じです。

ソフトウェア書き込み時ソフトウェア書き込み後
上から順に
29pin header, USB, AVR MCU, BLE Sugar, CR2032の順につなげてねじ止めします。
上から順に
29pin header, 4-Sensors, AVR MCU, BLE Sugar, CR2032の順につなげてねじ止めします。

書き込み時に4-Sensorsのリーフを抜いた理由としては付属のネジだと物理的に長さが足りなかったからです。なお、今回、センサーからのデータを取得するのに29pin headerのリーフを使用しました。

このAX018にした理由としては

  • 3.3V出力ピンがあること
  • ピンヘッダーがすでにあるので、リーフに追加で半田しないで使用できること

というメリットがあったからです。

もともとピンヘッダーが付属しているGrove&5Vのリーフを考えていて、高さも取らないし丁度いいかーと考えていたのですが、改めて仕様書みたとき”5V”出力じゃん”というのに気づきまして今回は3.3V出力ピンがあるAX018になりました…

さらにピンヘッダーがすでにあるので、リーフに追加で半田しないで使用できること。これは大きいです。同じく29pin のリーフだとAX02 29 pinもあるのですが、こちらはセンサからの線を直接半田することになるので、ほかのセンサーや実験に使用しづらくなるためAX018にしました。

ヘッダー分の高さを取らないのでいいのですが、ぶっちゃけきれいに半田を取る自信がなく。。。

リスクヘッジも実力よ..

ソフトウェア

前回、Leafonyを動かしてみようで使用したソフトウェアをベースに実装していきます。

まず、記事 # UVをセンサで計測してみよう ~センサを実際に動かしてみる~で実装したプログラムから蛍光ペンで示した箇所の処理をベースのプロジェクトに追加します。

Arduino側のプログラム動作手順概要:

(以下引用)  >

  1. 初期設定
    • PCとのHardwareSerial通信を開始
    • センサのイネーブルピンにHigh出力
    • 1secのタイマを開始
  2. タイムアウト時にセンサの出力ピンからアナログ値を取得
  3. 取得した値を電圧値に変換
  4. 電圧値からUVインデックス値に変換してシリアルで表示

追加した箇所は、こうなります。

変更箇所➡変更後
センサのイネーブルピンにHigh出力setupPort() 関数内に追加
・センサの出力ピンからアナログ値を取得
・取得した値を電圧値に変換
・電圧値からUVインデックス値に変換
loopSensor() 関数内に追加

これで定期的にUVインデックス値を求めることができるようになりました。(注) 基本的には上記の処理をベースのプロジェクトに追加すればよいのですが、以下の点は修正が必要です。

また、以下の設定変更も必要です。

  • アナログ値を電圧値に変換する際のリファレンス電圧を5Vから3.3Vにする
  • センサーとの接続ピンをベースのプログラムで使用していないピンに変更する
ピン変更箇所➡ピン変更後
センサ値の入力ピン      A0  A3
センサへのイネーブル出力ピン D7  D5

UVインデックスの定期無線送信設定

最後に定期的に取得したUVインデックスを無線で送信できるようにします。

ベースのソースコードを読むとbt_sensData() 関数内において無線で送信するデータを設定しているようです。そこで、そのうちもともと照度データを設定している箇所をUVインデックス値に差し替えします。

合わせて小数点以下の値も表示したいのでdstorfの引数の値も変更します。

これでソフトウェアの実装は完了です。

今までに作成したコードのコピペと少ない修正で無線化のプログラムができました!! 

動作結果

UVをセンサで計測してみよう ~センサを実際に動かしてみる~のときと同じようにUV LEDネイルライトで実験してみました。動作するかな。。。

スマホアプリ画面

照度の欄にUVインデックス値が表示されていますね!!

無事無線化できました!!

次は組み立てたLeafonyを手ごろなケースに入れたいと思います! ケースに入れればこれで準備編も終了です!実計測までもう少しです!!

bookmark_borderUVをセンサで計測してみよう!④ ~外で実際に動作を確認してみよう ~準備編Ⅰ~

こんにちは。あたふた仕事に追われていたら、10月になっていました💦
相変わらず外は30℃超える日もあってアチチ。。秋っぽい高い青空が待ち遠しい~

## センサ値を無線で飛ばそう

さて、前回は、PCでセンサ値を表示することができましたが、実際に外で実験する場合、PCを持ち歩かないといけないというのは大変なので無線化して、スマートフォンで確認できるようにしたい!と申しておりました。 (PC持ち歩いてしたら不審な行動に見られそうですし。。)

それを今回やります! ↓前回の記事はこちらから。

無線化するにあたっていろいろな方法がありますが、今回はArduinoと互換性がある”Leafony”を使用してBLEでセンサ値を飛ばしてスマートフォンに表示したいと思います。

Leafonyを選択した理由としては、前回でArduinoを使用してUVインデックスを求めた時のコードをそのまま使用できる点で便利!!という点と、基板サイズが一円玉サイズと小さいので外で実験したとき怪しまれづらいかなーという思いで。(^^)

Leafonyの一円玉との比較

## Leafonyを動かしてみよう

Leafonyが動作することをまず確認してみようと思います。

Leafonyの公式HPにあるクイックスタートの”BLEで環境センシング”を試してみます。

Basic Kit スタートガイド | Leafony

## ハードウェア

今回使用するリーフはこれら5つです。AV01はleafを重ねて”ねじ止め”するだけに使い、電源はAZ01 USBから供給します。

AC02 BLE Sugar

Al01 4-Sensors

AP01 AVR MCU

AZ01 USB

AV01 CR2032

上から順に ①4-Sensors, ②USB, ③AVR MCU, ④BLE Sugar, ⑤CR2032の順につなげてねじ止めします。

## ソフトウェア

Sample-Sketches/4-Sensors_BLE at master · Leafony/Sample-Sketches · GitHub

を使用。

但し、使用したライブラリがこのサンプルのバージョンとあっていないか、違うライブラリを使用したのか以下の点をサンプルから変更しました。

変更前➡ 変更後
#include <HTS221.h>#include <Arduino_HTS221.h>
#include <ST7032.h>#include <LCD_ST7032.h>
ST7032 lcd;LCD_ST7032 lcd;
lcd.begin(8, 2);   lcd.begin();
lcd.setContrast(30); lcd.setcontrast(30);
smeHumidity.begin();HTS.begin();
dataTemp = (float)smeHumidity.readTemperature(); dataTemp = (float)HTS.readTemperature();
dataHumid = (float)smeHumidity.readHumidity(); dataHumid = (float)HTS.readHumidity();

## 動作結果

Andoridスマホのブラウザからセンサ値がきちんと表示されました!

Leafonyが正常に動作することを確認できましたので、次はとうとう今回の本題、UVインデックスの値を無線で飛ばして確認できるようにしたいと思います!