前々回、前回に引き続き、Cmod A7ボード(FPGA)に搭載された、Xilinx Artix-7ファミリXC7A35TチップのXADCマクロ(AD変換器ハードマクロ)を使うテーマです。
実験も終わらせたし、前回でテーマ終了だと思いましたか?当方も、そのつもりだったのですが、やはり、AD変換器は変換精度などの特性評価までやっておかないと安心して使えないので、急遽追加実験🧪したいと思います。
前回の実験に使ったプログラム(test_adcx.asm)に、特性評価用のコードを追加して使います。
AD変換器の特性評価に関しては以下記事などを、ご参照ください。
「#8-2 逐次比較型AD変換器を作る」
「#14-9 手作りtiny AD変換器の評価」
「#19-6 FPGAボードのAD変換器を使う(2)」
特に、「#19-6 FPGAボードのAD変換器を使う(2)」は、Primerボード(中華FPGA)のAD変換器を評価した時の記事ですので、ご一覧ください。
今回も、Cmod A7ボード(FPGA)の外付けに、神様となるDA変換器を接続して、外部からアナログ電圧を印加します。その電圧をCmod A7ボードのAD変換器で変換して、特性を評価するのです。
外付けする12ビットDA変換器モジュール(MCP4725)の外観を以下図に示します。
評価しようとするAD変換器、Xilinx Artix-7 XADCマクロが12ビット解像度なのに対して、上図DA変換器も12ビットなので、全く解像度が足りません(言い換えると、神様とするにはスペック不足)。このため、一部、DNLやINL等の特性は評価できません。
期待値としては、DA変換器で出力したデジタル値と同じ値がAD変換器から読み出せたら、絶対精度0LSBと言う、理想的なAD変換器ですが、神様とするDA変換器自体にも誤差はあるし、AD変換器も、ノイズや回路特性などの影響を受けて理想通りの値を出力できないため、偏差が出ます。
この偏差が変換誤差となります。誤差を含んだ変換値と理想的な値との偏差を変換精度と言います。
以下、評価可能なオフセット誤差、フルスケール誤差、絶対精度について評価して行きたいと思います。
評価用プログラムとしては、以下の様な動作が求められます。
以前Primerボード(中華FPGA)で特性評価したプログラム(test_adc.asm)があるので、ここから必要なサブルーチンやコードを流用しました。
以下に、評価用の改造を施したプログラムをリンクしておきます。
評価用プログラム:test_adcx.asm
アセンブルしてMoscoviumマイコンに転送すると、シリアルモニタから、こちらのコマンドに加えて、以下のコマンドを受け付けています。
シリアルモニタコマンド仕様:(追加分)
特性評価は自動化されていて、【eval】コマンドでデータを取得したら、Excel等に貼り付けて処理するだけで特性値を求めることができます。
各特性値の計算方法などについては、こちらをご覧ください。
デザインは前回と同じ、NHOC113SR0408を使いますので、以下リンクからダウンロードして、Cmod A7ボードへ書き込んでおいてください。
続いて、NHOC113SR0408を書き込んだCmod A7ボードと、12ビットDA変換器モジュール(MCP4725)を以下表に従って接続してください。
Cmod A7ボード (Moscoviumマイコン) |
接続 |
DA変換器モジュール (MCP4725) |
GND | ⇔ | GND |
VCC3V3 (PMOD) | → | VCC |
stws_scl (18 PIN) | ⇔ | SCL |
stws_sda (19 PIN) | ⇔ | SDA |
adcx_ain0 (15 PIN) | ← |
OUT (どちらか一方へ手動切り替え) |
adcx_ain1 (16 PIN) | ← |
MCP4725のアナログ出力OUTを、Cmod A7ボードのアナログ入力端子2本へ同時に接続したところ、MCP4725の出力電流能力が足りなかったのか、フルスケール側(4,095LSB付近)で電圧が上がりきらない現象が発生しました。よって、2本あるアナログ入力(AIN0,AIN1)の内、評価しようとする一方の端子にMCP4725の出力端子OUTを接続して評価しました。
Cmod A7ボードのアナログ入力は、3.3V電圧を印加できる様、抵抗分圧回路が入っていて、およそ3.3kΩの抵抗でGNDに落ちていることは指摘済みです。Cmod A7ボードのアナログ入力端子は、入力インピーダンスが低いことについて、要注意です。うっかり忘れて、下手な回路からアナログ入力端子に接続してしまうと、AD変換どころでは、なくなってしまいます。
以下図に実験中の様子を示します。
準備が整いましたので、XADCマクロのAD変換器特性を評価して行きましょう。
まずは、XADCマクロの初期設定状態で評価してみました。DA変換器モジュールのアナログ出力OUTを、Cmod A7ボードのアナログ入力端子AIN0側へ接続して、以下の様に実行します。
実験サンプル:【 】内はシリアルモニタからの送信データ
【eval】
0,5,0
1,4,0
2,4,0
3,4,0
:
: (中略)
:
4092,4084,0
4093,4084,0
4094,4083,0
4095,4085,0
OK: eval finished
通信ソフトウェアのログ出力などから、上のデータをExcelに貼り付けて処理したグラフを以下図に示します。
横軸に入力アナログ電圧(0〜3.3[V])、縦軸に読み取ったデジタル値(0〜4,095[LSB]、上側)と絶対精度AE[LSB](下側)を取ったグラフです。
AD変換器の評価指標ではありませんが、一次回帰直線の相関係数R2=1と、直線でした。AD変換器(入力アナログ量に応じたデジタル値を出力する機器)としては機能しています。
評価できた指標は以下の通りでした。
絶対精度: AE=9〜−77[LSB]
オフセット誤差: OE=−3.6LSB
フルスケール誤差: FE=65.2LSB
上の特性値だけ見ると、酷いですね。Primerボード(中華FPGA)の時に測定した指標と比べてみたのが以下表です。
指標値の比較 | Cmod A7ボード | Primerボード |
絶対精度[LSB] | 9〜−77 | 9〜−40 |
オフセット誤差[LSB] | −3.6 | 11.6 |
フルスケール誤差[LSB] | 65.2 | 20.2 |
実は、双方とも、AD変換器の指標としては酷い有様なので、「団栗の背比べ」的な所があるのですが、ちょっと待ってください。以下図の様に測定データのグラフで見比べてみると、違う側面が見えてきます。
左側が先程実施したCmod A7ボードのグラフ、右側がPrimerボードのグラフです。ここで注目したいのは、下側の絶対精度(AE)グラフです。
Primerボード(右側)のグラフが「ぐにゃっ」と、湾曲しているのに対して、Cmod A7ボード(左側)のグラフは、直線的に変化していることが判ります。一次回帰直線(緑色破線)がx軸と一致するのが、理想的なAD変換器特性ですので、緑色破線がx軸と一致する様に回転させて使用すると、理想的AD変換器に近づけることが可能、と言う事です。
これを「AD変換器特性を校正して使う」と、言います。
校正して使う方法と、その結果については、後ほどご覧いただけます。
校正する前に、もう一つやっておきたい評価があるので、そちらを先に実施します。
XADCマクロには、AD変換器エンジンが2個搭載されていて、同時変換することができるようになっています。2個のエンジンで同時に2チャンネルのAD変換を実行するので、見かけの変換速度が×2倍速となることが特長です。短所としては、ノイズによる特性の低下が心配されます。
ロジック電源と、アナログ電源:
そこで、AD変換器エンジン1個だけで変換した場合と、2個同時変換した場合で変換精度を観測し、特性を確認しておきたいと思います。1個単体変換の場合は、前節の評価で実施済みなので、本節では、2個同時変換の特性を評価します。
DA変換器モジュールのアナログ出力OUTを、Cmod A7ボードのアナログ入力端子AIN1側へ接続し直して、以下の様に実行します。
実験サンプル:【 】内はシリアルモニタからの送信データ
【xwr,41,41af】
OK: xwrite[0x41]=0x41af
XADCマクロの内部レジスタ(0x41)に書き込んで(=0x41af)、「同時変換モード」に設定しました。XADCマクロの使い方については、Xilinxのドキュメントでご確認ください。
続けて、自動評価を実施します。
【eval】
0,0,10
1,0,9
2,0,9
3,0,9
:
: (中略)
:
4092,0,4028
4093,0,4028
4094,0,4027
4095,0,4029
OK: eval finished
結果を以下図(右側)に示します。
左側がAD変換器エンジン1個単体変換の特性グラフ、右側が今回測定した2個同時変換の特性グラフです。計算できた指標値について、以下表に比較してみます。
指標値の比較 |
単体変換 AIN0 |
2個同時変換 AIN1 |
絶対精度[LSB] | 9〜−77 | 10〜−67 |
オフセット誤差[LSB] | −3.6 | −4.9 |
フルスケール誤差[LSB] | 65.2 | 56.7 |
個体差の範囲内と思われる多少の偏差は除いて、特性に大きな差異は見られません。2個のAD変換器エンジンで同時変換した場合でも、AD変換特性に影響しないことが確認できました。
即ち、同時変換による高速AD変換器としての実力を存分に活用して良いという事です。良き良き。
XADCマクロには、自動校正機能が備わっているのですが、うまく機能しているのかどうか、良くわかりません(1^^;)。XADCレジスタの設定的には、初期状態で自動校正機能が有効になっています。その状態で測定した特性が、前の節の結果であるので、少なくとも期待する結果には届いていません。
本来期待される校正方法について考察してみましょう。まず、前の節で測定した特性について、以下の通りにまとめてみました。
DofsとDfulは、評価した時のデータから予め求めておくことができる定数値(整数定数)です。
Dcの式は整数計算可能ですが、乗算だけならともかく、除算が必要なのは否定的ですね。ただ、除数Nは2冪数4,096なので、12ビット右シフト演算に帰着できます。アセンブラで計算するにしても、乗算命令とシフト演算命令で完結でき、大きな負担は発生しないと考えられます。
上の校正式で校正した値に対して、特性を再評価してみると、以下の通りとなりました。
評価できた指標は以下の通りでした。
絶対精度: AE=9〜−11[LSB]
オフセット誤差: OE=−0.1LSB
フルスケール誤差: FE=−0.0LSB
AD変換器としてみると「まだまだ」ですが、絶対精度11LSBなら、「まあまあ」使えるのでは、ないでしょうか?
オフセット電圧とフルスケール電圧を使って校正したので、オフセット誤差とフルスケール誤差が、ほぼ0LSBに低下したのも目を引きます。
Primerボード(中華FPGA)の時は、絶対精度(AE)グラフ自体が、ぐにゃっと曲がっていて、校正しても非直線性などの面で難が有りました。その点、老舗Xilinx社製のFPGAは、AD変換器マクロも、割と「素性の良い」AD変換器だと判りました。
※やっぱり、素性の宜しくない中華製FPGAと決別し、安心の米国製FPGAに乗り換えたのは大正解でした。
※そもそも、絶対精度がフルスケール側で誤差が大きくなった原因は、FPGAのXADCマクロ起因ではなく、Cmod A7ボード上の抵抗分圧回路である可能性が濃厚です。抵抗素子の公差なども誤差となって観測されますから。仮に公差1%だった場合、フルスケール側(4,095LSB)では、誤差4,095LSB×1%≒41LSBの影響が出てしまう計算です。
最後に、XADCマクロについて気が付いたことを備忘録として記載しておきます。
XADCマクロには、リセット信号入力(reset_in)が備わっていて、Moscoviumマイコンのリセット信号で活性化される様に接続してあります。ところが、Moscoviumマイコンにリセットをかけても、XADCマクロ内のI/Oレジスタ値が初期化されない事に気が付きました。
シミュレーションでも確認して見ましたが、やはり、レジスタ値は初期化されないのが仕様らしいです。
XADCマクロのドキュメント(UG480)を読み込んでみると、「AD変換器の制御論理と、最大・最小値レジスタなど、一部レジスタは初期化される」と記載が有りましたが、その他のレジスタは初期化されないみたいです。よって、XADCマクロのI/Oレジスタを、初期値から変更して使う場合、リセット解除後、ソフトウェアで全I/Oレジスタを設定し直して、所望のモードに遷移したことを確約しなくてはなりません。→ 所謂、ソフトウェアリセット。
XADCマクロが何故に、その様な仕様になっているのかは不明です。→ リセット信号入力によって、I/Oレジスタが初期化されないことを念頭に使いましょう。
Xilinx Artix-7ファミリのXADCマクロは、素性の良いAD変換器だと判りました。ちょっとした追加計算は必要ですが、校正して使う事で、FPGAを使った試作目的であれば十分な特性を確保できます。満足。