2019年01月19日

MachXO3LFでHDMI出力

今回はLattice製FPGA MachXO3LF Starter Kitを使用して
HDMI出力をしてみました。

FGPAからHDMI出力をする方法として、
電流モード差動ドライバを模擬してHDMIの信号を出力する方法
HDMIのトランスミッタICを使用する方法があります。


最初、MachXOシリーズで電流モード差動ドライバを模擬して
試してみましたがうまくいきませんでした。
MachXO3とHDMIで差動信号がアンマッチだったことが原因だと思われます。
また、エンコーダにギヤボックス等のMachXOシリーズ固有の機能を
活用しないと実現できないため、汎用性に少し欠けます。

このようなことから、HDMIはDVI規格の1つなので、
入手性のよいDVIトランスミッタTFP410を使用して実装することにしました。

まずはTFP410にHDMI出力端子を取り付けた
TFP410 Beakoutボードを設計しました。


img1.jpg

実装やコードを参考にしてみました。

TFP410Beakoutボードの実装を終えて
MachXO3LFを使用してHDMI出力をしてみましたが、
なかなかテストパターンが表示されず…
テストパターンが出るまで1週間ほどデバッグに要してしまいました。

結論から言えば、MachXO3LFのIO設定で
Slewrateの設定がデフォルトはSlowとなっており、
Fastにすることで意図した信号が出せるようになりました。


0031-01-19 午前10.06.09 IMG_6996.JPG

RGBの3bitで出力してみました。

電流モード差動ドライバの模擬回路作成から、
TFP410を使用したテストパターン出力まで
空き時間で1か月強、要してしまいました。
色々デバッグしてテストパターンが出たときは感動しました。

HDMIで色々画像を出力するためにはMachXO3LF内蔵のRAMでは足りません。
次は外部RAMとしてSDRAM等のテストをしてみたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年01月12日

STM32Cube.AI 試食

19年の年始早々にSTM32Cube.AIがリリースされました。
STM32Cube.AIはPC等で学習させて
STM32マイコンで推論させることができます。

まさにAIのエッジコンピューティングを実現するツールです。

推論の動作テストをする手順について紹介します。

今回作成したコードとプロジェクトはこちらにアップしてあります。

まず、ターゲットはF3,F4,L4,L5,F7,H7が対応しています。
ただ、ROM、RAMを多く使うため、実際はF7、H7が現実的だと思います。

Caffe、Keras、Lasagneの学習済ファイルを使用して推論させますが、
今回は動画内で使用されているファイルを使用します。

【準備物】

・F3,F4,L4,L5,F7,H7ターゲットデバイス
・学習済みモデル 生ファイルはこちらから。
 https://github.com/Shahnawax/HAR-CNN-Keras
・STMCubeMX5.0以降
・SW4STM32やTrue Studioなどの開発環境


@Cube.AIのパッケージを追加する
 STMCubeMX5.0以降はHALライブラリ以外の関連ライブラリも
簡単にダウンロードできるようになっています。
CubeMXを開いて、
「Embedded Software Package Manager」の
「STMicroelectronics」タブから
Cube.AIにチェックを入れてパッケージをインストールします。

CubeAI.jpg

回線が細い場合は中途半端な状態でパッケージが入り、
学習済モデル読み込み時に「Invalid network」という
エラーが出る場合があります。
その場合は中途半端なパーケージを削除後、
ZIPを解凍して「Embedded Software Package Manager」の
「From Local」からインストールを選択してください。

削除はC:\Users\(USER_NAME)\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI
のフォルダを全削除します。


ASTM32マイコンの選定
学習済モデルの推論に必要なROMとRAMを確認し、
STM32マイコンの選定します。
「MCU Selector」の「Artificial Intelligence」に
Enableのチェックを入れて
Model「Keras」
Type「Saved Model」
Model「(準備物のgithubファイル)」
Compression「None」
でAnalyzeをクリックします。


cubeAI-2.jpg


フラッシュ2.82MByteとなり、
フラッシュメモリが足りず、
このままでは推論できません。

Compression「4」
でAnalyzeをクリックします。

cubeAI-3.jpg

フラッシュ775kByteとなり、
STM32マイコンで推論できる現実的な値となります。
今回は手持ちにあったSTM32F746-Discoを使用するため、
STM32F746NGHを選択しました。


Bターゲットボード設定
STM32F746NGH選択後、「Additional Softwares」をクリックして、
X-Cube-AI/Application内の設定を有効化します。
Coreライブラリにチェックを入れ有効化し、
Applicationは「Validation」を選択して「OK」ボタンで画面を閉じます。

今回はライブラリの検証のため、
「Validation」を選択しますが、
速度検証の場合は「System Performance」、
推論のユーザーコードを実装する場合は
「Application template」を選択します。

cubeAI-4.jpg

cubeAI-5.jpg

Cライブラリ設定
「Additional Software」に「X-CUBE.AI」が追加されます。
「X-CUBE.AI」をクリックして、
「Artificial Intelligence Core」
「Artificial Intelligence Application」にチェックを入れて有効化します。

最初、「Additional Software」に「X-CUBE.AI」が表示されず、
選択できない不具合があり、CubeMX自体とCube.AIパッケージを再度、
再インストールし直すと表示されるようになりました。

cubeAI-6.jpg

DCube.AI設定
「Additional Software」の「X-CUBE.AI」をクリックします。
networkタブを選択します。表示がない場合は+で追加します。
ライブラリに「Keras」、「Saved model」を選択し、
Model「(準備物のgithubファイル)」を選択します。
Compression「4」を選択して、
「Analyze」ボタンをクリックします。

cubeAI-7.jpg


Eファイルの検証
「Validate on desktop」をクリックして、
学習済ファイルの検証をします。
Validation StatusにSuccessが表示されたら検証完了です。

cubeAI-8.jpg

Fその他設定
「Computing」項目の「CRC」を有効化します。

cubeAI-9.jpg

STM32F746DiscoはUSART1でPA9、PB7でSTLinkで接続されています。
USART1を有効化します。

cubeAI-10.jpg

また、必要に応じてデバッグ用のSTLinkを有効化します。

cubeAI-11.jpg


CORTEX_M7をクリックし、IとDのCacheを有効化します。

cubeAI-12.jpg


Gクロック設定
デフォルトは16MHzのため、最大の216MHzを入力します。
他の欄をクリックするとクロックウィザード確認がでるため、
OKボタンを押して他のクロックも合わせて自動設定します。

cubeAI-13.jpg

H出力設定
推論した結果等の情報をUsart1に出力します。
再度、「Additional Software」の「X-CUBE.AI」をクリックし、
「Platform Setting」から先ほど選択したUsart1を選択します。


cubeAI-14.jpg

Iコード自動生成
 HEAPサイズを0x200から0x2000に設定して、
他の設定は使用する開発環境等に合わせて設定し、
「Generate Code」をクリックします。

cubeAI-15.jpg

J開発環境にプロジェクトを追加し、ビルドします。
SW4STM32ではCubeMXで生成したプロジェクト設定に
バグがあるようです。
そのままではパスが通らず、ビルドできませんでした。

C/C++General内のPath and Symbols、IncludeタブのGNU Cで
デフォルトではDebug/Middlewares/***となっているため、
Debug/を削除してApplyボタンを押して適用します。

cubeAI-16.jpg

同様にLibrary Pathタブでも
Debug/を削除してApplyボタンを押して適用します。

cubeAI-17.jpg

念のため、C/C++ Build内のSettingのMCU GCC Linkerの
Librariesで先ほどの設定が反映されているか確認します。

cubeAI-18.jpg

Kビルド&書き込み
STLink等でSTM32F7へ書き込みを行います。

Lデバイス上での検証

先ほど生成したプロジェクトフォルダ内の
*.iocファイルをダブルクリックして、CubeMXを開きます。
「Additional Software」の「X-CUBE.AI」をクリックし、
networkタブからValidate Targetをクリックします。

cubeAI-19.jpg


デバイスのCOMポート確認画面が表示されるため、
デバイスマネージャ等で対象のデバイスCOM番号を選択します。

cubeAI-20.jpg

CubeMXのWindowでOutputにチェックを入れて結果を表示させます。
cubeAI-21.jpg


CubeMXの画面下に出力画面に結果が表示されました。

cubeAI-22.jpg

ValidationはOKで、入力した値(今回はrandom数)に対して
推論した値とのerror値を確認できます。

入力する値はCustomDataを選択してcsvファイルとして入力して、
検証することもできます。

cubeAI-23.jpg


ということでCube.AIを使ってデバイス上で推論することができました。
Cube.AIはAIライブラリとしては
非常に使いやすいソフトウェアとなっていますが、
まだインストールに少し難があります。
インストールミスで選択画面が表示されないといったエラーがありました。
何度かパッケージの再インストールで動作できるところまでできました。
インストールミスは今後のアップデートで改善すると思います。

今後は実際にセンサから人の姿勢の推定といったAIを活用してみたいと思います。
今回作成したコードとプロジェクトはこちらにアップしてあります。


posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2019年01月05日

SDRAM 拡張ボード

明けましておめでとうございます。
今年もよろしくお願いします。

年末年始はKicadで高周波信号系の設計に挑戦してみました。

手始めにSDRAMの拡張ボード(ブレイクアウトボード)を作成してみました。
信号線の長さがビットで異なるのと、なぜか56pinあるため、
自分で作り直すことにしました。

秋月等でも取り扱いのあるSDRAMの多くはピン配置が同じため、
他のSDRAMでもTSSOP54であれば同様に使えると思います。


拡張ボードといってもブレッドボードでは高周波信号が歪んで使えませんが、
1本づつワイヤ配線するよりも便利だと思います。
電源系の共通化で54pinから42pinでなっています。

信号線の長さだけでなく、経路や太さなど考慮すべき点はありますが、
まずは全ての信号線を等長配線して設計してみました。
実際に使えるかPCBを作成して今後検討してみたいと思います。


SDRAM.jpg

SDRAM2.jpg

動作未確認ですが、
Gitにもデータを上げました。

posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする