7シリーズFPGAでの非同期クロック切り替え

注文済みの基板の到着を待つ間に、FPGAデザインの修正を行いました。

ADCにつながる信号線のピン配置を変更しても良かったのですが、今回の基板は、前回とは異なるコネクタに装着することになります。 つまり、新旧二つの基板を、同時に一つのZ-turn boardに装着することができます。 それで、Z-turn board上に実装されているディップスイッチで、どちらの基板からの信号を処理するかを変更できるようにしました。

FPGAの大きさとしては、両方の基板からのADCデータを同時に処理することも可能です。 でも、そこまでする必要性を今は感じません。それで、FM処理回路自体は1つだけで、当該回路にどちらの基板から信号を供給するかを、スイッチで切り替えるという算段です。

それで、ひとまず想定した実装を行って、既存基板で動作することを確認しようとしたら、どうにも動作しませんでした。 調べてみたところ、MMCMのlocked信号がHighになっていない。つまり、基板からの40MHzのクロックがちゃんと切り替えられていない。

結果として、次のようにすることで解決できました。

BUFGCTRL bufg_inst (  // use as asynchronous MUX
    .IGNORE0    (1'b1),
    .IGNORE1    (1'b1),
    .CE0        (1'b1),
    .CE1        (1'b1),
    .S0         (!SW[2]),
    .S1         (SW[2]),
    .I1         (w_adc_ck_bufg),
    .I0         (w_adc_ck_b_bufg),
    .O          (w_adck)
);

最初はBUFGMUX_CTRLを使用していましたが、それが原因でした。UG472をよく読んでみると、 BUFGMUX_CTRLは基本的には、どちらの入力クロックも常時トグルしている場合に使用することが前提となることが分かりました。

それだと、場合によって(必要な要件によって)は当然困った事態になりますので、ちゃんと回避方法が準備されています。 それが、BUFGCTRLのIGNOREピンです。IGNORE0をHighにすると、I0ピンのクロックからI1ピンへのクロックの切り替えが(クロックの変化を待たず)即時に行われます。IGNORE1をHighにすると、I1ピンからI0ピンへのクロック切り替えが即時に行われます。

というわけで、上記のように記述することで、現在のように片方の基板が接続されていない(したがってI0がずっとLow)場合でも、 SW[2]の切り替えに応じてクロック選択が可能になりました。

7シリーズFPGAのBUFMRを有効活用する

Xilinxの7シリーズFPGAを使用していると、Implementation時にCLOCK_DEDICATED_ROUTE=BACKBONEを設定しないと他のクロックリージョンのCMTを駆動できないよ、といったエラーが出ることがあります。

多くの場合、下図(Kintex-7 160T)を例とすると、Bank15とBank14のCMTを同一のクロックで駆動しようとしたときに、このエラーが発生します。

“Clock Region”

このような場合、もちろんメッセージに従ってCLOCK_DEDICATED_ROUTE=BACKBONEを指定することも可能ですが、 “その場合は最適ではないよ(sub-optimal)“といった怪しい内容を承諾することになります。

でも実は、それ以外にもあまり知られていない(かもしれない)逃げ道があるのです。

それはBUFMRを使用することです。BUFMRは、入力されたバンクの上下も駆動できます。 例えば、上図でBank15(のMRCCピン)に入力されたクロックは、Bank16, Bank14のCMTを駆動することができます。

それで、MRCC pin->BUFMR->BUFR->CMTというように接続すれば、Bank15に入力されたクロックでBank14-16のCMTをエラー無く駆動することができます。

SRCCにクロックが入力されていた場合は… 残念ですが、CLOCK_DEDICATED_ROUTE=BACKBONEを指定してください。

ADC基板の電源測定

オシロスコープを入手したので、早速電源のノイズをみてみました。

ノイズ測定をするにあたって、正確な測定のためには、GNDクリップは使用しないで、 直近のGNDで測定しないと意味がないようですが、ノイズの大きさの傾向だけはつかめるかと思いました。

Z-turn boardから送られてくる3.3V電源。これはスイッチング電源の出力です。

上記電源がFBを通過した後の様子

相当ノイズは減っているように見受けられます。

次に、LDO出力の3.0V(上の二枚と異なり、垂直軸が10mVレンジなのに注意)

上記がFBを通過した後の様子

スイッチング電源ではないのでFBはいらなかったかもしれません。

いずれにしても、LDO出力のノイズが大きすぎるような気がします。 全くノイズが減少しているように見受けられません。

急ぎで製作してしまったので、LDOの推奨レイアウトのようにベタにしなかったのがまずかったのか、 それともそのほかの理由があるのか検討しないといけませんね。

2017/7/28 追記: 今になって分かったのですが、LDOは一般的に数百kHz以上のノイズについてはほとんどフィルタの役割を果たしません。そういった周波数帯のノイズを除去したいのであれば、ちゃんとしたフィルタを通す必要があります。 上記の結果はそれを確認していることになります。

また、LDOでできるだけノイズを除去したいのであれば、ドロップアウト電圧も1V以上とることが推奨されるようです。 あまりにドロップアウト電圧が小さいと、ノイズ除去能力も低減します。

上記のような内容は、LDOのデータシートをよーく読めばわかります。また、LDOに使用されているオペアンプの特性からしても、 高周波のノイズ除去はできないのは明らかそうです。

SiglentのDSOを購入

FMステレオ復調のところは、時間が無くて取り組めていません。

その間に、基板の性能の方を調べて見たくなり、いろいろとオシロスコープを物色しました。

最初はTektronixの中古をヤフオクなどで落とそうかと思ったのですが、最終的には新品を購入してしまいました。

大体100MHzの帯域が測定できる必要があります。それと、FFTも欲しいです。 安くて確実そうなのはRIGOLのDS1054Zかと思いましたが、 最終候補になったのは、HantekのDSO5102Bと、 SiglentのSDS1202X-Eでした。 前者は大体339USD, 後者は379USD程度です。

SDS1202X-Eは、I2C, SPI, UART, CANなどの信号のデコード機能も持っているのが優位点でした。 また、SDS1202X-Eの方が新しいです。こちらによると、Zynqの7020を使用しているようです。

結局、SDS1202X-Eを購入しました。最初はAmazon.comから買おうかと思いましたが、 調べてみたらAliExpressにて送料無料で購入できることがわかり、 そちらに出店していたSains Electronix Storeから購入しました。 6/15(木)の夜に注文して、6/19(月)には到着しました。早いです。

(2019/1/12現在、日本のAmazonからも購入できるみたいです)

注文したら、すぐにお店から、“USコードを選択していたけど、EUコードしか在庫がないんだよ。 USコードは2週間待ちなんだけど、EUコードで送っても良いかい? (意訳)“という内容のメッセージが届きました。 “いやいや、待っても良いからUSコードでお願い。でもできるだけ早くね! (意訳)“と返しました。 そうしたら翌日6/16(金)には発送のお知らせが来たので、まさかEUコードが添付されているのではないか、 とはらはらしましたが、到着した商品を確認したら、ちゃんとUSコードが添付されていました。

うっかりしていたのは、このコードは3ピンタイプだったので、家にある電源プラグに接続するために変換プラグを購入する必要がありました。こういうやつですね。 あるいは3ピン2ピンケーブルでも良いですね。

AliExpressは初めて使いましたが、楽天のように店舗によって対応がまちまちのようです。 今回使用した店舗は迅速で満足でした。Web上での評価も高いようです。梱包も問題ありませんでした。

“同梱物”

当たり前ですが、プローブが2本ついています。写っていませんが、USBケーブルも添付されていました。

“SDS1202X-E”

オシロ本体です。とりあず、電源を入れてプローブ補正だけしました。

早速ADC基板を少し測定してみました。 基板に電源は投入せずに、FMアンテナを接続して、BPFの後の個所にプローブを当て、FFTをしてみた結果が次になります。 ちなみに、GNDは基板上に立てたピンでとっているので、あまり良くないかもしれません。

“BPF後のFFT”

そういえば、画面キャプチャも本体でできるはずですね。わざわざ撮影する必要は無かったですね。

それは置いておいて、上の画面では84.7MHz近辺を拡大しています。Y軸の単位はdBVrmsになっています。 大体20dB位は信号が出ているようですね。

問題は、電源を投入した時の様子です。順次調べていこうと思います。

Artix-7でのMIGエラー

とある基板を製作するにあたり、Artix-7にてDDR3のピン配置がどうなるか確認したいと 思い、MIG(Memory Interface Generator)にてDDR3コントローラを作ってみました。 IP IntegratorにてAdd IPにてMIGを追加し、ダブルクリックして所望の設定をしていきました。 最後にGenerateボタンで完了!

…と思ったら、Artix-7 MIG DDR3 fails to generate custom UI と同じ症状が発生して、生成に失敗します。

リンク先の情報によれば、Windows8、またVivado 2015.3では修正予定とあります。 質問した方はWindows8はやめてWindows7で動かすことにしているようです。

私が問題に遭遇した環境は、Windows10 Proです。しかもVivado 2016.4 / 2017.1どちらでも同じエラーが出てしまいます。 実際、リンク先の最後(2017/2/1付)の投稿を見ると、Windows10/Vivado 2016.4で同じエラーが出ている方がいるようです。

Xilinxのツールの質の低さには辟易しますね。デバイスの特性はIntel(旧Altera)より良いと思っているのですが、 これではぶち壊しです。

« 2/7 »