公開日:2024/01/20
title.png

28th Season


#28-8 Artix-7のXADCマクロ(deux)

 前回に引き続き、Cmod A7ボード(FPGA)に搭載された、Xilinx Artix-7ファミリXC7A35TチップのXADCマクロ(AD変換器ハードマクロ)を使うテーマです。
 早速、具体的に回路の設計を進めて行きます。

ADCX122ユニットの設計

 ここへ至るまでの調査及び考察によって、XADCマクロは「AD変換器ユニット」として完成されていて、そのまま使用可能だと判りました。ただ、Moscoviumのメモリバスに合わせて、XADCマクロのDRPインターフェイスとの間を変換する、メモリバス⇔DRPブリッジが必要なことも判りました。
 ADCX122ユニットは、「ADC」という名前は付いていますが、DRPインターフェイスのXADCマクロをMoscoviumのメモリバスへ接続するための、ただのバス仕様変換器(bridge)です。以下にブロック図を示します。

a288_adcx122.png

※薄黄色の箱はCPUからアクセス可能なI/Oレジスタ、薄緑色の箱はハードマクロ、青破線はRTLとハードマクロの境界線です。

 上図に示した通り、Moscoviumからは単なるメモリバス接続のI/Oレジスタ×7個に見えます。
 DRPインターフェイスを通して、128個×16ビット=256バイトのXADCマクロ内レジスタにアクセスすることができます。ADCX122ユニットで制御するのは、XADCレジスタへのアクセス方法のみです。XADCレジスタを設定して、XADCマクロを制御する方法については、XADCマクロのドキュメントを参照してください。

I/Oレジスタ仕様

 以下にADCX122ユニットのI/Oレジスタ表を示し、解説を続けます。

Addr Name R/W Bit:15〜0 Memo
0xf170 adcxctl RW XB
SY
EO
SF
EO
CF
DR
PE
BS
Y
adc control
0xf172 reserved
0xf174 adcxain0 R AIN0[15:0] adc conversion data 0
0xf176 adcxain1 R AIN1[15:0] adc conversion data 1
0xf178 adcxadrr RW RADR[6:0] drp read address
0xf17a adcxdatr R RDAT[15:0] drp read data
0xf17c adcxadrw RW WADR[6:0] drp write address
0xf17e adcxdatw RW WDAT[15:0] drp write data

 BUSC出力のセレクト信号はbcs_adcx_nです。上表の範囲でアサートされるので、ADCX122ユニット内では、アドレスbadr[3:0]を復号してレジスタを特定しています。このI/Oユニットはバイトアクセス禁止です。必ずワードアクセスしてください。

  I/Oレジスタ仕様:

 実は、XADCマクロの初期動作状態を、XADCマクロの生成画面で設定することができます(※)。現状、連続変換モード、変換チャンネルAIN0およびAIN1、に設定してあります。よってリセット解除後、XADCはバックグラウンドで自動的にAIN0とAIN1を交互に変換し続けています。
 更に、DRP=0(初期値)の状態では、ADCX122ユニットが自動的にXADCマクロの内部レジスタを読み出して、最新の変換結果をadcxain0,adcxain1レジスタに転送するので、リセット解除後の初期状態で使用する限り、ユーザは何もする必要が無い様にしてあります。
 単にadcxain0,adcxain1レジスタを読み出すだけで、最新の変換結果を読み出すことができます。

 裏を返すと、AD変換値を使用しない場合でも、XADCマクロは、ずっと変換し続けています。これは消費電力などの面で不利となります。一方で、常に変換し続けているため、いつでも最新の変換値を読み出すことができるという点で、上述の通りの利便を享受できます。長所は短所の裏返し、と言う事です。

 別なモードへの切り替え、内蔵センサ値の読み出し、変換動作を一時停止、等の方法については、XADCマクロのドキュメント等を参照して、各自設定してください。XADCマクロの動作状態は、XADCレジスタへの書き込みで動的に変更できます。

XADCマクロの生成画面で設定可能なのは、FPGAボードに書き込み直後の初期状態です。起動後、XADCレジスタを書き換えることで、全ての動作状態へ動的に変更することができます。

シミュレーション検証

 Vivadoを使うと、XADCマクロを使ってシミュレーションを実行可能です。
 この時、アナログスティミュラスファイルを用意しておくと、論理シミュレーションでも、XADCを使ったAD変換のシミュレーションが実行可能となります。

アナログスティミュラス

 アナログスティミュラスファイルは、例えば以下の様なテキストファイルです。

  例)アナログスティミュラスファイル

  TIME VAUXP[4] VAUXN[4]
  0 0.10 0
  10 0.20 0
  20 0.50 0
  30 1.00 0
 

 テキストファイル先頭の行は凡例です。最初の列は「TIME」である必要があり、シミュレーション時間[ns]を示します。それ以降の列は任意です。信号名は、XADCマクロのドキュメントに記載のある信号名を使用できます。行内の列は、空白またはタブで区切ります。
 外部入力端子VAUXP[ ]、VAUXN[ ]に関しては、どうやら、0で0x0000、1.0で0xffffと変換される様です。XADCのアナログ入力電圧は0V〜1V範囲なので、これと一致しています。ADCX122ユニットのアナログ入力端子と、XADCマクロのアナログ入力端子の対応は以下となります。

 XADCマクロのアナログ入力は差動入力ですが、Cmod A7ボードでは、VAUXN[ ]側が接地されているので、VAUXN[ ]=0に固定して作成します。上の様な表を、Excelなどを使って作成し、TAB区切りテキストに変換して使います。

 以下に、当方で用意したアナログスティミュラスファイルのサンプルをリンクして、Exelで作成したグラフを示します。

  アナログスティミュラス:adcx_afe.txt

a288_anlgstmu.png

 AIN0(VAUXP[4])は三角波(周期80μs)、AIN1(VAUXP[12])はsin波の絶対値(周期160μs)としました。後ほどシミュレーションで検証しますので、この波形を覚えておいて下さい。

 何か具体的に想定しているアナログ波形がある場合や、Spice等アナログシミュレータの出力データと連携したい場合等には、Excel等のソフトウェアを活用しながら、アナログスティミュラスファイルを作成して適用することができます。

シミュレーション実行

 アナログスティミュラスを準備しておくこと以外、普通のシミュレーションと同じです。アナログスティミュラスをVivadoのプロジェクトに登録しておくと、自動的にシミュレーションディレクトリにコピーして参照してくれます。アナログスティミュラスのファイル名は、XADCマクロの生成画面で指定できます。
 こちらから、Moscoviumマイコンのプロジェクトファイルをダウンロードして、ご確認ください。

 以下、シミュレーションのタイミング図(例)を示します。

a288_drpacc.png

 上図では、メモリバス⇔DRPブリッジを使って、XADCマクロの内部レジスタにアクセスした様子を示しました。
 XADCの内部信号がモニタできないので詳細は不明ですが、上のタイミング図では、アクセス開始(DENアサート)からアクセス終了(DRDYアサート)まで、4サイクルほどかかっています。DRPアクセスは、思った以上に遅かったです。XADCのエンジンはADCCLK=DCLK÷2で動作しているので、遅い理由はADCCLKとの同期化等、色々理由が有りそうですが、詳細は不明です。

 メモリバス⇔DRPブリッジを通してアクセスするのは、手順が面倒な事と、アクセスが遅い事の2点により、必要最小限に抑えて使うべきだと思います。
 XADCマクロは初期設定のままで、AIN0/AIN1チャンネルの連続変換モードに設定してあり、変換終了時(EOS)に変換データを自動的にADCX122内のレジスタadcxain0,adcxain1に転送する機能が働いているため、何も考えず、これらのレジスタ(adcxain0,adcxain1)を使うのが吉です。
 ADCX122のジスタは、普通に1サイクル読み出しができますから。


 DRPE=0の間、XADCマクロから自動的に読み出したデジタル値がadcxain0,adcxain1レジスタに転送されているので、2個のレジスタ値をアナログ波形表示に切り替えたのが下のタイミング図です(GTKWave)。

a288_adcain.png

 リセット解除して回路が動作し始めるまでの期間を除いて、前節で用意したアナログスティミュラスの波形グラフと一致していることが判ります。

 論理シミュレーションで、ここまで検証できました。spice等アナログシミュレータとの協調シミュレーション、とまでは行きませんが、あらかじめ用意したアナログスティミュラスを使って論理シミュレーションを実行することができます。Goodです。

デザイン

 拡張ERAMの時に作成した、外部SRAMコントローラSRAMC512Kユニットを搭載したマイコンNHOC113SR0408に、AD変換器ADCX122ユニットを追加しました。

 Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、Githubで提供します。以下リンクよりアクセスしてください。

btn_moscovium.png

 ダウンロード方法などについては、トップのREADME.mdをご覧ください。

 デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

コンパイル

 Vivadoでのコンパイル(論理合成・配置配線)結果を以下にまとめます。

  コンパイル結果:

 ADCX122ユニットを追加したことで、XADCマクロを1個消費した以外は、追加前のコンパイル結果と大きな相違ありませんでした。

プログラム

 追加したADCX122ユニット(AD変換器)が、動作していることをザっと確認できるよう、AD変換器で電圧値を計測し、その電圧値に応じてオンボードLEDの明るさを変化させるプログラムを作りました。以下に完成プログラムをリンクします。

  完成プログラム:test_adcx.asm


 アセンブルしてMoscoviumマイコンに転送すると、シリアルモニタから以下のコマンドを受け付けています。

  シリアルモニタコマンド仕様:

 すべてデバッグ用のコマンドですので、次節の外部回路を接続する限り、シリアルモニタ無しで自立します。

外付け回路

 ADCX122ユニットのアナログ入力端子(AIN0,AIN1)に印可するアナログ電圧を生成するため、以下の回路を外付けに接続します。

a288_schem.png

 可変抵抗器が手元に1個しか無かったので、一方(AIN1側)をタクトスイッチでトリガするCR回路にしました。可変抵抗器を複数お持ちなら、両方とも可変抵抗器にしてもOKです。
 容量C1の充電側には、時定数R2×C1≒1sが設定されているので、タクトスイッチを押して充電を開始すると、1秒ほどかけてout1の電位がVddレベル近傍まで上昇します。

 また、Cmod A7ボードのアナログ入力端子を使う上で重要な注意点は、「入力インピーダンスが低い」事です。
 Cmod A7ボードのアナログ入力端子は、3.3V電圧を印加できる様に、抵抗分圧回路が搭載されています。アナログ入力端子から、約3.3kΩの抵抗を通ってGNDに落ちているので、入力インピーダンスが低下しています。
 上の回路図で、ボルテージフォロア(オペアンプLM358の回路)を取り払ってout0→ain0、out1→ain1の様に直結した場合、可変抵抗などの回路と、Cmod A7ボード上の抵抗分圧回路が干渉して、意図した電圧が出力できなくなってしまうのです。

 一応、Cmod A7ボードの設計に対して「Good Job」を進呈したのですが、ボルテージフォロアまで載せておいてくれたら、完璧でした。

アナログな実験

 前節の外付け回路をCmod A7ボードと接続して(以下接続表)、こちらのデザイン(NHOC113SR0408)を書き込んだら、実験してみましょう。なお、Moscoviumマイコンの端子配置はこちらです。

Cmod A7ボード
(Moscoviumマイコン)
接続 アナログ電圧
生成回路

GND GND
VU (VBUS、5V) Vcc
VCC3V3 (PMOD) Vdd
adcx_ain0 (15 PIN) ain0
adcx_ain1 (16 PIN) ain1


 以下図に実験中の様子を示し、実験を開始します。

a288_expr.jpg


  実験サンプル:

 可変抵抗器やタクトスイッチに連動して、LEDの明るさが変化しましたか?当方の実験風景を以下動画にしておきました。



 XADCマクロがAD変換器として機能していること、くらいは確認できましたね。
 変換精度などが重要なアプリケーションを作る場合には、少なくとも、こちらの様に簡易的な精度評価を実施して、XADCマクロの実力を確かめておくことを推奨します。


 Cmod A7ボードに搭載されたArtix-7ファミリFPGAのXADCマクロは、しっかりとしたAD変換器ユニットとして単体で使用できる仕様だったので、大分楽をすることができました。ショボい中華製🚱Primerボードとは、違うのだよ、フフッ。


btn_arduino.png

btn_prev.png btn_next.png

home