電子回路わからん日記

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

Efinix Trion T20 Development Kitで遊んでみた所感

お久しぶりです。

だいぶ前にこんな記事を書きました。

audio-diy.hatenablog.com

 

今回はその続きについて書いていきたいと思います。


Digi-keyに相談

購入したDigi-keyに相談したところ、

ということで、

2つになってしまいました。

 

まぁ、勉強も兼ねて不良品はSPI/JTAGケーブルを自作して使えるようにしたいと思います。


正常動作品でいろいろ遊んでみる

正常動作品が届いたので、公式で配布されているDevelopment Kit用のTutorialを用いて一連の流れに触れてみます。

vimeo.com

大まかな開発手順についてはVimeoに移動して動画を見てもらうこととして、今回購入した開発ボード上に色々実装してみて気づいた事等を、「EfinixのFPGA気になってるけどどうなんだろ?」と思ってる人のために少しでも気になればと思い列挙していきたいと思います。


「公式ダウンロードケーブル」が存在しない

IntelXilinxFPGAに触れたことのある人ならご存知かと思いますが、

www.mouser.jp

japan.xilinx.com

FPGAベンダーが書き込み/デバッグ用にケーブルを販売しています。

それに対しEfinixはどうかと言いますと、

https://www.efinixinc.com/docs/an006-configuring-trion-fpgas-v5.3.pdf

You can program Efinix FPGA or the SPI flash using FTDI Mini Modules.

 

(AN006: Configuring Trion FPGAsより引用)

とあります。

簡単に言えば「FTDIのICを使って作ってね」ということです。(ただし、市販のMini Moduleをプログラミングケーブルとして使用可)

www.mouser.jp

IntelXilinxの公式プログラミングケーブルが3万円とかするのに対しFT2232H Mini Moduleは5000円弱なので導入コストで言えば良心的ですね。

あとこの構成を採用することで「設計基板上にFTDIチップを載せてしまってユーザーがアップデートできるようにする」といったことも可能になります。


USBドライバが汎用

先述の「公式ダウンロードケーブルが存在しない」にも絡んでくるのですが、書き込みに使用するケーブルのUSBドライバが汎用ドライバ(libusb-win32)です。

また、ダウンロードにはZadigというフリーソフトウェアを使用します。

zadig.akeo.ie

ここは開発者の考え方の違いが出てくると思いますが、量産製品に搭載する用途などではあまり好まれないのかなと思います。

 

ドライバのインストーラフリーソフトウェアとなれば「開発元は今後も開発を継続できるのか」といってところに神経を使ってしまいますし、ドライバ関係周辺で問題が発生したときにベンダーがサポートしてくれるのかという点でも不安が残ります。


シミュレーション環境が貧弱

正直に言って「貧弱」と言わざるを得ません。

 

まず、開発環境にシミュレータが付属しません。

IntelやMicrochip、LatticeにはModelSimの機能制限版が付属したり、Xilinxは自社設計のシミュレータが付属しますが、Efinixの開発環境にはそれらがありません。

eda.sw.siemens.com

japan.xilinx.com

公式チュートリアルではALDEC Active-HDLで波形を確認している例がざっくり紹介されていましたが、

www.aldec.com

開発環境のドキュメンテーションを確認したところ、

  1. 開発環境から呼び出して使用できるのは「Icarus Verilog」「ModelSim」「Incisive」の3種類
  2. 開発環境のGUIからはシミュレータの呼び出しは不可能で、コマンドを実行して呼び出す必要がある
  3. 開発環境からのVHDL RTLシミュレーションが不可能VHDLのシミュレーションは別途対応シミュレータを立ち上げて実行する必要がある)
  4. 開発環境はデフォルトでIcarus Verilogを使用してシミュレーションを実行しようとする

など、開発にVHDLを使用するエンジニアに対しては特に優しくない仕様です。

ここは素直に改善を望みます。


RTLビューアが無い

これはAUDIYが普段Intel FPGAを使用しているからというのもありますが、論理合成結果をRTLビューアのような回路図形式で見ることができません。

つまり論理合成結果からバグを見つけることは不可能に近いです。

ここもできれば機能があると嬉しいです。


開発環境の無償アップデート期間が設定されている

開発キットさえ購入すれば開発環境のソフトウェアは無料で使用できますが、無償アップデート期間は1年間のみで、以降のダウンロードやアップデートは有償(年単位での更新)になります。

www.efinixinc.com

こういったところもIntelXilinx、Latticeと比較すると少々導入難易度が高いと言わざるを得ません。(アップデートさえ気にしなければ継続使用は可能)

 

ただし、IntelXilinxは開発対象のFPGAバイスによってソフトウェアの有償・無償を区別していたりするのに対し、Efinixはその制限が無いので一長一短といったところです。


UIがシンプル

IntelFPGA開発環境であるQuartusは開発工程や設定項目毎に細かい階層構造になっているため色々見落としやすい部分もあると感じていますが、Efinixの開発環境は至ってシンプルです。

プロジェクト設定へのアクセスも2クリックで開きます。慣れてしまえば初設定や各工程で細かい作業するにはこちらのほうが早いと思います。

 

他にもクロック数の制限とか

タイミング制約とか、色々あるにはありますが、おそらく初めてFPGAに触れる人、初めてEfinixに触れる人が直面するこれまでの開発環境との違いはこんなところだと思います。


初学者・ホビーユーザー向けか?

正直なところ、現状の開発環境では初学者向けとは言えないとAUDIYは思います。

「これから初めてFPGAに触れる!」という人は、素直にTerasicやDigilentの学習キットを購入してIntelXilinxの勉強をしたほうが幸せになれると思います。(学習用資料も豊富に揃ってますし。)

www.digikey.jp

www.digikey.jp

 

ホビーユーザーに対しては、ソフトウェア・アップデートさえ気にしなければFPGA開発経験のある人は検討の価値があると思います。というのも、

  • 自前の書き込み環境を構築できる
  • コンフィグレーションROMや書き込み環境のコストを安く抑えられる
  • シミュレータやRTLビューアも大抵どうにかなる(AUDIYはModelSim Intel FPGA Starter EditionやYosysを組み合わせてます)

というのがそう考える理由です。


以上、AUDIYがEfinixの開発ボードでチュートリアルファイルを使って遊んでみた所感をまとめました。

 

せっかく動作不良品が手に入ったことですし、GPIOの数も豊富なので多くの入出力を必要とする設計や、自前の書き込み環境(FTDI FT2232Hを使った自作基板)の設計等勉強していければと思います。

積分器、微分器から学ぶ論理設計

ども。AUDIYです。(雑)

先日、FPGAでの信号処理実装で必要になったので積分器と微分器をVerilogでコーディングしたのですが、これが色々とハマって奥が深かったので共有しておこうと思います。


足し続ければイイんでしょ?引き続ければイイんでしょ?

本題に入る前に、まずはコンピュータを用いた積分微分(数値積分、数値微分)と解析学における積分微分の違いを明確にしておく必要があります。

www-np.acs.i.kyoto-u.ac.jp

基本的には関数のx軸を一定区間ごとに区切り、区間ごとに出した長方形や台形の面積を足し合わせることで実現しています。

コンピュータで面積を出す場合など精度が要求される局面ではこの区間を細かくしたりなどの様々な工夫を施していますが、今回はオーディオ信号の積分なのでそこまでは考えないことにします。

微分積分の逆なので、一定区間ごとの関数の数値を引いていけば基本的には実現できます。

時間信号の積分器についてはこちらがわかりやすいです。

tech-blog.cerevo.com


足し続けると、引き続けると・・・・

しかし、論理回路で上記記事の積分器をそのまま実現しようとすると問題が生じます。

C言語などのプログラミング言語で整数の足し算引き算を実装されたことのある方なら心当たりがあるかもしれませんが、「オーバーフロー」という現象が発生します。

 

たとえば、4ビットの整数に1ずつ足していく場合を考えます。

0, 1, 2, 3, 4, ..., 12, 13, 14, 15, 0, 1, .....

16は2進数で10000なので、下4ビットの値が繰り返されることで15の次は急激に0になってしまいます。これでは積分器の意味を成しません。

 

実際にVerilogで「足すだけ」の積分器を書いてみましょう。


module INTEGRATOR(
  CLK_I,
  DATA_I,
  DATA_O
);

    parameter DATA_Bit_Length = 4; // Bit Length

    input wire CLK_I;
    input wire unsigned [DATA_Bit_Length-1:0] DATA_I;

    output reg unsigned [DATA_Bit_Length-1:0] DATA_O = {DATA_Bit_Length{1'b0}};

    /* wire/reg */
    wire unsigned [DATA_Bit_Length-1:0] DATA_SUM;

    /* RTL */
    assign DATA_SUM = DATA_I + DATA_O;

    always @ (negedge CLK_I) begin
        // Output the data with Negative Edge
        DATA_O <= DATA_SUM;
    end


endmodule

以下はテストベンチです。


`timescale 1 ns / 1 ps
module INTEGRATOR_tb ();

    reg CLK_I = 1'b0;
    reg unsigned [3:0] DATA_I = 4'h1;

    wire unsigned [3:0] DATA_O;

    INTEGRATOR u1(
        .CLK_I(CLK_I),
        .DATA_I(DATA_I),
        .DATA_O(DATA_O)
    );

    always begin
        #10 CLK_I <= ~CLK_I;
    end

    /* Enable this section when use Icarus Verilog (iVerilog) */
    /*
    initial begin
        $dumpfile("INTEGRATOR.vcd");
        $dumpvars(0, INTEGRATOR_tb);

        #20000 $finish;
    end
    */

endmodule

ModelSimでRTLシミュレーションを実行してみます。

 

11, 12, 13, 14, 15, 0, 1, 2, ....となっています。
見にくいので波形の表示方法を変えてみましょう。

これがオーバーフローです。

微分器でも同様の事象が起こりえます。HDLに落とし込む際はこれを防ぐような処理を追加しないといけません。


では、どうするか?

まず、オーバーフローが発生する状況を想像してみます。
例えば、符号なし4bit同士の計算だと、

4'b1111 + 4'b0001 = 5'b10000 (15 + 1 = 16)

で、下4桁がそのまま出力になるのでここでオーバーフローが発生します。

 

つまり、オーバーフローの発生条件は「bit幅で表現できる数値の範囲を計算結果が超過したとき」となります。

 

出力のビット幅を無限に確保できれば良いですがそういうわけにもいきません。
そこででてくる処理が「飽和処理」(サチュレーション、クリッピングと呼ばれるものです。


飽和処理

飽和処理とは「数値が表現可能な最大値・最小値を超える場合は最大値、最小値を保持する」処理です。

同じく4ビット符号無しでの処理を考えます。

0, 1, 2, ....., 12, 13, 14, 15, 15, 15, 15, 15, ...........

 

と、積分結果が15を超える場合は15を維持します。

この「15を超える」というのが重要で、今回の積分器では結果が15を超えたことを検出せねばいけません。これは「一時的に計算結果を5ビットで保存する必要がある」ということです。


検出条件

5ビット幅の符号なし整数で「15を超えたことを検出する」ということは「数値が16以上である」ことを検出すればよいわけです。

5ビット符号なし整数で16は5'b10000となり、HDLでは「数値ビットの最上位が1」が検出条件になります。


実際に確認する

Verilogコードを以下のように書き直して再度シミュレーションします。


module INTEGRATOR(
    CLK_I,
    DATA_I,
    DATA_O
);

    parameter DATA_Bit_Length = 4; // Bit Length

    input wire CLK_I;
    input wire unsigned [DATA_Bit_Length-1:0] DATA_I;

    output reg unsigned [DATA_Bit_Length-1:0] DATA_O = {DATA_Bit_Length{1'b0}};

    /* wire/reg */
    wire unsigned [DATA_Bit_Length:0] DATA_SUM;

    /* RTL */
    assign DATA_SUM = DATA_I + DATA_O;

    always @ (negedge CLK_I) begin
        if (DATA_SUM[DATA_Bit_Length] == 1'b1) begin
            /* Saturation */
            // Ex. 4'b1111 + 4'b0001 = 4'b1111 (5'b10000)
            DATA_O <= {1'b1, {(DATA_Bit_Length-1){1'b1}}};
        end else begin
            /* Normal Operation */
            DATA_O <= DATA_SUM[DATA_Bit_Length-1:0];
        end
    end

endmodule

always文の中にif文で飽和処理の判定を加えます。

テストベンチはそのままで再度ModelSimでシミュレーションします。

これにて飽和処理は追加できました。今回の例では符号なしですが、符号付きの場合は・・・・少々考えてみると面白いと思います。

あと、今回の例では最小値方向の飽和処理は記述していません。


せっかくなので・・・

積分からの出力を受け取るモジュールなどがこのオーバーフローに合わせて処理(リセットなど)できるように、積分器から飽和処理のフラグを出してあげたいところです。

そこで、OFDET_O(OverFlow DETection Output)という出力を追加し、飽和処理が実行されている間論理値1を出力します。


module INTEGRATOR(
    CLK_I,
    DATA_I,
    DATA_O,
    OFDET_O
);

    parameter DATA_Bit_Length = 4; // Bit Length

    input wire CLK_I;
    input wire unsigned [DATA_Bit_Length-1:0] DATA_I;

    output reg unsigned [DATA_Bit_Length-1:0] DATA_O = {DATA_Bit_Length{1'b0}};
    output reg OFDET_O = 1'b0;

    /* wire/reg */
    wire unsigned [DATA_Bit_Length:0] DATA_SUM;

    /* RTL */
    assign DATA_SUM = DATA_I + DATA_O;

    always @ (negedge CLK_I) begin
        if (DATA_SUM[DATA_Bit_Length] == 1'b1) begin
            /* Saturation */
            // Ex. 4'b1111 + 4'b0001 = 4'b1111 (5'b10000)
            DATA_O <= {1'b1, {(DATA_Bit_Length-1){1'b1}}};
            OFDET_O <= 1'b1;
        end else begin
            /* Normal Operation */
            DATA_O <= DATA_SUM[DATA_Bit_Length-1:0];
            OFDET_O <= 1'b0;
        end
    end

endmodule

テストベンチにもOFDET_Oを追加し、確認します。


`timescale 1 ns / 1 ps
module INTEGRATOR_tb ();

    reg CLK_I = 1'b0;
    reg unsigned [3:0] DATA_I = 4'h1;

    wire unsigned [3:0] DATA_O;
    wire OFDET_O;

    INTEGRATOR u1(
        .CLK_I(CLK_I),
        .DATA_I(DATA_I),
        .DATA_O(DATA_O),
        .OFDET_O(OFDET_O)
    );

    always begin
        #10 CLK_I <= ~CLK_I;
    end

    /* Enable this section when use Icarus Verilog (iVerilog) */
    /*
    initial begin
        $dumpfile("INTEGRATOR.vcd");
        $dumpvars(0, INTEGRATOR_tb);

        #20000 $finish;
    end
    */

endmodule

最初の15(4'b1111)から次の15(4'b1111→飽和処理スタート)からOFDET_OがHになっています。


今回の積分器・微分器のVerilog記述を通じて上記のような考えることが多々あったので、今回ブログにまとめてみました。

実際に符号付きに拡張したものや微分器については下記GitHubリンク内にテストベンチとともに保存していますので、ぜひ確認していただければと思います。

github.com

また、最近は一度Verilogで記述したRTLをVHDLに書き直すことにハマっていまして、両方とも記述できる人間になりたいと思っています。

コードレビュー大歓迎です。

 

ではまた。

 

 

 

 

Efinix Trion T20開発ボードを購入したけど・・・・

経緯

欲しかったんです。

 

・・・・・GPIOだらけのFPGAボードが(゚Д゚)クワッ!

 

電子工作する人間たるもの、基板設計して作ってしまうのが理想なのですが、FPGA/CPLDの類は半導体不足の影響を引きずっていて個人購入は未だ難しそうです。


Efinixというメーカー

efinixinc.com

2012年創業の新興メーカーで、Xilinx(現在のAMD)も出資しているようです。

efinixinc.com

Quantumアーキテクチャという技術により、柔軟なFPGA開発を可能にしていることが強みのようです。

efinixinc.com

また、FPGAベンダーだけでなく、柔軟なプログラマブルバイス(RAP: Reconfigurable Acceleration Platform)の供給にも力を入れているとのことです。

efinixinc.com

最近、Twitterを見るとこのEfinixのFPGAを使用される方が増えている様子で、

まぁ、某I社も某X社もこんな供給状況じゃ他のベンダーに興味が行きますよねー・・・


調べていたら

こんなのを見つけました。

efinixinc.com

なんとGPIOだけで89ピン(!)あります!

しかもユーザーガイドを見たら、「LVDSピンもシングルエンドGPIOとして使用可能」とのことです。

 

AUDIYとしてはDE0-Nanoをずっと待っていましたが、

www.marutsu.co.jp

 

入荷される様子が一向に無いので、Efinix Trion T20で思い切って遊んでみることにします。


届いたはいいが・・・

結果から言うと、初期不良品(と思われる)を引いてしまいました。

何度かUSBケーブルを抜き挿しすると正しく認識されることもあるのですが、大抵の場合で下記のように接続が確立されません。

USBケーブルを変えても同様の症状だったため、ボード本体の不良と思われます。


ということで、現在購入先に初期不良で交換依頼中です。

 

さっそく遊びたかったですが、正常動作品の入手を待つことにします・・・

ディジタル技術検定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

STMicroelectronics NUCLEO-F446RE

www.st.com

FPGAボード

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

www.terasic.com.tw

Efinix Trion T20 BGA256 development kit

www.efinixinc.com

オシロスコープ

SIGLENT SDS1104X-E

adwinshop.com

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

直流安定化電源

SIGLENT SPD3303C

adwinshop.com

マルチテスター

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.13.0

www.st.com

FPGA開発環境

Intel Quartus Prime 22.1 Lite Edition

www.intel.co.jp

Efinix Efinity IDE v2023.1

www.efinixinc.com

回路シミュレーション

LTspice

www.analog.com

基板設計CAD

KiCad 6.0.11

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です!

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