電子回路わからん日記

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

ディジタル技術検定2級(情報)を取得しました

ご無沙汰してます。

更新が滞っており大変申し訳ございません。
専門知識を少しずつ勉強した証拠を獲得していこうと、下記試験の勉強をしておりました。

digital-kentei.com

 

今回、無事に合格し合格通知を受け取りましたので受験までの過程と今後の展望についてブログに示したいと思います。

 


この検定は何?

digital-kentei.com

ラジオ・音響技能検定(懐かしく思われる方もいらっしゃるのでは?)の休止後にその中のコンピュータ関連分野を独立させて発足された検定のようです。

文科省後援なのである程度信頼も置ける民間資格なのではないでしょうか。

就職してから電子回路設計の門戸を叩くにあたり、電子回路設計関連の資格を取得して実務に活かすことができればと考えていました。

 

ですが電子回路設計に関連する資格ってそこまで多くないようで、大体揃って出てくるのが

  • ディジタル技術検定
  • 第一級陸上無線技師
  • EMC設計技術者資格

という感じです。あと最難関だと技術士(電気電子)でしょうか。

www.engineer.or.jp

難易度で言えばディジタル技術検定が初心者から入りやすい印象でしたので、まずはここから取得していくことにしました。


まずは情報分野から

で、過去問を一通り見てみたのですが、2級情報部門が大学で学んだ分野が総合的に出されており肩慣らしには十分な印象です。

 

2級制御もある程度は網羅されていたのですが、伝達関数などの制御工学は大学では講義の教員と馬が合わず未受講であったため、少し時間をかけて勉強することに。(あと当時はラプラス変換で躓いた記憶)

 

ちなみに、2級の各部門に求められるスキルは以下の通りです。

digital-kentei.com


勉強

基本的には公式に出版されている「受験準備書」を購入して一通り出題内容をおさらいし、

digital-kentei.com

 

あとはひたすらWebサイトで制限時間内で模擬試験形式で過去問題を解きまくり、

digital-kentei.com

 

知識的に不足しているところを再度受験準備書やググったりして復習していきました。


重点的に勉強した部分

問題の割合としては知識を問う問題が多いのですが、「配点が非公開」となっていることや、公式に「最後のプログラミング問題の配点が大きい」と述べられていることから、以下3つの分野は重点的に勉強しました

  1. 論理回路(組み合わせ回路)設計
  2. 符号理論
  3. C言語プログラミング

 

論理回路設計

AND、OR、NOTを組み合わせた組み合わせ回路設計について問われます。筆者が解いた過去問の中ではXORや、D-FFを使用した順序回路の出題はありませんでした。

 

カルノー図」ではなく「ベイチ図」が多用されており、これまでカルノー図で論理設計してきた人は少々慣れが必要です。

 

加法標準形、乗法標準形、それらを利用した冗長な(省略できる)論理式など、この分野は論理設計だけでなくそれらを駆使した考え方も問われました。

 

符号理論

巡回符号や、行列式を用いた符号の誤り訂正など基礎的な内容が問われます。

しかも項の数が6つほどあるので、持ち込みの許されている関数電卓では対応できない場合がほとんどだと思います。

 

行列式の計算ミスに常時気をつけておけば大丈夫かと思いますが、生成多項式や情報多項式などの用語も出てくるので復習は必要です。

 

C言語プログラミング

日本語で仕様を説明されたソフトウェアをC言語の穴埋め形式でコーディングしていきます。

 

問題テーマはバラバラですが、C言語コードそのものは基礎的な内容で、ポインタや構造体、math.hなどのライブラリを使った問題は基本的に出題されないようです。

 

私は解いた問題を答え合わせした後一旦コーディングして実際にPC上で実行して確かめました。おそらくそうしておくほうが「どんな間違いを犯す可能性があるか」も予想できると思います。


実際に受けた感想

私は公開会場まで移動して受験したのですが、会場がとある高専だったため

社会人は圧倒的に少なかったですね。高専生が同じ級を受験できていることから考えても、専門分野を勉強している高校生や大学生の時点で取得できる資格だと思います。

 

出題内容はこれまでの傾向と大きく変わらず、

  1. 論理回路設計
  2. 符号理論
  3. 知識問題
  4. プログラミング問題

の順番だったのですが、論理回路設計で少しパニックになってしまい冒頭で時間を使ってしまったものの、全問解くことができました。

 

いちおう途中退室も可能だったのですが、解答に悩んだ問題も数問出たため、私は全て解き終わった後に時間いっぱい使って解答漏れ等を確認し、試験を終了しました。

 

知識問題ですが、マルチメディア関係の技術に関する問題が数回に1度の割合で出てくるようです。ちょうどその回に当たったらしく、2問ほど確認していない問題がでてきて少々戸惑いました・・・・


合否通知まで

およそ1ヶ月かかりますが、自己採点は試験の1週間後あたりにできます。

digital-kentei.com

筆者は40問中34問正解でした。


格通

無事受け取りました。

 

 

申請すれば合格証明書の発行もできるため、学校や職場で資格を登録するのも可能です。

 

早速2級制御の準備書も取り寄せたため、次回は2022年11月に受験予定です。

おそらく、制御分野のほうが職場でいろいろと活かせるかもしれませんね・・・


以上、社会人になって初めての受験回顧録でした。

 

日本でもエンジニアに求められる技術力は段々と厳しくなってきていますから、私も勉強を続けて国家資格の一つくらいは持っておきたいですね。

 

特に、エンベデッドシステムスペシャリストとか興味があります。(何年後になることやら)

 

また年末に制御2級の受験記を書きたいと思います。

筆者の電子工作環境

ここでは筆者が電子工作やプログラミングをするにあたり使用している環境を列挙していきます。

ハードウェア

PC

Lenovo ThinkStation P340 SFF

www.lenovo.com

  • CPU: Intel Core i7-10700
  • GPU: NVIDIA Quadro P1000
  • メモリ: DDR4 32GB (8GB x 4)
  • ストレージ (Cドライブ): 512GB NVMe PCIe Gen3x4 M.2 SSD
  • ストレージ (Eドライブ): 1TB SATA 2.5インチ SSD
  • ディスプレイ: Lenovo ThinkVision p24q-20
Lenovo ThinkPad X1 Carbon 7th

www.lenovo.com

  • CPU: Intel Core i7-10510U
  • メモリ: LPDDR3 16GB (8GB x 2)
  • ストレージ (Cドライブ): 512GB NVMe PCIe Gen3x4 M.2 SSD

マイコンボード

STMicroelectronics NUCLEO-F411RE

www.st.com

FPGAボード

Terasic DE10-Lite (Intel MAX10 10M50DAF484C7G搭載版)

www.terasic.com.tw

オシロスコープ

SIGLENT SDS1104X-E

siglent.jp

  • サンプリング: 1GSa/s
  • 帯域幅: 100MHz
  • チャンネル数: 4チャンネル

直流安定化電源

SIGLENT SPD3303C

siglent.jp

マルチテスター

WH5000

akizukidenshi.com

はんだごて

HAKKO FX-600

www.hakko.com

その他

Combo384互換ボード

ADALP2000

www.analog.com

 

ソフトウェア

テキストエディタ

Microsoft Visual Studio Code

azure.microsoft.com

C/C++プログラミング環境

静的解析ツール

Cppcheck

cppcheck.sourceforge.io

コンパイラ

Intel oneAPI DPC++ /C++ Compiler

www.intel.com

その他C/C++ライブラリ

Intel oneAPI Base ToolKit

www.intel.com

Boost C++ Libraries

www.boost.org

Pythonプログラミング環境

Anaconda3

www.anaconda.com

STM32マイコン開発環境

STMicroelectronics STM32CubeIDE 1.9.0

www.st.com

Arduino IDE

www.arduino.cc

FPGA開発環境

Intel Quartus Prime 20.1 Lite Edition

www.intel.co.jp

回路シミュレーション

LTspice XVII

www.analog.com

基板設計CAD

KiCad 5.1.12

www.kicad.org

リアルタイムDSDコンバータの出力波形をもう少し整える

ご無沙汰です。

 

前回出力波形を確認したリアルタイムDSDコンバータですが、

audio-diy.hatenablog.com

 

こんなに高調波が乗る理由についてはド素人なのでわからず、

  • FPGAの出力がローパスフィルタの負荷を駆動できていない
  • 1次ΔΣの1bit出力だとこんなもん

と予想をつけて、まずはローパスフィルタをアクティブタイプにしてみました。

 

すると有識者からいくつかアドバイスをいただき、

 

「変調率」というキーワードがそろって出てきました。

 

変調率という言葉自体が初耳だったのですが、「音量を下げれば変調率も下がる」とのこと。

確かにAUDIY、波形確認の際は1kHzの0dBFSを再生しておりました。

 

再生ソフトウェア側で音量を1.5dB下げてみると・・・・

確かにそれっぽくなりました!
一歩前進!


一つ気になること

ここで一つ気になることがあります。

それは「このΔΣ変調した1bit信号をモノリシックのオーディオ用DAコンバータに入力するとどうなるのか」ということです。

 

同じように歪むのか、はたまたキレイに再生してくれるのか気になります(DACによる気もしますが・・・・)

 

いつかDSD対応のモノリシックDAC基板を起こして検証してみたいものです。


今後の展望

さて、今回波形がそれっぽくなってきたわけですが、精度としては波形を見た感じ2.5bit程度でまだまだです。

 

なんとか第一関門は突破したので、今後は

  • 精度の向上(オーバーサンプリングの実装&次数を増やす)
  • 出力bit数の向上、PWM出力(もうDSDコンバータではなくなってしまう)

あたりで遊んでいきたいと思います。

 

ただ次数を増やすと発散の危険と隣り合わせなので、少し勉強する時間をください・・・・

3月にΔΣ変調に関する「例の専門書」を購入予定ですので。

 

その間にPT8211Sや、

audio-diy.hatenablog.com

 

フルディスクリートマルチビットDACなど、

少しずつではありますが進めていきたいと思います!

 

PT8211Sを動作させるための論理回路設計

秋月電子で突如発売された384kHz/16bit対応R-2R DAコンバータICのPT8211Sですが、

audio-diy.hatenablog.com

なんとこの子、入力データがI2SではなくLSBが最後に来る右詰めです。

昔はこの方式が主流だったのでしょうか・・・?


したがって、I2Sが主流となった今日においてはAmanero Combo384やXMOS、S/PDIFレシーバなどからやってくるI2Sデータを右詰めにしてこのPT8211Sに送ってあげる必要があります。

 

と、いうことでAUDIYお得意のVerilog HDLで論理回路設計します。


入力信号の仕様

今回PT8211Sに入力する信号の仕様は以下の通りです。

  • 16bit右詰め
  • 最大サンプリング周波数は384kHz
  • 最大ビットクロック周波数は18.432MHz(!!)

さて、ここで普段からI2Sなどのシリアルオーディオデータを扱っている方ならピンと来たかもしれませんが

 

なんとこの子、サンプリング周波数の最大48倍のビットクロックでないと動作しません・・・・・

つまり、I2Sのビットクロックをそのまま入れても動作しないということです。

 

また、ビットクロックの周波数から逆算すれば24bitのデータも入力することはできますが、その際は下位16bitがデコードされます。

ここを少し考えてあげる必要があります。


対応策

上記の入力信号の仕様を踏まえ、AUDIYは以下のように論理設計することにします。

  • I2SのBCKを2分周し、サンプリング周波数の32倍のBCKを生成する。
  • I2Sのデータの上位16bitを分周したBCKの立ち下がりエッジに合わせてシリアル出力する。
  • 右詰めフォーマットに合うように、ワードクロックの開始点とデータの開始点を揃える。

さすがに24bitに合わせてビットクロックをつくるとなるとAmanero Combo384のマスタークロックから再生するサンプリング周波数に合わせて分周するか、PLLを使ってI2SのBCKを3/4倍する必要があり少々面倒くさいので、上記のようにします。

これにより最大のビットクロック周波数は12.288MHzとなります。データシートには「必ず48倍のビットクロックを入れる必要がある」との記載も見当たりませんのでおそらく大丈夫でしょう。


いざ、記述!

でまぁ、記述していくわけです。

最初はクロックにグリッチを入れるとデータがズレたりとバグもあったんですが、なんとかシミュレータ上ではバグが確認できないくらいに作り込むことができ、

いざ、Quartus上で論理合成したら

これはQuartusのみの仕様なのか、XilinxのVivadoなども該当するのかはわかりませんが、「同一のレジスタを異なるクロックで操作してはならない」というルールが存在します。

今回はDATAO_Bufというレジスタをワードクロックとビットクロックの両方で操作しようとしていたのが原因でした。

個人的にはビットシフトを使って先頭ビットを読むということができれば確保するレジスタを削減できて嬉しいのですが・・・・

 

仕方ありません。今回はカウンタを使って一致するインデックスのデータを読むことにします。(異なるクロックでの読むのは全然問題ありません。)


合成する

タイミング制約までできましたのであとはFPGAに焼けばOKです!

まだ実機動作確認できていませんので、そこが確認できればコードも公開できればと思います。

リアルタイムDSDコンバータの出力波形確認

だいぶ前にリアルタイムDSDコンバータをFPGA上に実装したお話を書きましたが

audio-diy.hatenablog.com

今回は実際にこのリアルタイムDSDコンバータから出力された信号をローパスフィルタに通して出力波形を見てみたいと思います。


DSDの利点。それは・・・・

原理上はアナログのローパスフィルタを通すだけで再生したいアナログ波形を取り出せるという点です。(実際はそうはいきませんが・・・・)

ということで、CRローパスフィルタを通してアナログ波形をオシロスコープで観測してみます。


配線

PC→Amanero Combo384→Terasic DE10-Lite (ここでPCM-DSD変換)→CRローパスフィルタ→オシロスコープで配線します。

最初ちょっと積分器の設計をやらかしていたんですが

修正すると・・・・

ゼロクロス周辺の変な歪は消えましたが正弦波ではなく三角波っぽい波形になっています。

 

三角波ということは奇数次高調波が乗っているということですね。

ちょっくらFFTで周波数特性を見てみます。


ローパスフィルタを通したあとの出力波形をFFTで見てみる

f:id:AUDIY:20220211180404p:plain

ビンゴです。

なぜか5次高調波はいませんが、1kHz、3kHz、7kHz、9kHz・・・・と奇数次高調波がガッツリ乗っています。

 

しかも今回のローパスフィルタのカットオフ周波数は20kHzですし、PCM-DSD変換でオーバーサンプリングなどの信号処理も一切行っていません。

それを1bitの矩形波の密度の変化で送っているわけですから奇数次高調波が乗って当然です。これを少なくしようとすると「マルチビット出力」や「変調の次数を増やす」ということになるのでしょう。


ということで、1次ΔΣのリアルタイムDSDコンバータの出力波形を見てみました。

次回は同じく1bit出力のまま、ΔΣ変調の次数を増やして波形の変化を確認してみたいと思います。

PT8211Sを購入しました

・・・・・寒いです。(突然)

 

今回は面白いものを秋月電子で購入したのでちょい遊んでみようかと思いまして、ちょっとしたイントロダクションです。


出会いは突然

やってきました。

今どき珍しいモノリシックのオーディオ用R-2R DAコンバータICです。

どうやらPrinceton Technologyという会社がPhilips TDA1311Aのピンコンパチ品として現在も生産を続けているもののようです。

www.princeton.com.tw

 

I2Cなどによる設定も必要なく、電源と16bit右詰めフォーマットさえ入力すればアナログ信号が電圧出力されます。I2Sから右詰めへの変換さえできればすぐに使うことができそうです。

 

THDがTypical値0.1%程度と特性がなかなかに不利ですが、このあたりは後段のアナログ回路で改善できる可能性は大いにあります。

 

欲を言えば電圧出力でなく電流出力であればなおのこと特性の追い込み甲斐がありますが、そんな事を言っても仕方がないのでまずは1石で音を出すところから始めてみたいと思います。


今後の計画

さて、PT8211Sを使用したDAコンバータですが、以下の計画で遊んでいきたいと思います。

  1. データシート記載のリファレンス回路で動作確認
  2. デュアルモノラル化、低歪化検討
  3. FPGA/CPLDと組み合わせた基板設計
  4. 電源部まで含めた設計(ここまで行くかな・・・・?)

さっそくリファレンス回路の基板を起こしています。

Combo384を組み合わせればUSB-DACもできますし、現時点で妄想が膨らんでいます。

アイソレータと組み合わせて「USBのノイズをシャットアウト」というのもよいかもしれません。


ざっくりイントロダクションでした。

 

ゆくゆくは最近複数のメーカーがされているような「FPGA/CPLDと抵抗を組み合わせたディスクリートR-2R DAC」もやってみたいです。

 

まずはSPDIF光-I2Sコンバータの基板が届くのでそちらを先に完成させます・・・・

 

リアルタイムDSDコンバータのHDL記述

新年明けましておめでとうございます。
2022年もド素人電子工作アカウントのAUDIYをよろしくお願いいたします。

今回から前回のシミュレーション結果をもとに、いよいよFPGAにリアルタイムPCM-DSDコンバータを実装していきたいと思います。


ΔΣ変調のブロック図

さて、前回シミュレーションしたPCM-DSD変換ですが、

audio-diy.hatenablog.com

 

これをリアルタイム実装するにはΔΣ変調をFPGA上に実装する必要があります。

ΔΣ変調のブロック図としては、個人的に下記ブログが最も理解しやすいと感じました。

xx3stksm.hatenablog.com

 

積分器のブロック図含めて描かれています。

今回はこれをFPGAに実装するためにVerilogコードにしましたので解説していきます。


I2S-パラレルPCM変換

これは今回のリアルタイムDSDコンバータを作るモチベーションとなったものですが、Verilogコードそのものの公開は初めてと思います。

github.com

 

HDLを書いたことの無い方のために言葉で説明しますと

  • BCLKの立ち上がりエッジに合わせてデータを64bit分(Lch: 32bit、Rch: 32bit)ストック&LRCKを1BCLK分遅延させる
  • 遅延させたLRCKの立ち下がりエッジに合わせて64bitを上位32bit(Lch)、下位32bit(Rch)に分離して出力
  • RST_I信号がLowとなった際には出力と内部の保存データを全て0にする

という機能を実現しています。

これによりLRCKをワードクロックとしています。


微分

ΔΣ変調の「Δ」に相当する部分です。

github.com

デジタルにおける微分は「入力値から1サンプル前の微分値を引き算する」ことによって実現していますが、今回は上記のブロック図に則り引き算のみを担当します。

 

1サンプル前の数値は、後ほど紹介するDSM_MAXIMIZER.vが担当します。


積分

ΔΣ変調の「Σ」に相当する部分です。

github.com

 

微分器の反対なので「入力値と1サンプル前の積分値を足し算する」ものです。

ただ足し算だけ繰り返すといずれオーバーフローしますので、足し合わせる計算結果は1ビット→シフトします。


量子化

積分した結果を1ビット信号として出力します。

積分した結果が正であれば1、負であれば0を出力すれば良いのですが、

github.com

上記のコードの通り最上位ビットを反転すれば良いです。

 

なぜかというと、符号付き整数においては最上位ビットが符号ビットであり、

0: 正の整数

1: 負の整数

であるためです。

 

出力したい結果は

正の整数なら1

負の整数なら0

なので、0→1、1→0つまり最上位ビットのNOT演算で実現できます。


遅延+振幅の最大化

量子化された結果を微分器へフィードバックするためのモジュールです。

ここで微分のために1BCLK分の遅延を加えています。

 

量子化された結果は1bitだと1か0となり、そのままでは入力と計算しても正しく微分できないので、これをPCM信号の最大振幅とします。(ブロック図上でよく「DAC」と表記されている部分です)

github.com


配置配線

筆者はQuartusで開発していますので、ブロック図を描いて機能を実現します。

github.com

 

これを論理合成すると下のような回路図になりました。

github.com

 

ひと通り見たところ間違いはなさそうですが、どうでしょうか?

ブロック図は下記リンクのVerilogコードに変換済ですので、VivadoやDiamondをお使いの方でも合成・配置配線できるかと思います。(Intel固有IPも使っていません。)

github.com

 

使って遊んでくれると嬉しいです。


次回は実際にFPGA上で動作させて出力波形をオシロスコープで覗いていきたいと思います。