前回に引き続き、Cmod A7ボード(FPGA)に搭載された、Xilinx Artix-7ファミリXC7A35TチップのXADCマクロ(AD変換器ハードマクロ)を使うテーマです。
早速、具体的に回路の設計を進めて行きます。
ここへ至るまでの調査及び考察によって、XADCマクロは「AD変換器ユニット」として完成されていて、そのまま使用可能だと判りました。ただ、Moscoviumのメモリバスに合わせて、XADCマクロのDRPインターフェイスとの間を変換する、メモリバス⇔DRPブリッジが必要なことも判りました。
ADCX122ユニットは、「ADC」という名前は付いていますが、DRPインターフェイスのXADCマクロをMoscoviumのメモリバスへ接続するための、ただのバス仕様変換器(bridge)です。以下にブロック図を示します。
※薄黄色の箱はCPUからアクセス可能なI/Oレジスタ、薄緑色の箱はハードマクロ、青破線はRTLとハードマクロの境界線です。
上図に示した通り、Moscoviumからは単なるメモリバス接続のI/Oレジスタ×7個に見えます。
DRPインターフェイスを通して、128個×16ビット=256バイトのXADCマクロ内レジスタにアクセスすることができます。ADCX122ユニットで制御するのは、XADCレジスタへのアクセス方法のみです。XADCレジスタを設定して、XADCマクロを制御する方法については、XADCマクロのドキュメントを参照してください。
以下に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区切りテキストに変換して使います。
以下に、当方で用意したアナログスティミュラスファイルのサンプルをリンクして、Excelで作成したグラフを示します。
アナログスティミュラス:adcx_afe.txt
AIN0(VAUXP[4])は三角波(周期80μs)、AIN1(VAUXP[12])はsin波の絶対値(周期160μs)としました。後ほどシミュレーションで検証しますので、この波形を覚えておいてください。
何か具体的に想定しているアナログ波形がある場合や、Spice等アナログシミュレータの出力データと連携したい場合等には、Excel等のソフトウェアを活用しながら、アナログスティミュラスファイルを作成して適用することができます。
アナログスティミュラスを準備しておくこと以外、普通のシミュレーションと同じです。アナログスティミュラスをVivadoのプロジェクトに登録しておくと、自動的にシミュレーションディレクトリにコピーして参照してくれます。アナログスティミュラスのファイル名は、XADCマクロの生成画面で指定できます。
こちらから、Moscoviumマイコンのプロジェクトファイルをダウンロードして、ご確認ください。
以下、シミュレーションのタイミング図(例)を示します。
上図では、メモリバス⇔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)。
リセット解除して回路が動作し始めるまでの期間を除いて、前節で用意したアナログスティミュラスの波形グラフと一致していることが判ります。
論理シミュレーションで、ここまで検証できました。spice等アナログシミュレータとの協調シミュレーション、とまでは行きませんが、あらかじめ用意したアナログスティミュラスを使って論理シミュレーションを実行することができます。Goodです。
拡張RAM(E-RAM)の時に作成した、外部SRAMコントローラSRAMC512Kユニットを搭載したマイコンNHOC113SR0408に、AD変換器ADCX122ユニットを追加しました。
Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。
ダウンロード方法などについては、トップのREADME.mdをご覧ください。
デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
Vivadoでのコンパイル(論理合成・配置配線)結果を以下にまとめます。
コンパイル結果:
ADCX122ユニットを追加したことで、XADCマクロを1個消費した以外は、追加前のコンパイル結果と大きな相違ありませんでした。
追加したADCX122ユニット(AD変換器)が、動作していることをザっと確認できるよう、AD変換器で電圧値を計測し、その電圧値に応じてオンボードLEDの明るさを変化させるプログラムを作りました。以下に完成プログラムをリンクします。
完成プログラム:test_adcx.asm
アセンブルしてMoscoviumマイコンに転送すると、シリアルモニタから以下のコマンドを受け付けています。
シリアルモニタコマンド仕様:
すべてデバッグ用のコマンドですので、次節の外部回路を接続する限り、シリアルモニタ無しで自立します。
ADCX122ユニットのアナログ入力端子(AIN0,AIN1)に印可するアナログ電圧を生成するため、以下の回路を外付けに接続します。
可変抵抗器が手元に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 |
以下図に実験中の様子を示し、実験を開始します。
実験サンプル:
可変抵抗器やタクトスイッチに連動して、LEDの明るさが変化しましたか?当方の実験風景を以下動画にしておきました。
XADCマクロがAD変換器として機能していること、くらいは確認できましたね。
変換精度などが重要なアプリケーションを作る場合には、少なくとも、こちらの様に簡易的な精度評価を実施して、XADCマクロの実力を確かめておくことを推奨します。
Cmod A7ボードに搭載されたArtix-7ファミリFPGAのXADCマクロは、しっかりとしたAD変換器ユニットとして単体で使用できる仕様だったので、大分楽をすることができました。ショボい中華製🚱Primerボードとは、違うのだよ、フフッ。