ZYNQの低消費電力モードを試してみた
ZYNQを使った高速ADCのシステムを特注で作っていて、消費電力を半分しなければならないという課題に直面しました。
ADCや周辺回路の消費電力を細かくチェックして、あとはZYNQ自体の消費電力をどこまで減らすことができるかという先の見えないチャレンジとなりました。
ZYNQ自体には各部のクロックを止めたりしてこまめに消費電力を削減する機能はあるようなのですが、究極的にはWFIという命令を実行してスタンバイモードに入れるのが最強のようです。たどり着いたのがXILINX Wikiのページです。
ユーザアプリからWFI命令をいきなり実行するのではなく、ZYNQ版Linuxには最初からパワーマネジメントの機能が入っているようです。
使い方はとても簡単で、
echo mem > /sys/power/state
とやるだけです。
ここでmemって何?と疑問に思うでしょう。この/sys/power/stateというのはデバイスドライバになっていて、可能な引数にはmem、standby、diskの3つがあるようです。standbyというのは単純に低消費電力モードに入るもので、diskはノートPCのハイバネーションモードのようなものだそうですが、ZYNQではサポートしていません。
3つの引数のうちZYNQでサポートしているのはmemだけで、DDR3メモリが停止してPSがスタンバイモードに入ります。DDR3は停止するのでプログラムをOCMに退避してからスタンバイモードに入るそうです。
下の図はmem、standby、diskの3つの低消費電力モードを試してみた結果です。
スタンバイモードからの復帰にはUARTによる方法と、GPIOによる方法、デバッガによる方法の3つがあります。
何もせずに使えるのはUARTによる方法だと思います。やり方は、
echo enabled > /sys/devices/soc0/amba/e0000000.serial/tty/ttyPS0/power/wakeup
をあらかじめ実行しておくこと。これだけです。
その後、
echo mem > /sys/power/state
で、ZYNQはスタンバイモードに入り、何かキーを押すと復旧します。
どのくらい消費電力が減ったかといえば、大本の5V電源で890mAあった消費電流が560mAに減りました。約1.6Wの電力削減です。PSが完全に停止するのと、DDR3メモリを止めるのでこれくらいの削減ができるのでしょう。
DDR3メモリの内容を安全に退避しているはずなのですが、スタンバイに入るのも復帰するのも一瞬で、復帰したら何事もなかったのように計測が続きました。
スタンバイに入るときと出た後でFPGAがどう動いているのかをMITOUJTAGを使ってみてみました。
驚くべきことに、スタンバイ中でもJTAGバウンダリスキャンは動きました。
で、復帰するとすぐに元の動作に戻るはずなのですが、どうやらディゼーブルにしていたADCのチャネルも復旧しています。
スタンバイ中にPLがどうなっているのかは、もう少し解析したほうがよいかもしれません。
☀
なお、Linuxのカーネルを構築する際に
- CONFIG_CPU_IDLE
- CONFIG_CPU_IDLE_GOV_LADDER
- CONFIG_CPU_IDLE_GOV_MENU
というオプションを有効にしておけばcpuidleドライバが働いてIDLE時にWFI命令を実行して低消費電力モードに入るという情報もありましたが、全く効果は実感できませんでした。
| 固定リンク





コメント