電子回路わからん日記

にゃーんと言いながら電子回路いじってます

Analog Dicovery 3でI2Sをデコードしてみる

どもです。AUDIY( )です。

今回はAnalog Discovery 3(AD3)でCombo384から出力されるI2Sをデコードし、実際に取得できるサンプルの限界を探ってみたいと思います。

audio-diy.hatenablog.com


Combo384について

Amanero Technnologiesが販売するUSBオーディオをI2SやDSDに変換するモジュールです。

amanero.com

この手のソリューションで有名なものだと他にXMOSがありますが、個人使用だとデバイスドライバが評価版だったり、モジュール形式で販売されていないこと等から個人製作だとCombo384が多用されている印象があります。

www.xmos.com

Combo384は公式ドライバをインストールするだけでサンプリング周波数384kHzまでのPCMを再生することが可能です。

今回はPCMを再生してみて各サンプリング周波数(48/96/192/384kHz)でデコードした波形を取得してみたいと思います。

ちなみにXMOSについてはInnocent Key様が過去にいろいろと検討された記事を出しています。

innocent-key.com


再生する音源

今回は以下の音源を再生したいと思います。

  • サンプリング周波数:48/96/192/384kHz
  • 量子化ビット数:32bit
  • 収録波形:1kHz正弦波
  • 再生時間:60秒
  • 振幅:0dBフルスケール

Pythonを使って自身で作成した音源になります。


AD3の設定について

今回波形を取得するうえで変更しなければならない設定が複数ありましたので共有しておきたいと思います。

デフォルトのメモリ長について

2023年10月22日現在のAD3用操作ソフトウェア(Waveforms)では、立ち上げ時点でAD3のハードウェアのスペックをフルに使えるような設定がなされていません。

Device Managerでロジックアナライザのメモリの割当が最大となるように変更してあげます。

デフォルトではNo. 1が選択されていて、ロジアナ機能の1チャンネルあたり最大サンプル数が16384サンプルになっています。

No. 4(ブルーハイライト)またはNo. 5に変更することで、1チャンネルあたり最大サンプル数が32768サンプルまで拡大できます。

サンプリング周波数について

デフォルトではAnalog Discovery 2(AD2)と同じ100MHz(100MSPs/S)になっています。

Options→「Clocking」タブから、最大値の125MHzに設定してあげます。

ここまでの設定で125MSPs/S、メモリ長最大32768サンプル/chのロジアナとして使用可能になります。

I2Sデコード設定

まず、Sampleの項をFallingからRisingに変更します。
これはビットクロックのデータ取り込みエッジを指定するものです。

I2Sは規格上Fallingエッジに合わせてデータを送るため、デフォルトのままではデータの取りこぼし(メタステーブル)が発生します。

次にFormatの項ですが、多くの場合で"Two's complement"(2の補数)にしないと意図した数値が表示されないと思います。

最初"Signed"にしてて正負反転した波形が出てきてしまいました。

Showの項はデータを確認したいチャンネルを選択すればOKです。


Combo384と接続する

接続はこんな感じです(暗くてすみません・・・)

  • 赤(DIO 0):LRCK
  • 緑(DIO 1):BCK
  • 紫(DIO 2):DATA
  • 黒(GND):GND

今回はロジアナのデフォルトで接続しましたが、ここはユーザーの設定で変わりますのでご注意ください。

AD3購入時に合わせてICクリップを購入しておいて正解でした。

通販コード:P-03436

akizukidenshi.com


いざデータ取得

48kHz

4周期ぶんほどとなりました。このときのサンプルレートは7.8125MHzです。

ビットクロックの速度が48000 Hz * 64 = 3.072MHzなので、6.2MHzまでサンプルレートを小さくしてみます。

細かくサンプルレートを微調整すれば5周期ほどまでできそうです。

ここまで見ることができれば十分かなと思います。

96kHz

細かく調整して13.889MHzのサンプルレートで取得できました。

192kHz

31.25MHzのサンプルレートで取得できました。このあたりから細かいサンプルレートの調整ができなくなってきます。

384kHz

同様に細かなサンプルレートの調整はできず、62.5MHzでやっと取得できました。

最大サンプルレートから考えると768kHzのPCMまでは確認できそうですね

384kHzを再生した状態で波形を拡大します。LチャンネルとRチャンネルで数値は一致していますし、AUDIYが確認した限りではデータの取りこぼしもなさそうです。

侮れませんねAD3。ひょっとしたらDigital Discovery程度のサンプルレート(800MSPs/S)が必要かもと思っていましたが、とうぶんは杞憂に済みそうです。

近年のオーディオDACが受けれるサンプリング周波数の多くは768kHzとか1.536MHz程度までなので。

digilent.com


まとめ

とりあえず、AD3のロジアナ機能でCombo384から出力されるI2S波形をデコードしてみました。

  1. サンプリング周波数384kHzまでは細かな調整で取得可能
  2. 限界はサンプリング周波数768kHzと推察される
  3. AD2(最大サンプルレート100MHz)はサンプリング周波数384kHzが限界な可能性がある
  4. AD3のハードウェアスペックをフルで活かすには細かな設定変更が必要
  5. I2Sデコード時は細かい設定に注意
  6. AUDIYの用途ではDigital Discoveryがすぐに必要になることはなさそう

これはケチらずAD3買って正解でしたわ・・・・

どんどん電子工作を加速させていきたいと思います。

 

 

バックライト付きI2Cキャラクターディスプレイの文字列表示の修正

どもです。

寒くなって暑くなってまた寒い・・・

今回は下記ブログ記事の続きです。

audio-diy.hatenablog.com

いちいちアドレスを指定せずとも文字列を表示できるようになりましたので、その内容を記しておきたいと思います。


アドバイスは突然に

やってきました。

先日のページで参考とさせていただいた下記ブログ記事の作者の方が読んでくださったようで、

lawn-tech.jp

確かに、AUDIYが書いたディスプレイの初期化関数ではEntry Mode SetをDecrement方向にしていました。

正直、このEntry Mode Setの項ですが、I/DビットとSビットの組み合わせの動作がいまいち理解できていませんでした。

もういちど制御IC(RW1063-0A)のデータシートを読んでみます。

RW1063-0Aデータシート18ページより抜粋

このI/Dのビットが1のとき、自動でDDRAMのアドレスを増やしていくのでいちいちDDRAMのアドレスを指定することなく文字列表示ができるそうです。

この「Shift of entire display」は何を意味してるんですかね・・・?
ちなみにディスプレイのシフトに関する命令はもう一箇所にもあるのでこの違いがわかっていません(試してみるしかないか)。


いざ修正

修正箇所は2箇所です。

まずはEntry Mode Setの命令項目を増やしました。

/* 5. Entry Mode Set
*  Data (bin): 0b000001[I/D][S]
*  Data (hex): 0x0[4|5|6|7]
*
*  I/D: Increment/Decrement Bit
*  0b0: cursor/blink moves to left and DDRAM address is decreased by 1.
*  0b1: cursor/blink moves to right and DDRAM address is increased by 1.
*
*  S: Shift of Entire Display
*  0b0: Shift of entire display is not performed.
*  0b1: Shift of entire display is performed according to I/D value (I/D = "1": shift left, I/D = "0": shift right).
*/
#define ENTRY_CURSOR_LEFT  0x04 // Cursor/blink moves to left and DDRAM address is decreased by 1 : 0b00000100
#define ENTRY_DISP_RIGHT   0x05 // Right shift of entire display                                  : 0b00000101
#define ENTRY_CURSOR_RIGHT 0x06 // Cursor/blink moves to right and DDRAM address is increased by 1: 0b00000110
#define ENTRY_DISP_LEFT    0x07 // Left shift of entire display                                   : 0b00000111

 

もう一箇所、ACMPrintStr( )関数のループ内でのアドレス指定を削除しました。
その代わりにループ直前でENTRY_CURSOR_SHIFT命令を追加して確実に文字列を表示できるようにしています
多分表示は少し高速化できると思います。

/* Print 1-Line String (under 40 characters) to the ACM0802C-NLW-BLW-I2C. */
void ACMPrintStr(I2C_HandleTypeDef *hi2c, uint16_t AD, uint8_t LN, const char *str) {
    uint8_t LNx = DDRAM_LN1;
    uint8_t str_len = 0;
    uint8_t i = 0;
    const char *startstr = str;

    if (LN == 1) {
        LNx = DDRAM_LN1; // DDRAM Address: 0x80
    } else {
        LNx = DDRAM_LN2; // DDRAM Address: 0xC0
    }

    str_len = strlen(str); // Count String Length.

    if (str_len > 40) {
        str_len = 40; // String Length must be under 40 per Line.
    }

    ACMWriteInstruction(hi2c, AD, ENTRY_CURSOR_RIGHT); // Cursor/blink moves to right and DDRAM address is increased by 1.
    ACMWriteInstruction(hi2c, AD, LNx); // Specify the DDRAM Address.

    /* Print Characters in the string */
    for (i = 0; i < str_len; i++) {
        ACMPrintChar(hi2c, AD, str); // Write the character the DDRAM.
        str++;
    }

    str = startstr; // Return *str pointer to start address.
}

差分についてはGitHubを見ていただければと思います。

github.com


動作確認

ばっちりです!

またいろいろ作っていきたいです。

Analog Discovery 3を導入しました

どもです。

 

・・・・・急に寒いやん。w

 

ついに導入しました。

Analog Discovery 3 (AD3)です!!!!!!!!


導入の背景

前回投稿したブログ記事でも少しお話していましたが、

audio-diy.hatenablog.com


FPGA内部ロジックアナライザ機能を使用してPCMデータを観測しようとすると、すぐにFPGA本体のブロックRAMを食い尽くしてしまいます。

実際に上記のブログにあるPCMの波形は、余っていたブロックRAMを使い尽くした上で取得できた波形です。

ということで、これ以上大規模なFPGAの開発・実装に対しその動作を確認するうえで、個人で使用できる現実的な価格のロジックアナライザ(ロジアナ)の導入の必要性が現実味を帯びてきました。


必要な機能・条件

実際にロジアナを導入するとして、AUDIYに必要な機能や条件は以下のとおりです。

  1. 個人で購入できる現実的な価格であること(基準が曖昧ではあるが・・・)
  2. 最低でもI2Sをデコードできること(左詰めや右詰めもできるとなお良い)
  3. 使用方法に関する情報がインターネット検索で入手しやすいこと
  4. 解析に際し現実的なメモリ長を持つこと(正直見当がつかない)

AUDIYが所有しているオシロスコープ(SIGLENT SDS1104X-E)もオプションでロジアナ機能を追加できるので当初はその購入も考えてはいたものの、I2Sデコード機能がなく今回の条件から外れます。

adwinshop.com

adwinshop.com

ひとつ上のSDS2000Xシリーズにはソフトウェアオプションで解析機能を追加できるようです。

adwinshop.com

ということで、別途ロジアナを探すことにしました。


候補

そもそも電子工作界隈でロジアナをわざわざ購入する人が少ない気がしますが、おそらく以下の機種あたりが有名かと思います。

  1. Digilent Analog Discovery 2 (AD2)

    digilent.com

  2. Digilent Analog Discovery 3 (AD3)

    digilent.com

  3. Digilent Digital Discovery

    digilent.com

  4. Analog Devices ADALM2000 (M2K)

    www.analog.com

ロジアナ機能だけならDigital Discoveryで良かったのですが、以下の理由からAD3を購入することにしました。

  • DVM(Digital Volt Meter:テスタより更新が高速な電圧計)、ネットワークアナライザ、インピーダンスアナライザ等の解析機能が充実している
  • オシロスコープ量子化ビット数がM2Kより大きい(14bit)
  • M2K、AD2より高速(125MS/s)
  • AD2からメモリ長が倍になっている(16kpts→32kpts)
  • (性能に目を瞑れば)この手の複合機は便利
  • 個人的にDigilent製品のカラー(グリーン、常盤色)が好き

特に複合機であることの便利さについては、職場でTektronixのMSOMixed Signal Oscilloscope:ロジアナとオシロスコープとスペアナが一緒に、かつ同時に使えるタイプのオシロスコープ)を使った経験からも重要視しており、今後趣味で電子工作を進めていくうえでは(性能こそ大差はあれど)1台持っておくと良いという判断に至りました。
(ちなみに本家MSO個人事業主とかでも無い限り個人で買うにはあまりにも高価です。)

www.tek.com


いざ購入

今回は秋月電子通商で購入しました。
その他複数のECサイトを調べましたが、おそらく日本国内で買うなら2023年10月現在で秋月電子での購入が最安かと思います。

通販コード:M-18129

akizukidenshi.com

とあるYoutube動画では「一周り以上大きい」と紹介されていますが、AD2を使ったこともあるAUDIYにとっては二周りは大型化している印象です。


最近の円安・インフレについて・・・

近年は円安やインフレによって、本来教育用途として販売されているようなAD3、M2Kもお値段が上がってしまっています。

AUDIYは社会人になってからこの世界に入りましたが、学生からこの世界に入った人にとってはなかなかツラい状況に感じます。(正直今回のAD3購入はAUDIYにとってもなかなか財布に痛い出費でした)

この手の製品は部品や本体がドル建てでの販売になることがほとんどでしょうから日本においては非常に仕方のない状況だと思いますが、こういった教育向け計測器を作るメーカーの存在は大変貴重なので、ぜひメーカーさんには頑張って生産・販売を続けていただきつつ、もし自分に子供が生まれてこういったものに興味が出てきたら痛い出費でも買ってあげたいと思う今日この頃です。

・・・・まぁそんな予定は無いんですが。w


以上、AD3購入報告でした。

次回は実際にAD3のロジアナ機能を使ってI2Sをデコードしてみたいと思います。

Efinix TRION T20開発キットとAmanero Combo384を組み合わせる(2)

どもです。

過去のこのブログですが、

audio-diy.hatenablog.com

 

すでに基板が出来上がっているのと、FPGAも動き始めたのでそろそろ積極的に記事を上げていければと思います。


接続基板のその後

その後曲線配線をしたり

届いた基板を確認したら穴径を間違えていたり

しましたが、修正後の基板が動き始めています。

この回路と基板設計データはGithub上に公開しています。

github.com

ライセンスもCC-BY-4.0なので、そこさえ守っていただければご自由にお使いいただければと思います。


FPGAとCombo384を繋げて何をするのか

早い話、デジタルフィルタを使用した信号処理です。

デジタルフィルタについては下記Webサイトがそこそこ詳しく、かつ難しい話はいい塩梅で割愛されてて概要をつかみやすいと思います

tech-blog.cerevo.com

デジタルオーディオにおけるサンプリング周波数変換(アップサンプリング、ダウンサンプリング)、DSD→PCM変換、アンチエイリアス等、「信号処理」と呼ばれるもののほとんどはデジタルフィルタで実現されています。

 

それをFPGAに実装してしまおう、そういうお話です。


まずはFIRフィルタ

X (旧Twitter)ではオーバーサンプリングFIRフィルタの実装の模様を過去に投稿しています。

数年前にビヘイビアモデル(シミュレーションでのみ実行可能なモデル)をVerilogで書いたことはありましたが、FPGAに配置配線可能なRTLは初めて実装しました。

今後は何かしらの形でこのFIRフィルタを実現するRTLも解説できればと考えています(せっかくなので同人誌チャレンジしたい)。


ということで進捗報告でした。

 

ちなみにですが、44.1kHz→88.2kHzは動き始めています。

 

Efinix Trionで実装したばかりなので、他のFPGA(例:Intel MAX10、Tang Primer 20K等)にも随時実装・検証していきたいと思います。

 

FPGAのロジアナ機能でPCMを読むとすぐにメモリが埋まってしまうので、ロジアナが欲しくなってきました・・・・

digilent.com

 

バックライト付きI2CキャラクターディスプレイをSTM32で操る

ご無沙汰してます。

 

今回ですが、STM32とバックライト付きI2C制御キャラクターディスプレイ「ACM0802C-NLW-BBW-IIC」を組み合わせて様々な文字列をディスプレイに表示させてみたので、その過程を書いていきたいと思います。

やってて色々とハマりました。


ACM0802C-NLW-BBW-IICについて

秋月電子通商で販売されている、バックライト付きの8文字x2列キャラクターディスプレイ(I2C制御タイプ)です。

 

通販コード:P-13519

akizukidenshi.com

 

だいたいこの手のディスプレイって本来のインターフェースは8bitパラレルだったり4bitパラレルだったりするのですが、接続線が多いと煩わしいので、ディスプレイの更新速度ではやや不利になるものの今回はI2C制御タイプにしました。


最初から怪しい匂いが・・・

このディスプレイですが、データシート上にI2C通信に関する詳細な記述がありません。

秋月の商品ページには「データシートの8ページに記載がある」旨問い合わせに回答されていますが、本当に手順しか記載がなく命令レジスタ等の記載は皆無です。

上記データシートを見ていると、4ページ目に「Contoroller IC: RW1063-0A or compatible」と記載があります。

つまり「RW1063-0A」なるディスプレイ制御ICのデータシートを入手する必要がありそうです。


RW1063-0Aデータシート入手

「これはどうしたものかなー」と思いつつRW1063-0AというICのデータシートを探していたら、同じく秋月電子通商販売の「ACM2004D-FLW-FBW-IIC」というI2C制御キャラクターディスプレイのページにRW1063-0Aのデータシートと思しきものが添付されていました。

 

通販コード:P-17381

akizukidenshi.com

 

これをもとに他のWebサイトでの実装例なんかも見つつ実際に文字列を表示させていきたいと思います。

 

追伸、「ACM2004D-FLW-FBW-IIC」のページにはArduinoのサンプルスケッチを入手することもできます。一度に表示できる文字数もACM2004D-FLW-FBW-IICのほうが多いですからこれからディスプレイを使いたい人はこちらから始めるほうが難易度は低いかもしれません。


バイスアドレスについて

ACM0802C-NLW-BBW-IICですが、コネクタの4番、5番ピンをプルアップまたはプルダウンすることでアドレスを4通りに設定できます。(ACM0802C-NLW-BBW-IICデータシート6ページに記載)

RW1063-0Aのデータシート28ページより抜粋

上図のSA0、SA1がそのアドレスに相当します。つまりデバイスアドレスは16進数(2進数)で

  • 0x78 (0b01111000):SA1 = 0, SA0 = 0
  • 0x7A (0b01111010):SA1 = 0, SA0 = 1
  • 0x7C (0b01111100):SA1 = 1, SA0 = 0
  • 0x7E (0b01111110):SA1 = 1, SA0 = 1

の4通りです。


レジスタアドレス

バイスアドレスの後に送るレジスタアドレスは2通りです(RW1063-0Aデータシート28ページに詳細記載)。

  • 0x00 (0b00000000):ディスプレイに何かしらの設定を送るとき
  • 0x40 (0b01000000):ディスプレイの特定箇所の文字を設定するとき

RW1063-0Aデータシート中の"Control byte"中にあるA0ビットの違いで設定します。


設定データ

設定データについてはRW1063-0Aデータシート17ページに記載があります。

ここに記載された値をレジスタアドレス0x00の後に送ることでディスプレイのオンオフや表示の消去などができます。

RW1063-0Aのデータシート17ページより抜粋

I2Cで制御する場合はRSやRWビットは無視します。(つまり、「Read Busy Flag and Address」の命令はI2C制御時はできません。)

 

AUDIYはこの命令のうち「Set DDRAM Address」にハマりました。後ほど説明します。


文字データ

一般的な半角文字はRW1063-0A内部のROMに格納されていて、少なくともカタカナ以外はレジスタアドレス0x40のあとに対応するASCIIコードを送るだけでその文字が表示されます。

e-words.jp

 

例えば、小文字のaを表示させたい場合は0x40のあとに0x61(10進数97)を送ればよいです。

プログラミングでうまいことやれば文字列をそのまま表示できそうです。


初期化

起動後のデバイスの初期化ですが、RW1063-0Aデータシートの32ページに手順が記載されています。

RW1063-0Aのデータシート32ページより抜粋

待ち時間まで指定されていますね・・・


文字列の表示について

実際にSTM32マイコンでI2C制御ディスプレイを動かすブログ記事があったので参考にしましたが、制御ICが違うためか見事にハマりました。

lawn-tech.jp

 

  1. バイスアドレスを送る
  2. レジスタアドレス(0x40)を送る
  3. 表示したい文字を送る

を繰り返せば文字列が表示できるようなコードに見えますが、実際にやってみても冒頭の1文字しか表示されません。

改めてRW1063-0Aのデータシートを読んでいくと、文字列表示にとても重要なことが12~14ページに記載されていました。

詳しくはデータシートを読んでいただくとして、ざっくり言うと「文字を表示したい場所をDDRAM Addressで指定しなさい」ということです。

今回使用するACM0802C-NLW-BBW-IICは8文字、2列のディスプレイなので、初期化終了時点で1列目のアドレスは0x00 ~ 0x07、2列目のアドレスは0x40 ~ 0x47とのことです。

このアドレスの変更をRW1063-0Aデータシート17ページに記載の「Set DDRAM Address」で行うということです。

 

つまり順序を書くと

  1. レジスタアドレス0x00にSet DDRAM Address命令(0b1xxxxxxx)命令を送って表示位置を指定
  2. レジスタアドレス0x40に表示したい文字を送る

の2つを繰り返すことで文字列表示が実現できます。

 

実現した動画は以下のとおりです。


ライブラリ関数の実装

いくつかのI2Cの送信について関数を作ったので解説します。

といっても設定や文字列表示に関する関数は3つです。

設定書き込み関数ACMWriteInstruction()

レジスタアドレス0x00に対し代入されたデータを送信します。

/* Write Instruction */
uint8_t ACMWriteInstruction(I2C_HandleTypeDef *hi2c, uint16_t AD, uint8_t data) {
    uint8_t buf[2] = {INST_C0_0, data}; // 0x00, data
    uint8_t status = HAL_I2C_Master_Transmit(hi2c, AD, buf, 2, 1000);

    return status == HAL_OK;
}

 

文字書き込み関数ACMPrintChar()

現在指定されているDDRAMアドレスに対し文字*strを書き込みます

やっていることはACMWriteInstruction()関数とほぼ変わりません。

/* Print Single Character to the ACM0802C-NLW-BLW-I2C. */
uint8_t ACMPrintChar(I2C_HandleTypeDef *hi2c, uint16_t AD, const char *cdata) {
    uint8_t buf[2] = {WRITE_C0_0, *cdata}; // 0x40, *cdata
    uint8_t status = HAL_I2C_Master_Transmit(hi2c, AD, buf, 2, 1000);
    HAL_Delay(10);

    return status == HAL_OK;
}

※DDRAM Addressの更新は行いませんので注意してください。

 

文字列書き込み関数ACMPrintStr()

ディスプレイに対し入力引数LNで指定した行に文字列*strを入力します。
関数内部で行指定、文字数計算およびその文字数だけACMPrintChar()関数の繰り返しを行います。

/* Print 1-Line String (under 40 characters) to the ACM0802C-NLW-BLW-I2C. */
void ACMPrintStr(I2C_HandleTypeDef *hi2c, uint16_t AD, uint8_t LN, const char *str) {
    uint8_t LNx = DDRAM_LN1;
    uint8_t str_len = 0;
    uint8_t i = 0;
    const char *startstr = str;

    if (LN == 1) {
        LNx = DDRAM_LN1; // DDRAM Address: 0x80
    } else {
        LNx = DDRAM_LN2; // DDRAM Address: 0xC0
    }

    str_len = strlen(str); // Count String Length.

    if (str_len > 40) {
        str_len = 40; // String Length must be under 40 per Line.
    }

    /* Print Characters in the string */
    for (i = 0; i < str_len; i++) {
        ACMWriteInstruction(hi2c, AD, (LNx | i)); // Specify the DDRAM Address
        ACMPrintChar(hi2c, AD, str); // Write the character the DDRAM.
        str++;
    }

    str = startstr; // Return *str pointer to start address.
}

 

その他にもディスプレイの初期化関数や、ディスプレイに設定されたI2Cデバイスアドレスを検索する関数を実装しています。

github.com


動かしてみる

上記リンク先の関数を組み合わせて文字列を流すプログラムを実装してみました。

流れとしては

  1. CheckACMDeviceAddress()関数でI2Cデバイスアドレスの取得
  2. InitACM()関数でRW1063-0Aの初期化
  3. ACMPrintStr();で文字列を書き込み
  4. ディスプレイの表示を開始
  5. 1秒ごとに文字列を左にシフト
  6. 文字列全てをシフトし終えたら最初の状態で表示し直す
  7. 5と6を繰り返す

という手順です。


まとめ

ということで秋月電子通商で販売されているACM0802C-NLW-BBW-IICを使って文字列を表示させてみました。

まとめとしては

  1. データシートの情報が不足している
  2. DDRAMのアドレスの更新が文字列表示のカギ
  3. ACM2004D-FLW-FBW-IICから始めるほうがオススメ

です。

今回作成したドライバ(HAL使用)はGitHubにアップロードしています。

MITライセンス(2条項BSDライセンス)で公開していますのでご自由にお使いいただければと思います。

github.com

 

また何か進捗があればブログを更新したいと思います。

 

 

 

電気設計として新卒入社3年経ったので感想でも

ご無沙汰しております。

前回記事のAmanero Combo384接続基板ですが、

audio-diy.hatenablog.com

この界隈恒例の「寝かせる」という儀式の結果、

だいぶ様変わりしました。この模様はまた後日ここに記したいと思います。

 

さて、今回は、

思いの外反響が大きかったため書いてみたいと思います。


入社直後にわかる「深刻な状況」

実はAUDIY、電気設計として現在の職場に新卒入社してからちょうど3年を迎えたのですが、入社時に目の前に広がるのは異様な光景でした。

弊社は同じオフィス内にハードウェア(回路&機構)設計部署とソフトウェア設計部署が存在しますが、明らかに回路設計部署の平均年齢が高いことにひと目見て気づきます。

おそらく平均が40代後半から50代前半程度ではないでしょうか。ソフトウェア設計と比較して10歳ほど平均年齢は上になるかと思います。

そしていざ話を聞いてみるとAUDIYが入社した頃は「新卒採用を積極的に再開し始めてから3年」とのことでしたし、更には「新入社員より定年退職者が多くハードウェア設計の人数は減るばかり」という状況でした。

最近話題の「配属ガチャ失敗」とは思いませんでした(後述します)が、「とんでもない会社に来たな」と思ったのが入社直後の印象でした。


恐ろしく高いハードル

そんな回路設計部署に配属されたAUDIYですが、大学や大学院ではソフトウェア専攻だったのもあり、待ち構えていたのは「恐ろしく高いハードル」です。

 

弊社、現場での技術的な研修は基本的に設定されておらず、いわゆる「OJT」なのですが、「ESR」「カスコード」「位相補償」「負帰還」とかさっぱりわからないままOJTなので作る回路が「ゴミ」なのです。今でもゴミです。

 

そして更には業務時間中は先輩が各々の業務で忙しく、AUDIYは放置プレイで雑用を依頼されるという状況です。まぁ「雑用を依頼される」というのは新入社員全てにとってそうだとは思いますが、業務時間中に放置を喰らうと言うのはさすがに危機感を覚えました。(無論ですが、ボーッとはしてたわけではなく電気回路・電子回路を座学で勉強し直してましたよ。)

 

どこもそうだとは言いませんが、「OJT」を謳うハードウェア設計は裏返して言えば「設計技術を教える余裕すらないのをOJTという名目で誤魔化している」可能性があるということは今後回路設計を目指す学生は把握しておいても良いかもしれません。

 

こんな状況にしてしまうのなら理系で一括に採用せず専攻分野ごとに絞ればよいのにとは思います。(別分野で食わせてもらってる身で言うのもなんですが今でも思ってます。)


「配属ガチャ失敗」ではないのが最大の救い

ただこの場で伝えておきたいのは「就職先に失敗したな」とか「配属ガチャ失敗だったな」とは思っていないと言うことです。

弊社、上記でも少し書いた通り、理系はいわゆる「総合職採用」(回路・ソフト専攻関係なく「設計」として入社します)なんですが入社前にやりたいことを聞かれて、配属部署についてはある程度その意向を汲み取ってくれます(確約ではないです)。

AUDIYはそこでFPGAやりたい!」と伝えまして、その結果FPGAもやってるハードウェア設計部署への配属になったというのが現状です。

 

お恥ずかしい話、それまでFPGAはソフトウェア部署で設計しているものだとばかり思ってました。ここは率直に私の企業研究不足の結果です。

 

そして希望通り(私にとってハードルの高い回路設計をしながらではありますが)FPGAを用いた設計を色々できていますし、これができていることが業務を続ける最大のモチベーションにもなっています。


入社2年目にして炎上案件

話がだいぶそれましたが2年目に差し掛かる少し前から設計に本格的に携わるようになります。

そしてこれが後の「炎上案件」になるなんて、当時の自分はまだ知る由もありませんでした。

しかしその傾向はすぐに分かるようになります。

 

まず、「大量の部品が入らない」

これは当時コロナ禍による半導体不足もあったので、どの案件の設計をするにしても巻き込まれていたと思います。

 

ここまではまだ良いとして

  • 電源レギュレータの納期が遅延している。担当案件で置き換えてほしい。
  • FPGAが入らない。担当案件で置き換えてほしい。
  • その他特定用途ICが入らない。担当案件で置き換えてほしい。
  • 汎用ロジックICが入らない。担当案件で置き換えてほしい。

と、置き換えを繰り返した結果設計が遅れに遅れます。
さすがに変だと思い率直に上司に「なんかやけにうちの担当だけ置き換え依頼多くないですか?」と聞いたら衝撃の回答でした。

マーケティング側における担当案件の優先度が低くて半導体不足のしわ寄せが集中している(≒置き換えた分を優先度の高い他の案件に回している)」

 

・・・・・(・・;)

 

いくら経営判断とはいえ「続ける必要あるのか」「優先度低いなら供給の回復を待って設計再開でも良いのでは」とは正直思ってしまいました。

 


さらに闇深い3年目

まぁそんな中設計を続けていくわけですが、更に炎上に追い打ちを掛けてきます。

  1. 一緒に回路設計担当していた延長雇用の先輩が契約更改せずに退職
  2. 機構設計の先輩が別部署異動(最初から関わってる設計担当が私だけになる)
  3. AUDIYが新入社員担当になる

・・・・・いやいやどうやれと???????????

そりゃこの記事冒頭でも書いた通り「新入社員に教えている暇は無い」のも頷けます。

 

私が入社した当時のように新入社員の後輩にも回路設計の軽い演習くらいはしてあげたかったんですが、そこまで回せなかったことを大変申し訳なく思っています。

 

そんな中で(残業時間の多さをを詰められつつも)なんとか炎上案件の設計を終えたわけですが、そこで上司から言われた言葉が

「今になって正しい設計ができていなくて残念です。」

 

一発目の設計でそこまで求めるなら新卒採用なんてせずに中途をバンバン雇ったらどうですかね・・・・・

このときが業務に対するモチベーションは消えましたし、転職を考え始めたきっかけでもあります。


4年目となった今

なんと、上の心ない発言をした上司と一緒に次の案件の設計をしています。

上司が求める「正しい設計」とは何なのか、しっかりと教えていただこうではありませんか!!!!!!!

 

ここですぐ辞めたら自分にとっても癪ですしね。

 

と同時に、炎上案件でできなかったことも盛り込んでより良い回路に仕上げていきたいです。(あまり大きな声では言えませんが炎上案件の最終形態はハリボテ同然となってしまいましたので・・・・)


転職どうすんの?

転職そのものについては現在も考えています。

ただ、私のように入社3年とかそこらだと中途採用というより第二新卒(もしくはそれに近い状態)での採用の市場が広いらしく、

関係からボコボコスカウトが来ている状況です。

正直転職サイトで調べるより自らもう少し企業や分野を絞ってその企業の中途採用に応募したほうが安全な気がしていますね。ここは調査を継続する必要があると考えています。


総括

とまぁここまでの経験から過去の自分に言いたいこと(≒異分野から回路設計新卒採用を受ける人もしくは配属される人に伝えておきたいこと)を書いておきますと

  1. 専攻をそのまま職業にしたいなら「理系総合職採用」は調査を念入りにしておいたほうが良い
  2. 未経験から回路設計に配属できる企業には相応の理由があるという認識を持っておいたほうが良い
  3. 職務経歴書や履歴書の随時改訂等の転職準備は少しでも可能性があるなら進めておいたほうが良い
  4. 転職は分野が絞れているなら転職サイト使うより企業のキャリア採用を使ったほうが良い(ここは「気がする」レベルです)
  5. 上記4つに加えやりたいことすらさせてくれない(配属ガチャ失敗)ならすぐに転職に動いたほうが良い(間違いなく自分より神経すり減らすと思います。)

という感じです。

 

なんかほとんど現職の愚痴っぽくなってしまいましたが、新規デバイスの立ち上げ含めFPGA設計に関われているのは大変うれしいですし、最近部署の再編がありましたので今後どの程度環境が改善されるかは楽しみにしているところです。

あとソフトウェア設計や機構設計は週~月に1回集まって定期的に勉強会開いてるんですが、回路設計はできていないのでそのあたりもやってみたいですね。(私みたいなゴミ回路生成機が教えてもなんなので私は受講する側で。w)

 

以上です。

また社会人経験5年を迎えた頃に改めて書ければと思います。

 

Efinix TRION T20開発キットとAmanero Combo384を組み合わせる(1)

皆様こんにちは。お久しぶりです。

突然ではありますが、なんか欲が湧いてきたのでCombo384とEfinix Trion T20F256開発キットを使ってUSB-DACを自作したいと思います。

www.tec-sol.com

 

www.efinixinc.com

さすがに筐体設計まではしませんので悪しからず。w


今回は・・・

Amanero Combo384とT20F256開発キットを接続する基板を設計します。

ジャンパー線でピンヘッダ同士を接続しても良いんですが、やはり「信号線とGNDパターンが並走できる」という点で通信の安定を考えて基板を作成します。


設計に関して

FPGAを他のデバイスと接続するときに設計者が考えないといけないことは「ピン配置」です。

IOピンならどこでも良いかと言われるとそうではなく、「クロック入力専用ピン」「制御信号入力推奨ピン」が各FPGAバイスに設定されていて、特にクロック入力専用ピンは「そこに入力したクロックでないと内部のD-FFを駆動できない」なんてデバイスもあります。

実際にTrion T20F256のピン配置を見てみます。

※「Trion Packaging User Guide v4.6」より引用

 

「なんのこっちゃ」と思われる方も多いと思いますが、「CLKn」(nは任意の整数)と記載のあるピン(例:G1ピンがCLK7)がクロック入力ピン、「CTRLn」が制御信号入力推奨ピン(例:H1がCTRL2)です。

 

それ以外にもLVDS入出力ピン(図の紫色の箇所)やPLL用クロック入力ピン(PLLINと記載のあるピン)等、配線を間違えたらとんでもありません。


開発環境でピン設定が通るか確認する

ということで、基板設計をする前に各入出力ピンの設定(クロック入力なのか、制御信号なのか、GPIOなのか)を開発環境で確認します。

流れをざっくり書きますと、

まずはトップモジュールを作成します。
内部処理が空だとエラーになるので何かしらの信号を出力にスルーアウトさせてください。

 

次にEfinity IDEでプロジェクトを作成し、作成したトップモジュールを論理合成します。

 

エラーがなければInterface Designerを起動して、トップモジュールの信号を各ピンに配置していきます。

このとき、開発キットの回路図を追いながら「どこがクロック入力か」、「どこが制御信号入力か」を探しながら配置していきます。

ピンの信号名はトップモジュールの入力・出力の信号名に合わせます。

 

GPIOR_120とGPIOR_124をクロック入力専用として設定したんですが、データシートを確認したらグローバルクロックラインが重複してしまっています。

2箇所重複しているので問題は無いと思います(コンパイル時に自動振り分けされるはずです)が、まぁ問題があれば基板の作り直しですかね。

※「T20 Data Sheet v5.1」より引用

スルーアウトする分には問題なさそうですので、とりあえずはコレで変換基板を発注したいと思います。