今回は、Cmod A7ボード(FPGA)に搭載された、Xilinx Artix-7ファミリXC7A35TチップのXADCマクロ(AD変換器ハードマクロ)を使うテーマです。
XADCマクロの調査から始めましょう。
XADCマクロのドキュメントを検索(別ウインドウが開きます)
Xilinx社のサイトから、「UG480(ユーザガイド#480)」というドキュメントが見つかるはずです。
さて、過去の話をしますが、Primerボード(中華製FPGA)のAD変換器ハードマクロは、生の逐次比較型AD変換器エンジンでした。以下記事を参照して見てください。
「#19-5 FPGAボードのAD変換器を使う」
「#19-6 FPGAボードのAD変換器を使う(2)」
Primerボードのハードマクロは単なるAD変換器エンジンだったので、周辺にチャンネル選択や連続変換などの回路を追加しないと、まともに使える「AD変換器ユニット」に昇華できませんでした。→ ADC124ユニット。
PrimerボードのAD変換器マクロと比べてXADCマクロは、単体で立派なI/Oユニットとして成立できる機能を有しています。先ほど検索したドキュメントから、ざっとまとめてみると、以下の通りです。
XADCマクロの特長:
※XADCドキュメント(Xilinx UG480)から引用。
つまり、回路の追加無しに「そのまま」、「AD変換器ユニット」として使用可能なハードマクロです。
XADCマクロは、Vivadoの「Flow Navigatorサブウインドウ ⇒ PROJECT MANAGER ⇒ IP Catalog」から「adc」等で検索すると見つかる、「XADC Wizard」を実行すると生成することができます。
XADCマクロのアナログ信号インターフェイスは、以下の様になっています。
Cmod A7ボードとしては、アナログ入力16本の内、2本だけが、ピンヘッダに引き出されています。詳しくは、Digilent社のCmod A7リファレンスマニュアルページを参照してください(以下リンク)。
Cmod A7ボードのアナログ入力ページ(別ウインドウが開きます)
上のリンク先ページで判る様に、Cmod A7ボード上の回路で、抵抗分圧回路によって3.3Vアナログ電圧をAD変換できるようになっています。また、差動入力のVN側が接地(GNDに接続)されているので、通常の単極入力として使用できます。
デジタルI/Oポートが3.3Vの所に、「アナログ入力だけ1V定格」とか言われても使い勝手が悪いため、抵抗分圧回路を搭載してくれたCmod A7ボードの設計者さんには、「Good Job👍」進呈したいと思います。
Vivadoを使ってXADCマクロを生成すると、Cmod A7ボードでピンヘッダに引き出された2組のアナログ端子(Vaux4,Vaux12)以外に、どうしても、Vp_Vnという端子がくっついてきてしまいます(下図)。
Vp_Vn端子(1組、2本)に関しては、Cmod A7サポートページからダウンロードできるサンプルプロジェクト(「Cmod A7 XADC Demo」)と同様に処置しておきました。
処置:
深追いは、していませんが、具体的な端子へ割り付けしないものの、Vivadoでコンパイル(論理合成・配置配線)を実行すると、自動的に適切な端子に割り当てられたようです。
Cmod A7のピンヘッダに引き出された2本のアナログ入力に関しては、以下の通りFPGA端子に割り当てする行を制約ファイル(mcoc_constr.xdc)に追加します。
## Analog XADC Pins
set_property -dict {PACKAGE_PIN G2 IOSTANDARD LVCMOS33} [get_ports adcx_ain0n]
set_property -dict {PACKAGE_PIN G3 IOSTANDARD LVCMOS33} [get_ports adcx_ain0p]
set_property -dict {PACKAGE_PIN J2 IOSTANDARD LVCMOS33} [get_ports adcx_ain1n]
set_property -dict {PACKAGE_PIN H2 IOSTANDARD LVCMOS33} [get_ports adcx_ain1p]
※差動入力のため、アナログ入力2本に対して、端子数は4本(2組)です。
Moscoviumマイコンの端子配置は、こちらを参照してください。
デジタル側のインターフェイスは、DRP(Dynamic Reconfiguration Port)という仕様に準じています。恐らく、Xilinx社の独自仕様(?)だと、思われます。
DRPインターフェイス仕様:
※DRPでアクセスするXADCレジスタの仕様については、当方では関知しないので、XADCマクロのドキュメントを参照してください。
XADCマクロには、16ビット×128個分のレジスタ領域があります。未定義のアドレスがいくつか有りますが、差し引いても100個近い16ビットレジスタが存在します。これだけのレジスタで制御しなくてはならないのですから、XADCマクロは相応に高機能なAD変換器ユニットである、と言えるでしょう。
その他、XADCマクロとしてのインターフェイス信号で、使いそうな所だけ、以下に解説しておきます。
その他インターフェイス:(使いそうな所だけ)
基本的にXADCマクロ単体で、立派な「AD変換器ユニット」として完成しているため、インターフェイスとしては簡素です。
DRPインターフェイスは一種のバス仕様なので、DRPインターフェイスに対応したバスステートコントローラが有れば、接続したら終了です。しかし、Moscoviumが採用したバス仕様はメモリバスなので、合いません。そのまま接続することはできないのです。
以下の様な課題もあります。
以上の事から、XADCレジスタ領域をMoscoviumのI/Oレジスタ領域に直接マッピングする(割り当てる)事には、ためらいが有りました。そこで、メモリバス⇔DRPブリッジを作ってインターフェイスする事に決定します。
メモリバス⇔DRPブリッジ目標仕様:
メモリバス⇔DRPブリッジを通してXADCレジスタへアクセスするには、上に示した目標仕様の通り複数の手順が必要となって面倒です。一方で、大量のXADCレジスタ領域全体に対して、たった5個の16ビットレジスタでアクセス可能となります。これでXADCマクロの全機能を制御できるので、短所よりも長所の方が上回っている、と考えました。
Moscoviumは、fCPU=24MHzクロックで動作します。DRPインターフェイスのクロックDCLKにも、24MHzクロックを接続しています。従って、DRPアクセスは24MHzです。ここまではOKですね。
これとは別に、XADCマクロ内のAD変換器エンジンが動作するためのクロック、ADCCLKが存在します。ADCCLKの周波数は最大26MHzかつ、DCLKから1/2以下に分周されたクロックとなります。つまり、fCPU=24MHzのMoscoviumでは、どう頑張っても以下に示す周波数以上に設定することができません。
う〜ん、致し方なし、かな……。最大性能では、ADCCLK=26MHzの場合に変換時間1μsの高速AD変換器なのですけれどもね。
Primerボードの時は、PLLで最適なクロックを作って、アナログフロントエンドとロジック回路との間を非同期設計してまで、パフォーマンスを最大限引き出せるようにして使っていました(「#19-5 FPGAボードのAD変換器を使う」)。
Primerボードの時もそうでしたが、高速なAD変換が必要なアプリケーションが思い当たらず、「2.17μsで変換できるならば十分」だと判断したので、XADCマクロの最大変換周波数ADCCLK=26MHzに対して、1/2以下の速度に低下してしまいますが、ADCCLK=12MHzを許容することとしました。
前節で解説した通り、メモリバス⇔DRPブリッジを使ったXADCレジスタアクセスは、XADCマクロの全機能にアクセス可能な代わりに、アクセス手順が複雑と言う短所がありました。対策として、ハードウェア面とソフトウェア面の両面から、以下の通り対処することとします。
対策:
恐らく、DRPを通してXADCマクロのレジスタ設定をしなくてはならない状況は、最初の起動時くらいな物です。
初期設定は、2本のアナログ入力を交互に変換し続けるモードになっているため、初期値のまま使うのであれば、一度もDRPアクセスを実行する必要が無いほどです。
その程度であれば、多少の面倒は許容できるし、上の対策で十分だと判断いたしました。
切りが良いので今回は、ここまでです。次回、具体的な回路設計、シミュレーション検証を経て、実機(FPGA)での動作実験まで到達します。