高性能なPLL発振器って? 2019.4.2

すこし前にこんな投稿をいただきました。


Si5340はジッタが90fsと優秀です。
他と比較すると、簡単な水晶発振回路だと1.5ps、ジッタクリーナにつかったSi5317で300fs、
DAI4392やDAC9038SにつかったSi514で250fsです。それらに比べるとおよそ1/3程度に精度が向上しています。

どういう用途に使うかですが、ASRC(非同期サンプルレートコンバータ)あたりが面白いかな?

もうすこし調べてみましょう

データシートの最初のページにはまずはアプリケーションが書いてあります。
Si5340は複数のクロック出力が得られることから、それらの用途らしいものが書いてありますが、
あまりピンとこないな〜。でも、SRCとDAIを搭載する場合は、このSI5340だけですべてのクロックがつくれそうです。




IC内部の構造は下記のようになっています。Si5340では基準となるクロック入力が4つ、
クロック出力は4つとなっています。
 

パッケージがすこし小さい(QFP44)

さて、まずはどんなものを使ってみたいとは思いますが、いかんせんパッケージが小さいようです。
0.5mmピッチのQFP44です。こんなものは変換基板がなければつかうことができません。


パッケージが小さいです。

ICはDIGIKEYあたりで調達できますが、またまた変換基板を探す必要があります。

変換基板はどうしよう?

変換基板の在庫が多いaitenndoさんのHPでQFP44で探してみると、これがヒットしました。最大QFP144までつかえるようですが、
ちょっと難があって、Si5340裏面のパッド用の穴がありません。どうしようかな?

AITENDOさんのこの変換基板がつかえそうですが・・・Si5340の裏面半田用のパッド穴がありません。

変換基板をどうするかは、すこし悩みそうです。

変換基板はQFNでした 2019.4.4

変換基板を勘違いしていました。


といことでamazonでQFN44で検索してヒットしたもので、早く届きそうなものを入手しました。

これが早くとどきそうです。ちゃんと注文はできたのだけど、さきほどみたら在庫切れになっていました。
ちゃんと、とどくかな?

部品到着 2019.4.9

注文していた部品がamazonとDIGIKEYから到着しました。


変換基板はQFN44とQFN48の兼用になっています。表裏でパターンが異なっています。


Si5340です。結構大きめのパッケージです。

まずはデータを揃えましょう!

Si5340を動かすにはデータシートは必須ですが、本体のマニュアルにはコントロールの方法が書いてありません。
いちいち、ネットで探すのも面倒なので関連しそうなファイルをダウンロードして保管しておきましょう。
Silicon Labのサイトから”Si5340/41”で検索して、とりあえずところかまわずダウンロードです。

Si5340D-B-GM.pdf

AN947.pdf へのリンク
AN1006-Si534x-8x-RevB-RevD-Differences.pdf
an1035-timing-solutions-12g-sdi.pdf へのリンク
an1093-achieving-low-jitter-using-an-oscillator-reference.pdf
ClockBuilder-Pro-README.pdf
PB-1507101-Si5347-46-45-44-42-41-40-v1.0-datasheet-release.pdf
si534x-8x-9x-recommended-crystals-rm.pdf
Si534x-Applications-Notice-Part-Per-Trillion-Frequency-Offset.pdf
Si5341-40-D-DataSheet.pdf
ug286-clockbuilderpro-dongle.pdf


あ!
これも必要そうです。でも、上のリストと同じような名前のものだけど違うのかな?
Si5341-40-D-RM.pdf

ClockBuilder PROが必要〜 2019.4.15

とりあえずデータシートとリファレンスマニュアルを印刷しておきました。時間のあるときに眺めて、どうやって使うかを勉強していきましょう。
いずれもPDFファイルなので、画面上で見ることができるのですが、やはり印刷してあるほうが読みやすいです。これも年かな〜。

マニュアル類はデータシートとリファレンスで約150ページです。

でもマニュアルをみていても、よくわからないです。情報がかなり欠落している感じです。
というのも、この手の素子をつかうにはマニュアルをみて定数を設定するというより、専用のアプリソフトを動かして必要な情報を得るというのが
一般的なようです。そこで、必要になるのが「ClockBuilder PRO」というソフトのようです。
ということで、SiliconLabのWEBサイトからソフトをダウンロードです。
このソフトの容量は55MB程度なので、ダウンロードならびにインストールにはさほど時間がかかりません。

最新バージョン?

さっそくインストールしましたが、バージョンの日付は2019/4になっています。ひょっとしてダウンロードした日付がでているだけかと思いましたが、
この日付のバージョンのようです。ということは、つい最近バージョンが変わったということですね。

かなり最近のバージョンをインストールすることができました。

動かしてみましょう!

うごかすと、このような画面がでてきます。ここからCreate New Projectを選択して各種の設定を行っていきます。

これが起動時の画面です。

入力は入力からはじまって、出力周波数の設定をそれぞれの画面ですすめるだけのようです。これは簡単です。

この画面は入力クロックの設定です。

最後には、レジスターマップを表示させることができます。すなわち、ここで表示されたデータを素子に書き込むということなのでしょう。
しかし、書き込む量は結構多いです。だいだい300データくらいは書き込む必要があります。もっとも、デフォルトの値もあるので、
実質必要なのは数10程度でしょうが、まあ何がデフォルトで何が書き込み必要かを区別するのは大変ですから、
すべてを書き込むことになるのでしょう。


レジスターマップを得ることができます。これを書き込めばいいのでしょう。


実際に動かしてみましょう!

まずは、ICのピンに加える信号線を書き下しておきます。これにもとづいて配線をしていくわけですが、
書いていて色々と気づきました。
・GNDピンがない・・・・どうやらGND PADがすべてのGNDのようです。ということはGND PADの半田付けが
 不十分だとまったく動かないということですね。十分に半田付けをしなくっちゃ。
・SCKはどこ?・・・・・SCLK(pin14)がSCKのようです。

動作電圧は3.3Vと1.8Vが必要です。3.3Vはいいとして1.8Vはどうやってつくるかな?簡単にLM317あたりで作りましょう。

まずはICの周辺の配線をイメージします。

次は、いよいよ半田づけです。
0.5mmピッチのQFN44ですが、半田付け自体はさほど難しくはないのですが、なにが神経をつかうかといえば、
ICの位置あわせです。これがすこしでもずれた状態で半田付けを開始してしまうと、リカバリーが大変です。

 
  まずは表面の半田付け。そして裏面の半田付けです。

裏面の半田付けが終わったら、導通しているか一応確認です。Si5340のクロック入力端子は内部でプルダウンされているので、
その入力端子とGND PAD間での抵抗を測定しました。測定したところ「9.8kΩ」とでたので、GND PADの半田付けは大丈夫そうです。

まずはICのピンマップつくりです。 2019.4.16

変換基板にのせて配線をするのですが、変換基板のピンだしが2列になっているので、ボケ〜と配線をしてしまううと
絶対にピンを間違えてしまいます。そういったことを防ぐために、事前にエクセルでピン配置を書いておきます。
こうすれば、かなりミスをする確率がすくなくなります。


エクセルでピン配置を事前に書いておくと、配線時のミスがすくなくなります。


半田付けするぞ!


まずは変換基板の裏面側にできる限りのパスコンを集中配置しておきます。あとは、GND PADからGND線を出せるように
変換基板のあまりの端子にGNDを接続しておきました。


変換基板の裏面側の様子です。

変換基板を小さ目の基板にのせて、評価用のボードを仕上げます。ICの消費電力は約0.5Wに昇るので
RasPi用に買っておいた小さい放熱板の貼り付けることにしました。

まずはこんな感じで評価用の基板を作りました。水晶発振器は49.152MHzのものを仮につけています。

この評価基板をどのように使うかですが、電源としては3.3Vと1.8Vの2系統が必要になります。
そこで、1.8VのレギュレータがのっているDAC4497-2.1を流用するのが便利そうです。DAC4497-2.1には
3.3Vのレギュレターも搭載されていますし、またLCDものっているので各種のチェックが簡単にできそうです。


DAC4497-2.1と接続して評価することにしました。

さて、プログラムを書いていきましょう!

まずは入力のクロックは49.152MHzですが、出力は10MHzに設定したレジスタマップを作成します。
そして、そのデータをSi5340にI2C通信で書き込むプログラムを作成しました。
これで、無事10MHzの出力がでればOKなはずです。
まずはプログラムをコンパイルしてPICに書き込み電源ON!

まずはI2Cエラーとかは発生しないので、SI5340との通信は問題ないようです。
そして恐る恐るSi5340の入力端子にオシロのプローブに接続します。

動きました!

無事に10MHzの出力が得られていることが確認できました。
一発で動くとは思っていませんでしたが、結構嬉しい瞬間です。


恐る恐る出力端子にオシロのプローブを接続です。


無事出力が確認できました。


出力も計算どおりの10MHzです。


高周波対応のオシロで波形を確認です。ダンピング抵抗もないので
リンギングが残っています。

いろいろと試してみましょう! 
2019.4.18

SI5340は基準となる発振子に外付けのクリスタルが使えます。
ということで、秋月で48MHzの水晶振動子を調達してとりつけてみました。もちろん、
ソフトウエアの設定は変更します。

動かない〜・・・
外付けの水晶振動子に換えたのはいいのですが、全然動きません。
おかしいな〜。

単純にクリスタルをつけましたが動かないです。

動かない原因としては、用いる水晶振動子のタイプがデータシートに記されているものと
違うこともあるでしょうが、ちょっと腑に落ちないです。念のために外付けでさらに負荷キャパシターを
追加してみましたが、それでもうまく動かないです。
こりゃすこし宿題が発生してしまいました。


負荷キャパシタを追加してみましたが、動かないです・・・・

ここは気を取り直して、もとの49.152MHzの発振器の出力を供給することで動作の確認を行いましょう。

複数の周波数の発生

Si5340の特徴としては、最大4つの出力を出すことができます。
ということで、それを確認してみました。
OUT0に1.6MHz、OUT1に1.5MHzと互いに中途半端な値を入れてみました。


2つの異なる周波数を入れて出力させてみましょう。

それぞれの出力から異なった周波数がでていることが確認できました。
これなら、たとえば48kHz系と44.1kHzのマスタークロックの両方の出力を得ることができそうです。
意外の便利な発振器かもしれません。

2つの異なる周波数を同時に得ることができます。

基板もそろそろ考えていきましょう 2019.4.19

まずは想定される部品をSTDサイズの基板に配置していきます。
意外と必要になる部品が多いので、結構密度が高くなります。
すべてチップ部品にすればいいのですが、入手性がわるいので
抵抗がフィルムコンデンサはリード品が使えるようにしました。これらが結構面積をとります。

まずは必要になりそうな部品を載せてみました。

大まかに配線もしてみました。 2019.4.24

どの程度の配線密度になるかの確認も含めて、ざっとワイヤーを引っ張ってみました。
まだ、入力クロックの分周機能や制御用のワイヤー線はつけていません。
Si5340の入出力は、のちのちの拡張を考えて一応すべてつかえるようにしてみました。


パターンをボチボチ描き始めています。

回路図も

部品番号やピン配置はこれから変わっていきますが、暫定的に描いていきましょう。
とくにPICとの接続は、配線が簡単になるように臨機応変に変わっていきます。

回路図作成途中 → SI5340_GENERATOR_SCH.pdf

ほぼ完成?
まだ部品番号を振っていませんが、パターンとしてはほぼ完成です。

あとは部品番号を振って完成かな。あ、ベタも塗らないと。

たぶん完成? 2019.4.26

ベタを塗って、ほぼ完成です。

あとは最終チェックをして、機会をみて試作してみましょう。

発振周波数はどうするか?

この基板は基本はクロックジェネレータなのですが、どのような周波数を発振させるかのテーブルを考えてみましょう。
オーディオ用なので、使用する周波数はほぼ限定されますが、サンプリング周波数とその倍率で結構な数になります。
おおまかに、テーブルをつくるとこんな感じになります。


黄色部分が発振周波数になり、全部で27の組み合わせになります。
現状のDACのマスタークロックはおよそ100MHzが最高周波数なのですが、
最大で200MHzを想定したテーブルを考えればでしょう。

でも27テーブルを準備するのも大変だし、素直にBlockBuiderPROからでる
データテーブルを素直につかうと、あっというまにPICのプログラムエリアがなくなってしまいます。
というのも、1つのテーブルに必要なバイト数が約1kBになるので27テーブルで27kBです。
PIC18Fシリーズのもっともプログラム容量が大きなもの(64kB)を使えばはいりますが、
なんとなくスマートではないです。最悪は、その手をつかうとしても、
もうちょっとスマートな方法を考えたいものです。

ところで発振周波数は?

Si5340の発振周波数は次式でもとまります。

Fout=(Fvco×Nx_DEN)/(NX_NUM×R)

そのため、NX_DEN,NX_NUM、Rの値をうまく設定すれば任意の周波数がつくれることになるのですが、
色々な組み合わせがあります。どういう値の組み合わせにすればいいのか、マニュアルでは書いてありません。
Si514にはそのあたりが書いてあるのですが、参考になるやらどうらやらです。
さらに、FVCOがどのように決まるのかもなかなか読み取れずににいます。およそ14GHzあたりの値になるようなので、
正確にはわかりません。
 まあ、ここはすこし値を読み解いていきましょう。

適当に計算してみる!

まずは入力周波数を49.152MHzで、出力周波数10MHzとした場合のNX_DEN,NX_NUM、Rをみてみましょう。

NX_DEN = 2147483648,0x80000000
NX_NUM = 1425929142272, 0x14C00000000
R = 0


となりました。R=0はおそらく2のべき乗を表すので実質R=1なのでしょう。NX_DEN,NX_NUMはそれぞれ44ビットの値で
整数部12Bit、小数部32ビットなので、およそ 2^32 で割った値になります。
ということで、読み替えた値にすると

NX_DEN = 0.5
NX_NUM = 332
R = 1

と考えてみましょう。として、Fvco=14GHzと仮定すると

Fout=(14GHz × 0.5) / (332 × 1) = 21.084 (MHz)

ちょっとあわないですね。おそらくR=2なんでしょう。そうすると

Fout=(14GHz × 0.5) / (332 × 2) = 10.042 (MHz)

となり、かなり近い値になります。そこで、FVCOを反対に計算してやると

FVCO=Fout×(Nx_NUM×R)/Nx_DEN = 10MHz × 332 × 2 / 0.5 = 13.280GHz

さて、ここでFVCOは一定の値として、周波数1MHzでのパラメータを計算すると

NX_DEN = 2147483648,0x80000000 (これは同じ)
NX_NUM = 7096696038400 (ちがう)
R = 1 (ちがう)

となりました。どうように44bitの値であるとして、実数に読み替えると

NX_DEN = 0.5
NX_NUM = 1652.328306
R = 4 (おそらく4かな?)

となるので、Foutを計算すると

Fout=(13.280GHz × 0.5) / (1652.328306 × 4) = 1.00464296 (MHz)

1MHzにちかいけど微妙に違うな〜。ひょっとして、FVCOが違うのかもしれません。
やっぱりFVCOを決定するパラメータを探し出さないとだめでしょう。

ここで、すこしブロック図をながめて答えを探ることに。
ブロック図をみると、どうやらPLLの中でMn/Mdという定数がクロックに掛けられています。

ブロック図ながめるとPLLの倍率はMn/Mdできまるようです。

そこで、このMnあるいはMd関係するパラメータを探すと、ありました!

Mn=M_NUM、Md=M_DEN

のようです。で、レジスターファイルから中身をみてみると先の計算でFout=10MHzとした場合

M_NUM = 870318080000(44Bit) = 20.26367188
M_DEN = 3224225472(44Bit) = 0.75

この値を源発振49.152MHzに掛けると

49.152MHz × 20.26367188 / 0.75 = 13.28GHz

となります。ちょうど、推定したFVCOにピッタシあいます。 あとは原発振のあとにあるPxaxbが気になるけど、
ここはおそらく1なのでしょう。

ということで、再度整理です。発振周波数は下記でもとまることがわかりました。

Fout=(Fvco×Nx_DEN)/(NX_NUM×R)
Fvco=XTAL×M_NUM/M_DEN


しかしながら、NX_DEN,NX_NUM、RならりにM_NUM.M_DENがどのようなルールで決まるのかは、
相変わらずのわからずじまいです。

まあ、ここだけ変更すれば周波数が変わるということでしょうから、データとして持つべき容量はかなり減りそうです。
必要なのは1つの周波数あたり約23バイト程度なので、27テーブル用意しても621バイトとかなり小さくなりそうです。

それぞれの周波数における変更必要なパラメータを計算しておきました。

Sampling *fs CLOCK 0x0206[1:0] 0x0235[43:0] 0x023B[31:0] 0x0250[23:0] 0x0302[43:0] 0x0308[31:0]
(kHz) (MHz) PXAXB M_NUM M_DEN R0_REG N0_NUM N0_DEN
32 64 2.048 0x0 0xC980000000 0xC0000000 0x0 0x64C00000000 0x80000000
32 128 4.096 0x0 0xC980000000 0xC0000000 0x0 0x32600000000 0x80000000
32 256 8.192 0x0 0xC980000000 0xC0000000 0x0 0x19300000000 0x80000000
32 384 12.288 0x0 0x8680000000 0x80000000 0x0 0x10D00000000 0x80000000
32 512 16.384 0x0 0xC980000000 0xC0000000 0x0 0xC980000000 0x80000000
32 768 24.576 0x0 0x8680000000 0x80000000 0x0 0x8680000000 0x80000000
32 1024 32.768 0x0 0xCA00000000 0xC0000000 0x0 0x6500000000 0x80000000
32 2048 65.536 0x0 0xCA00000000 0xC0000000 0x0 0x3280000000 0x80000000
32 4096 131.072 0x0 0x8800000000 0x80000000 0x0 0x1980000000 0x80000000
44.1 64 2.8224 0x0 0xA7E3200000 0xA0000000 0x0 0x49180000000 0x80000000
44.1 128 5.6448 0x0 0x865E000000 0x80000000 0x0 0x24900000000 0x80000000
44.1 256 11.2896 0x0 0x865E000000 0x80000000 0x0 0x12480000000 0x80000000
44.1 384 16.9344 0x0 0xAA8B000000 0xA0000000 0x0 0xC600000000 0x80000000
44.1 512 22.5792 0x0 0x89D0000000 0x80000000 0x0 0x9600000000 0x80000000
44.1 768 33.8688 0x0 0x89D0000000 0x80000000 0x0 0x6400000000 0x80000000
44.1 1024 45.1584 0x0 0x89D0000000 0x80000000 0x0 0x4B00000000 0x80000000
44.1 2048 90.3168 0x0 0x89D0000000 0x80000000 0x0 0x2580000000 0x80000000
44.1 4096 180.6336 0x0 0xAE90000000 0xA0000000 0x0 0x1300000000 0x80000000
48 64 3.072 0x0 0x8650000000 0x80000000 0x0 0x43280000000 0x80000000
48 128 6.144 0x0 0x8660000000 0x80000000 0x0 0x21980000000 0x80000000
48 256 12.288 0x0 0x8680000000 0x80000000 0x0 0x10D00000000 0x80000000
48 384 18.432 0x0 0x86A0000000 0x80000000 0x0 0xB380000000 0x80000000
48 512 24.576 0x0 0x8680000000 0x80000000 0x0 0x8680000000 0x80000000
48 768 36.864 0x0 0x8700000000 0x80000000 0x0 0x5A00000000 0x80000000
48 1024 49.152 0x0 0x8700000000 0x80000000 0x0 0x4380000000 0x80000000
48 2048 98.304 0x0 0x8800000000 0x80000000 0x0 0x2200000000 0x80000000
48 4096 196.608 0x0 0x8800000000 0x80000000 0x0 0x1100000000 0x80000000

やっぱりFVCOを決めるM_NUMとM_DENは設定周波数毎に微妙に異なるな〜。いったいどういうルールかな?
FVCOを固定にしてしまって、Nx_NUMだけを変更して周波数を変えても良さそうな気がするのだけど・・・・・
まあ、それも試してみましょう。

基板パターンを完成させましょう!

パターンの最終確認です。抵抗も表面実装部品がとりつけられるようにしてみました。

これでひとまず完成です。

回路図も修正しました → SI5340_GENERATOR_SCH2.pdf

基板のほうもできてきました。 2019.5.27


CLK5370基板です。

さて、いつ着手できるだろう????

まずは 2019.6.12

必要でない部品も含めて実装してみました。
さて、これから通電して動作確認です。この最初の通電がもっとも緊張する時間です。
ちょっと時間をおいて落ちつきましょう(笑。


まずは必要でない部品も含めて実装しました。さて、通電が緊張するな・・・・


(つづく?)