2021.11.23

96倍速の等価時間サンプリング

100MHzクラスのADCを使って、GHzクラスのADCを作る方法を研究しています。

入力波形が繰り返し波形の場合にだけ使える方法なのですが、周期的に繰り返す波形に対してサンプリングする時間を少しずつずらしてサンプリングすると、等価的にサンプリング速度を上げることができます。

例えば、80MHzでサンプリングするとサンプリング手記は12.5nsですが、2回目のサンプリングで12.5ns/6=2.083nsずらしてサンプリングを開始できれば、等価的にサンプリング周波数が6倍に上がったことになります。

Eqsampl

こういうやり方を等価時間サンプリングといいますが、ようやくCosmo-ZのFPGAで長時間のサンプリングを安定かつ、タイミングを正確にコントロールすることができるようになりました。

 

原理は簡単です。XILINXのMMCMにはPhase Shiftという機能があって、この機能を使うと出力するクロックの位相を少しだけずらすことができます。どのくらいの精度で位相をずらすことができるかというと、実はMMCMってすごいんです。

なんと、位相コントロールの1単位が1/(56×fVCO)なのです。ここで、fvcoというのはVCOの周波数です。

例えば、クロック80MHzを出力するMMCMの中身が960MHzで動いているとき、Phase Shiftを行うと、1/960MHz/56=18.6psだけクロックの位相をずらすことができます。

Phase_shift

すべてのXILINX FPGAに備わっていて誰もが気にせず使っているMMCMは、実は10ピコ秒のオーダーで遅延をコントロールできるという超すごいプリミティブだったのです。

さて、ADCのクロックが80MHzで、それを作るためのVCOが960MHzで動いているならば、672回のPhase Shiftでクロックの位相が360°回ることになります。これを96回にわけて行うことで、約130psずつADCのタイミングを動かしながら96倍速のサンプリングすることができるというわけです。

実験してみましょう。

まず、FPGAで50nsの矩形波を作り、ADCでサンプリングした波形が下の図のものです。

Eqs96_1

80MHz(12.5ns)でサンプリングしているので50nsの幅があるのですが4個分しか高い電圧レベルになっていません。

ここで等価サンプリングをONにしますと、上の波形が次の図のように超高解像になります。

Eqs96_2

立ち上がりの部分を拡大してみると、サンプリングポイントが見えてきます。

Eqs96_3

1つ1つのサンプリングポイントの間隔が約130psであることがわかります。元々が12.5nsのサンプリング間隔なので96倍に高速化されました。

使用しているADCのサンプリングクロックは最大125MHzなのですが、等価的に毎秒7.6GサンプリングのADCになりました。しかも、1回の波形をサンプリングするのに1秒もかかりません。

ADCの帯域とアナログフロントエンドの帯域は650MHz程度で、ADCのアパーチャ時間は1nsなので帯域的には全然足りていないはずですが、1つ1つのサンプリング点は単調増加しているので、LPFの効果で少しなまっているとはいえ各ポイントのデータは意味があります。

現時点では、FPGAからパルスを出して何かにぶつけて反射や減衰を超高速に等価サンプリングで見るという使い方、つまり信号の反射の形を見るTDRみたいなことしかできません。

これに外部トリガと外部クロックが使えるようになれば、応用範囲が広がっていくと思います。

 

| | コメント (0)

2021.11.21

等価サンプリングを別のCosmo-Zで試す

高速ADCの前のアナログフロントエンドを改良してアナログ周波数帯域を伸ばしたCosom-Zで、等価サンプリングの実験を行ってみました。帯域は600MHz~1GHzくらいまで伸びているはずです。

まずディジタルでパルスを作り、LVCMOS18の信号としてFPGAの外に出し、抵抗で減衰させたあとアナログ入力で取り込みます。また、適当な終端抵抗をつないで反射を少なくします。

 

今回使用したCosmo-Zの2つの水晶のクロックの周波数差は4ppm。

信号の等価的なサンプリング速度は最大で2.5GHzで、等価サンプリング間隔は400psでした。

Eqs11

ずれが4ppmだと25倍速まで可能・・・なんだか法則が見えてきました。100÷周波数差[ppm]が最大の倍率になるのでしょう。

波形の全体を見てみると、矩形波の反射まで見えますね。

Eqs10

信号の立ち上がり時間は約1.8nsと測定することもできました。

 

繰り返し波形を長い周期でサンプリングして、送信周波数と受信周波数のわずかな差を利用して波形を再構成するという等価サンプリング方法は、周波数の差が小さいほど倍率が高くなることがわかりました。これだと偶然に左右されてしまうので、確実性がないこともわかってきました。

 

 

 

| | コメント (0)

2021.11.20

鋭いパルスを作る回路

信号の反射等を見るために、立ち上がりの鋭いパルスを作る方法を検討しています。

おそらく世の中にあるICの中で一番簡単に取り扱えて、かつ、立ち上がりの速い信号が出せるものってFPGAのI/Oだと思うのですが、今回は同軸ケーブルをドライブするので、FPGAのI/Oから直接取り出して壊れたら嫌です。何か別の方法を考えています。

ディジタル信号のバッファICというと、74LVTシリーズとか245とかを思いつきますが、適当なICをいくつか選んでデータシートを読んでみると74ABTは立ち上がりが3nsくらいで、ALVTが1.8nsくらいなので、1~3nsくらいが74シリーズの限界といったところなのでしょう。

他の方法をいくつか考えてみます。

ADCLK914

まずはクロックドライバというICを使う方法。例えばADCLK914は100psのrise/fall Timeを実現しています。

Adclk914

やはり近代的なICは違いますね。一気に20倍の速さです。ただ、クロックドライバというと中にPLLを持ったりしているものもあるので、単発のパルスを通せるかどうかは要検討です。

こういう高速なICは信号のLレベルが0Vではなく差動信号で出ています。ADCLK914を3.3Vで動作させる場合はH/L出力の電圧は2.9V/1.0Vくらいになるようです。つまり、LVDSでADCLK914にパルスを入れたとすると、Lのときに0Vにまで落ちません。

Adclk914_wave

また、クロックドライバというICは本来は基板上で使うものなので同軸ケーブルを駆動するのはちょっと不安があります。

 

ADCMP553

次は高速コンパレータを使う方法です。ADCMP551~553というのがあります。型番によって中に入っているコンパレータの数が違います。

Adcmp551

使い方はコンパレータで、-の端子にリファレンス電圧を入れておいてもよいし、LVDSを使って駆動してもよいと思います。

Adcmp553_wave

3.3Vで動作しRise,Fall Timeは0.5nsくらいです。

PECL、CML、LVDSについて

このような高速のICになるとPECLとかLVPECLやCMLという名前を聞くようになってきます。LVDSが1.25V付近でこちょこちょ動いているのに対してPECLは3.5V付近で、LVPECLは2V付近で動きます。CMLは各社それぞれです。

回路的にはCMLは差動増幅器で出来ていて下の図のような構造をしています。下の図はバイポーラトランジスタで描いていますがMOSFETでも作ることができます。CMLではトランジスタを非飽和領域で動かすため高速動作が可能です。

Cml_circuit

LVDSはCMLと似ていますが、負荷がMOSFETになって3.5mAの定電流で駆動されています。

Lvds

CMLの出力にエミッタフォロアが付いているのがPECL/LVPECLです。

Lvpecl

速度はLVDS<PECL<CMLなので、高速な信号を出したいならばCMLが一番速いということになります。LVPECLでは出力を終端電圧VTTにひっぱるための終端抵抗が必要で、VTTはVCC-2Vとされています。

ただ、CMLは信号電圧が各社で統一が取れていないのが困りもので、振幅はあまり大きくありません。

 

SN65CML100D

最後はLVDS→CML変換ICを使う方法です。

Sn65

こんな普通の8ピンSOPで高速ICっぽくない見た目なのですが、意外とすごいのです。使い方は簡単でA-BにLVDSまたはPECLまたはCMLのロジック信号を入れると、YとZからCMLロジックで出てくるというものです。

Sn65_2

データシートに記載されている波形は

Sn65_3

となります。差動信号をCMLに変換するだけではなくて、AにシングルエンドのPECL信号を入れて差動信号のCMLに変換するという使い方もできます。

Rise/Fall Timeは300psと最初の2つのものと比べると遅いのですが、速いものが必要であれば同じピン配置で70psのOnsemiのNB6L16DGというのもあります。

また、SN65CML100Dは1.8V電源で動くというのもメリットです。Hの出力は約1.8V、Lの出力は約1.0Vになります。

 

LVCMOSなどのシングルエンドのロジックICだと2nsくらいが限界で、それより速くするならばCML出力のロジックICやコンパレータを使えばよいということです。

なお、こういったICの中身を理解しようとシミュレーションを行って、似たようなものをトランジスタで作れないかを検討しているのですが、まだうまくいっていません。

Cml

なお、ケーブルドライバ用のDS15BA101という専用のICがあるようなのですが、このICについては今度検討することにします。

| | コメント (0)

2021.11.19

等価サンプリングの一般化

高速ADCを使った等価サンプリング回路を作っています。

ADCのサンプリング周期がTだとすると、ある時刻にADCでサンプリングした後の2回目のサンプリングタイミングは2Tです。3回目は3T・・・となっていきます。

ここで、10000Tで1周するような周期的な波形を考えます。ただし、10000Tぴったりで一周するのではなく、信号源の周波数とADCの周波数が少しだけずれていて、10000.14Tで一周するとします。

すると、2周目の最初の時刻は10000.14Tになります。3周目は20000.28Tになります。

 

Eqs_20211123194301

この信号が周期10000Tで一周する信号であれば、サンプリング周期よりも短い0.14Tという刻みで信号を測定することができるようになるはずです。

実際にこのようなプログラムを組む時に2週目はどれだけずれるから・・と考えてn番目のデータは時刻何nsに相当するのかというプログラムを組もうとすると非常にややこしかったのですが、C#のListとSortを使って並べ替えをすることで非常に楽にできました。

まず、時刻とデータの組となるクラスを作ります。

public class EqSamplingTime
{
public Int64 time;
public ushort data;
public EqSamplingTime(ushort data,Int64 time)
{
this.time = time;
this.data = data;
}
};

そして、このクラスのリストを作り、サンプリングしたデータを次々と登録していきます。

List<EqSamplingTime> est = new List<EqSamplingTime>();
for(int i=0;i< K * 10000; i++){
est.Add(new EqSamplingTime(buf[i], (Int64)((sampling_period * i) % 100000000)));
}

そして、最後に

est.Sort((a, b) => (a.time == b.time) ? 0 : ((a.time > b.time) ? 1 : -1));

で一発で時刻どおりに並べ替えてソートです。

実際にやってみましょう。

まずは1倍サンプリングです。

Eqs1

100MHzでサンプリングしているので、サンプリング間隔は10nsです。

次は2周分の波形を合成します。細かい部分が約1.5nsとなりました。

Eqs2

次は3周分

Eqs3

次は4周分を合成。

Eqs4

5周分

Eqs5

6周期

Eqs6

7周期でほぼ点がつながりました。

今回は送信側周波数と受信側周波数が14ppmずれていて、10000ポイントのサンプリングなので7周期ということになるのでしょう。このへんの計算は割り算したりあまりを取ったりということでややこしいです。

Eqs7

7回でほぼ一周するので、サンプリング周波数は等価的に700MHzになりました。

 

8周期目になると最初の点と8回目の点が非常に近くなるので、

Eqs8

等価的に時間差は200ps前後になります。

Eqs8s

これでサンプリング周波数が5GHzになったかというと、そうではなくて、誤差の積み重なり(計算アルゴリズムの間違いかも)によって波形がガタガタになります。

Eqs24

 

今回は、信号を送信する波形のクロック周波数と受信するクロック周波数が14ppmずれていて、7倍の等価サンプリングが可能でした。

この周波数のずれ小さいほど高い倍率での等価サンプリングが可能になります。水晶の温度が変わったりすると倍率も変わってくるので、ある意味、運任せといえます。

 

| | コメント (0)

2021.11.18

ET/IoT 2021に行ってきました

ET/IoTに行ってきました。

XILINXもIntelもなく、ルネサスもなく、FPGAボードをメインにした会社もなく、JTAGもなく、過去最小規模で開催という感じでした。

うーん、何を展示していたんだろう!?💦

まぁ、ETの展示会って夏ごろに募集しているので、開催できたこと自体が凄いことだと思います。状況によっては開催直前に中止ということだって十分にあり得たので、出展を決意された各社様は本当に大変だったと思います。

いつでも簡単に撤収できるようにするためなのか、造形物や装飾を作らず、各社ブースも地味だったような気がします。

 

戦利品っていうか(戦ったわけではないのですが)、ある商社さんのブースでこんなものをいただきました。

Maxim1

MaximのICのサンプルです。

Maxim2

例年はVIP証を呈示すると裏の秘密の扉から秘密のエレベータを案内されて、秘密の小部屋でコーヒーとお菓子が出てきたのですが、会場の隅っこでペットボトルのお茶を渡される形に変更されていました。ペットボトルを飲んでも仕方がないので近寄らず。

また、2日目の木曜日の後はETフェスタといって会場で飲み会が開催されるのですが、今年は当然ながらそれもナシ。

 

展示会後に@windy_ponさん、@cinimlさんとお食事をして帰ったのが良い思い出となりました。

 

| | コメント (0)

2021.11.17

タカチのケースにインクジェット印刷を施した

Pocket JTAG Cableはタカチのプラスチックケースをカスタム加工品で特注して作っています。在庫が減ってきたので次のロットを作ろうとしたのですが、せっかくなのでカスタム加工にインクジェット印刷をやってみようと思った次第です。

従来はカスタムで加工だけしてもらった白いケースにシールを貼って作っていました。その写真を↓に掲載します。上のシールは専門の業者でつくったもので耐UVのラミネート加工付きで、下のはアクセアさんで透明シートにインクジェットしたもの。

Pkjcase1

下のほうが薄くていいのですが印刷のムラが少し目立ちます。UVラミネートのほうはどんなに擦っても印刷が消えることはないと思いますが、ちょっと厚くなるのが難点でした。

 

さて、今後のPocket JTAG Cableをどうするかということですが、毎回毎回シールを貼るのも大変だし、曲がるし、指紋も付くのでやっぱりインクジェットにしたいなと思い、8月上旬にタカチのカスタム加工に依頼していたのです。それが3か月たってようやく届きました。おそらくタカチさんにも忘れられてしまっていたのでしょう。

Pkjcase2

手に持った感触などはとてもいいです。まるで製品みたいです。(ぉぃ

ケース表面の微細な凸凹の中にインクが入り込んでいるので、使い込んでインクが薄くなることはあっても、凸凹の奥まではこすれないので消えることはないでしょう。

Pkjcase3

いままでシールを貼っていたのがちょっと恥ずかしいなと思っていたのですが、これなら恥ずかしくありません!

タカチのインクジェット、素晴らしい。

これからもどんどん活用していきたいですね。

| | コメント (0)

2021.11.16

BNCコネクタを8個並べるアルミ筐体

アルミ筐体のパネルにBNCコネクタを8個並べるだけだったのに、こんなに苦労するとは思っていませんでした。

ようやく、8個のBNCコネクタを並べることができました。

 

前に作った筐体がこちら。

一見すると綺麗にできています。

Bnc1

BNCのコネクタはJACK-JACKの中継アダプタで、こちらのもの、

31220

しかし、BNCのナット同士が干渉して、ナットを締めることができませんでした。

Bnc2

やはり普通のBNCコネクタを使おうと思い、秋月の絶縁型BNCコネクタを買ってきたのですが、直径12.95mmのかまぼこ型の穴が大きすぎて固定できませんでした。

Akibnc

BNCの穴は直径9.5mmの穴をかまぼこにするのがデファクトスタンダードのようで、他のどのBNCコネクタも、12.95mmというサイズに合うものはありませんでした。

そういうわけでパネルを作り直しました。

Bnc3

今回はじめて覚えた概念が「白アルマイト」

白アルマイトってアルミと同じ色だし意味ないじゃんって思ってきたのですが、違うんですね。生のアルミだと鏡面みたいに金属光沢が強く、また手あかがすぐについて汚れが目立ってしまいます。白アルマイトにするとそんなことはありません。光沢が少し抑え目になって汚れが目だなくなります。落ち着いた輝きとでもいいましょうか。よし!これからはどんなアルミにも白アルマイトをかけるぞ。

コネクタを取り付けて、ちゃんとナットが締められることを確認。BNCのケーブルも干渉することなく接続できました。

Bnc4

アルミ筐体を組み立ててみると、基板を組み込んでも配線する隙間はありそうです。

Bnc5

これでフロントパネルの設計は完璧です。

 

| | コメント (0)

2021.11.15

非等間隔サンプリングの表示を正しく

Cosmo-ZのWindowsアプリで、非等間隔サンプリングの場合の表示が正しく行われるようにしました。

地味な作業ですが結構大変です。

下の図は5usのところに1nsの幅のパルスがある図ですが、画面の幅に対して10000:1の細さのパルスなので単純に実装してしまうと描き切れずに消えてしまいます。

Nonseq2

かといって1つ1つのポイントを全部書いていると、長いデータ、例えば1000万ポイントの長さの波形を表示しようとしたときに非常に時間がかかってしまいます。

そこで、画面のx座標を1ピクセルずつfor文で回して、その1ピクセルの間に表示すべきデータが複数個あるときには最大値と最小値を結ぶ縦線で描くということにしました。

しかし、画面の時間軸の分解能を上げて「1pixel > サンプリング間隔」になった場合、データがない部分のピクセルを直線で結ばなければならないので、単純にやるとうまくいきません。

すごく試行錯誤して、なんとか、1pixel < サンプリング間隔の場合も、1pixel > サンプリング間隔の場合も、どちらもうまく表示できるようになりました。

また、波形をマウスクリックすることで、サンプリング点の情報も表示されるようになりました。

Nonseq1

この機能がどういうときに役に立つかというと、例えば、放射線のイベントの計測などがあります。

放射線の計測では長い時間サンプリングをしますが、イベントが起きている時間は一瞬です。そのためすべてのサンプリングデータを保存するとデータ量が莫大になりますが、イベントが起きている間だけ保存すればデータ量を削減できます。

例えば、下の図は9/21に測定したあるデータですが10分間のデータが映っています。

Rad1

↑この中の一部を拡大します。

Rad2

↑まだまだ拡大します。

Rad3

↑だんだん疎になってきました。

Rad4

↑2つの波形の塊が見えてきました。

下の図が放射線のパルスのピークをとらえた波形です。

Rad5

こんな波形が何万とあるのですが、イベントがない部分はごっそりと削減することができます。そういった非等間隔で作られているデータを正しく表示できるようになったというわけです。

 

| | コメント (0)

«倉庫の片づけ