2024.03.31
2024.03.30
菊水の電源を購入した
菊水の電源を購入しました!
いままで使っていた電源は3Aまでしか出せなかったので、Cosmo-Z 32ch ロックインアンプの電源を供給できなかったのです。
このPMX18-5Aなら、
5Aまで供給できる!
ということで喜び勇んで使ってみたのですが、なぜかKIKUSIの電源を使うと計測波形にこのようなノイズが乗ってしまうのです。
安価なACアダプタだとこのようなノイズは乗りません。なぜだー。
ACアダプタのリップルは100mVくらいあるのに対し、菊水電源は1mVだから、菊水電源のほうが遥かに低ノイズなはずです。
なぜだー!
電源のハムとか、ケーブルのループが磁界で起電力を生じるからかと思っていたのですが、このノイズは5ミリ秒くらいの間隔で発生している(周期はよくみると微妙に変動している)ので、謎が深まるばかりです。
2024.03.29
ロックインアンプのテスト
今日はひたすらロックインアンプのテストです。今日中に出荷できれば「年度内に出荷した」と言えるのですが、1つのチャネルを検査するのに20分かかります。
それが32チャネルあるので640分。10時間以上かかるので、今日の出荷は無理でしょう。土日の間に出荷するしかないでしょう。
順調にいけばよかったのですが、あるチャネルでノイズがわずかに多いという現象が見られました。
天板に取り付けたFANを外すとノイズが消えるので、FANが出しているノイズだと思われます。
ためしにFAN用の電源にLCフィルタ(チップ部品なので仮の物)を付けたらノイズが取れて綺麗になったので、このようなFANが大元の5V電源にわずかなノイズを与えて、それさえも検出しているのだなと我ながら感心しています。
明日、LCフィルタの部品を買ってくるとしましょう。
2024.03.27
PCBGOGOの12時間コースで発注してみた
今月末に納品しようとしていたCosmo-Zロックインアンプのトリガ基板を実装しようとしたら、なんと、生基板の在庫がありませんでした。5枚作って4枚使ったから1枚余っているはずなのに・・・
仕方がないので今から作ることするのですが、PCBGOGOに12時間コースというのがあるではないですか。
ダメ元で午前4時半ごろに発注。
なんと、4:41にデータチェックの確認メールが来ました。
中の人、動いている!?
夕方4時ごろに発送されれば金曜日には届くかも。
これは期待できそうだ・・と、すぐに支払いを済ませてみたのですが、実際に稼働したのは10時から。
完了したのが夜10時ですから、その日のうちに出荷はされませんでした。
この工場って24時間動いているはずだから、12時間コースでも24時間コースでもほとんど変わらないんじゃない?と思う次第でした。
相変わらず文章で期待させるパワーはすごいPCBGOGOです。
2024.03.26
512チャネル・マルチプレックス1bitΔΣデコーダの実機動作
ここ数日、1bitのΣΔADCをマルチプレックスされた信号をCICフィルタでデコードする回路を作っているのですが、ついに実機動作ができるようになりました。
デコードした16bitのFPGAの余ったピンから出して、それをバウンダリスキャンで観察して波形化しています。
余談ですが、ChipScopeのような内蔵ブロックRAMを使ったFPGAロジアナは長時間の観察ができませんが、ピンに出してバウンダリスキャンで見れば秒オーダーの波形観察ができます。
次に、この16チャネルCICデコーダをFPGA内に32個入れて、合計512chのデコードができるようにしました。
さすがにピンに出すわけにはいかないので、FPGA内のBlockRAMに512ch分のデータを格納してUSBで読み出すようにしました。
作ったアプリはこのような感じです。
ADC値の-32768~+32767を-1から+1に換算して、その絶対値の大きさを色にしています。入力が接続されていないコネクタは常にロジックLが読み出されるので、-32768と解釈されて-1になるので、全部赤になります。
32個のコネクタに順番にADCを挿して、動作テストをしていきます。1つの縦軸に16個のADCがつながっていて、それが32個あるイメージです。
このように512チャネルのADCデータを同時にサンプリングすることができるようになります。
2024.03.25
XILINXの分散RAMを使って16個マルチプレックスされた1bitのΔΣをデコードする回路を作った
1bitのΔΣを16個マルチプレックスして送信する回路を作成しました。
回路全体の構成はこのような形です。
まずはシミュレーションですが、16個のADC(sim)から周期の異なる正弦波を発生させて、それをマルチプレクサ(sim)で16個束ねて、それを受信側FPGAでデコードした結果を示します。
通常の3段CICフィルタは
という構成ですが、これを16個並べるのではなく加算器や減算器は共有して、Z-1の代わりに分散メモリを使うようにしました。
分散メモリというのはXILINXのLUTをメモリとして使うプリミティブです。FPGAの論理演算はLUTで構成されていますが、そもそもLUTは5入力1出力(今は6入力だったか?)のメモリなので、これをユーザが利用できるメモリとして使うのが分散RAMです。
BlockRAMとの違いは、BlockRAMは専用のプリミティブであるのに対し分散RAMは普通のLUTを使うので、あらゆる場所に遍在しているということと、容量が小さく好きなサイズにカスタマイズできることなどがあります。
そして、アドレスを入れてからデータが出てくるまでの読み出しクロック数が0であること。この特徴が非常にありがたいです。
したがって、分散RAMを使った時分割CICフィルタは以下のように書けます。
普通のフリップフロップと同じ感覚(タイミング)で読み出しができますし、読み出しと書き込みも同時に行えます。アドレスが付いたフリップフロップですね。
伝送線路上をクロック50MHzで動かしたとき、デコードされたデータの更新頻度は20ns×32bit×16ch=10.240usになります。(デシメーション32のCICフィルタなので32bitごとに出力が更新されるので)
100kHz弱でADCデータが更新されるので、50kHzくらいまでなら16chを同時に送れるということになります。音声帯域なら余裕で送れそうです。
2024.03.24
FPGAで正弦波を発生させる方法
FPGAで正弦波を発生させる方法にはいろいろあります。
① 漸化式を用いるもの
② 平面上の回転を用いるもの
③ CORDIC法
④ テーブルを用いるもの
漸化式を用いるものというのは、
Yn = 2cos(2*pi*f/fs) * Yn-1 - Yn-2
という式を使う方法です。IIRの発振とも等価です。
1つ前の値に適当な数値を掛けて2つ前の数値を引くだけので簡単にできます。ここで「適当な数値」というのは、正しくは2cos(2*pi*f/fs)で、サンプリング周波数と出力したい周波数によって決まる値で、だいたい1.9~1.999くらいの、2未満の数値になります。
Excelで計算したようすを示します。
この方法の問題点は、振幅が安定しないことです。
周期によって振幅が変わってしまうことがわかります。
次に、回転を用いる方法ですが、平面上の回転は、
x'=xcosθ-ysinθ
y'=xsinθ+ycosθ
であることと、θが十分に小さいときにはcosθ=1となることを利用して、
x'=x-ysinθ
y'=xsinθ+y
として、乗算器2つで実現します。
初期値を(1,0)としてスタートしてみるものの、やはり、振幅が安定しません。
やはり、CORDIC法が一番いいのではないかと思います。
CORDICのコアはXILINXのIPにあるので、とても簡単に呼び出せます。
使い方のポイントは2つ。
・Functional SelectionをSin and Cosにする
・Phase FormatをScaled Radiansにする
です。XILINX CORDICコアの入力はデフォルトでは16bitの固定小数点で与えますが、S00.00000000000のフォーマットになっています。
上位3桁は符号と整数部(2bit)になっていて、001.00000000000が+π、111.00000000000が-πに相当します。
-πから+πの範囲をはみ出るとCORDICコアは正しい結果を返しません。
そういうわけで、16bitのバイナリカウンタを持ってきて
として位相を作ってCORDICコアに与えれば、トータルで14bitの精度になりますが滑らかな正弦波を得ることができます。
これが一番楽で確実な方法かもしれません。
2024.03.23
1bitのΔΣ ADCの信号をCICフィルタでデコードする
ΔΣ型のADCはアナログ信号を1bitの密度変調されたディジタル信号で送ってくるのですが、これをどうやって元のアナログ信号に戻せばよいかを検討しています。
一番簡単なのは平均を取ることですが、単純に密度変調を平均すると効率が悪くなりそうです。
そこで、信号をCICフィルタで受け取ることにしました。
まず、CICフィルタの前に移動平均について説明します。移動平均というのは文字通り、移動しながら平均を取ることで、例えば移動平均2と言えば現在のデータと1つ前のデータを平均することになります。
移動平均の周波数特性は以下のようになります。
移動平均の段数が増えるとゼロが増えるのが分かります。
このフィルタを図で描くと
となります。これが一般化された移動平均フィルタで、1段のCICフィルタです。特性はH(z)=(1-z-M)/(1-Z-1)であり、z=exp(-i2πf)を代入して計算するとsin(Mω)/ωの形になるのでsincフィルタとも呼ばれます。Mがデシメーション比というもので、M個に1個だけデータを取り出すという操作を表します。Mが2以上ないとフィルタとして動作しません。
CICははCascaded Integrator Combフィルタの略で、くし形の周波数特性を持つ移動平均フィルタを重ねていったものです。
3段のCICフィルタは次の図のような構成です。
M=31で3段のCICフィルタの特性は、XILINXのIP CatalogにあるCICコンパイラを使うとすぐにわかります。
ゼロの周波数が左側だけで15個あるのが分かります。0.1付近(=0.05fs)にある2番目の山でも-40dBですから、なかなかキレの良いフィルタです。
XILINXのCICフィルタは最低入力ビット数が2bitなので、1bitのΔΣ ADCからの信号をそのまま受け取ることができません。そこで、自分でCICフィルタを作ってみることにしました。
まずはC言語でプログラムを書いて実験してみます。正弦波をΔΣで1bitのディジタルデータにしたあと、
の構造のフィルタを通します。
CICフィルタで必要な計算精度は、
出力ビット数 = タップ数 × log2(デシメーション比 + 微分段数) + 入力ビット数
です。タップ数が3でデシメーション比=31、微分は1段とするので、1bitの入力から16bitの値が復元できます。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE* fp;
fopen_s(&fp,"result.txt","wt");
if (!fp) return 0;
double integ = 0;
int dout = 0;
const int MAX_T = 100000;
const int DECIM = 31;
const int N_TAPS = 3;
double mag = pow(2, N_TAPS * log(DECIM) / log(2) + 1) / 2;
fprintf(fp, "Time[ns]\tAnalog[V]\tDigital\tDecode[V]\n");
typedef short CALTYPE;
CALTYPE sum1 = 0;
CALTYPE sum2 = 0;
CALTYPE sum3 = 0;
CALTYPE delay1 = 0;
CALTYPE delay2 = 0;
CALTYPE delay3 = 0;
CALTYPE delay4 = 0;
CALTYPE delay5 = 0;
CALTYPE delay6 = 0;
CALTYPE y = 0;
CALTYPE diff1 = 0;
CALTYPE diff2 = 0;
for (int i = 0; i < MAX_T; i++) {
double ain = sin((double)i / MAX_T * 3.1415926535 * 2 * 1) * 0.95; // 400Hz
integ = integ + ain - dout;
if (integ < 0) dout = -1;
else dout = 1;
sum3 = delay3 + sum2;
delay3 = sum3;
sum2 = delay2 + sum1;
delay2 = sum2;
sum1 = delay1 + dout;
delay1 = sum1;
if ((i % DECIM) == DECIM-1) {
diff1 = sum3 - delay4;
diff2 = diff1 - delay5;
y = diff2 - delay6;
delay4 = sum3;
delay5 = diff1;
delay6 = diff2;
fprintf(fp, "%f\t", (double)i * 25.0 / 1E6);
fprintf(fp, "%f\t", ain);
fprintf(fp, "%d\t", dout);
fprintf(fp, "%f\t", y / mag);
fprintf(fp, "\n");
}
}
fclose(fp);
return 0;
}
実行結果は次のようになりました。青が元のアナログ信号で、灰色が復元されたディジタル信号です。ほとんど遜色がありません。
単純な正弦波だけでなく、周波数掃引した波形でもちゃんと出てきます。
周波数の高い部分を拡大してみると、ディジタルの粗密波に対応してアナログ値を復元できているのが分かります。
試してみたところ、3段デシメーション31のCICフィルタを作ることで、1bitの信号から16bitのアナログ値をデコードすることができました。
CICフィルタを使えば1bitディジタル信号を単純に平均するよりも高速かつ高精度にデコードできます。
足し算と引き算とレジスタだけで作れるので、とてもFPGA向きなので、ぜひ試してみてください。
2024.03.21
Cosmo-Z Mini2の周波数特性を延ばす
Cosmo-Z Mini2を使って150MHz付近の計測をしたいというお客様からのご要望がありました。
Cosmo-Z Mini2のADC入力はアンチエイリアシングフィルタで50MHzくらいでカットオフしているのですが、アンダーサンプリングで高い周波数を計測したいとのことでした。
アナログ入力はTHS4520という完全差動アンプで受けているのですが、このアンプのGB積は1.2GHzですが、ゲイン1や2で使う場合には300MHzくらいが限度になります。
しかし、どうしてもこんなに良い特性は出ないんですね。
アンプの帰還抵抗を小さくしてみたり、帰還抵抗に並列で入れるコンデンサをなくしてみたりして、ようやく気が付きました。
おそらくプリント基板の配線パターンが1pFの容量を持っているので、499Ωの帰還抵抗に1.8FpFのコンデンサを並列で入れると、113MHzくらいのところにポールが出来てしまう。だから、帰還抵抗の大きさを変えると周波数特性が変わるのだな、と。
ということで、帰還抵抗に入れる並列コンデンサを外してみました。
すると、なんと!
それだけで140MHzまで特性が延びるではないですか!
長年の謎が解けました。
原因は配線の容量が1pFくらいあるのではないかということです。次回基板を作るときには信号パターンの裏のGNDやVCCを抜くということをやってみようかと思います。
2024.03.20
Amazon AWSにVivadoをインストールした
Linux版のVivadoでCosmo-Zのデザインをビルドしたいというご要望をいただいたのですが、私はLinuxのマシンを持っていません。
そこで、AWSでLinuxマシンを借りて試してみました。
いくつか試行錯誤したのですが、Ubuntu 20.04LTSを選び、SSDは500GBくらい、t2.xlargeくらいのCPUパワーとメモリは欲しいかなという感じでした。Ubuntuは22.04にするとSSHがパスワード認証で接続できなかったので20.04にしました。このへんはお好みで。
XILINXのWebサイトからVivadoをダウンロードしてくるのですが、AWSの仮想マシンですからコンソールしかありません。
まずは、Windowsマシンで280MBくらいのインストーラ(Xilinx_Unified_2023.1_0507_1903_Lin64.bin)をまずダウンロードしてきて、WinSCPか何かでLinuxマシンにアップロードします。
そして、chmod 755 Xilinx_Unified_2023.1_0507_1903_Lin64.binで実行権限を付けて実行するのですが・・・
INFO Could not detect the display scale (hDPI).
INFO Could not detect the display scale (hDPI).
If you are using a high resolution monitor, you can set the insaller scale factor like this:
export XINSTALLER_SCALE=2
setenv XINSTALLER_SCALE 2
ERROR: Installer could not be started.
No X11 DISPLAY variable was set,
but this program performed an operation which requires it.
java.awt.HeadlessException:
No X11 DISPLAY variable was set,
but this program performed an operation which requires it.
at java.desktop/java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:166)
at java.desktop/java.awt.Window.<init>(Window.java:553)
at java.desktop/java.awt.Frame.<init>(Frame.java:428)
at java.desktop/java.awt.Frame.<init>(Frame.java:393)
at java.desktop/javax.swing.JFrame.<init>(JFrame.java:180)
at h.b.<init>(Unknown Source)
at com.xilinx.installer.gui.F.<init>(Unknown Source)
at com.xilinx.installer.gui.InstallerGUI.<init>(Unknown Source)
at com.xilinx.installer.gui.InstallerGUI.<clinit>(Unknown Source)
at com.xilinx.installer.api.InstallerLauncher.main(Unknown Source)
という謎のメッセージを吐いて起動できません。
XINSTALLER_SCALEを設定したり、--nox11のオプションを付けてもダメです。
どうすればいいかというと、WindowsでVcXsrvを起動し、TeraTermのSSH転送でXウィンドウをWindowsに設定するチェックを入れ、Linuxの上で
export DISPLAY=:10
と打ちます。この10という数字は何でも構わないようです。
なお、
./Xilinx_Unified_2023.1_0507_1903_Lin64.bin --noexec --target installer
で中身のインストーラを解凍して
./installer/xsetup -b AuthTokenGen
でパスワード認証ファイルを生成して
sudo ./installer/xsetup --agree XilinxEULA,3rdPartyEULA --batch Install -c .Xilinx/install_config.txt
でテキストモードでインストールするという技もあるようです。
とにかく、
export DISPLAY=:10
を付けると無事に起動できました。
2024.03.19
2024.03.17
アウディの契約とレンタカーしにいきました
注文していたアウディの契約のためにディーラーさんに行ってきました。
また、アウディ A4を借りて、特電が入居しているビルの地下駐車場に停めてみたところ、ちょっと柱の角からはみ出るかなという感じでした。隣の車もはみ出ているので、こんなものかもしれません。
私が注文したのはA5なのですが、A4とA5はサイズやエンジン性能はほぼ同じ。
エクステリアとインテリアが豪華になっているのがA5だとか。
納車は4月下旬とのことで、楽しみで仕方がありません。
2024.03.16
2024.03.15
netplanの設定のハマりどころ
netplanを使ってIPアドレスを設定する方法法は
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: yes
dhcp-identifier: mac #← MACアドレスを使ってDHCPの識別を行わせる
#macaddress: 02:11:10:00:22:01 #← インタフェースのMACアドレスを固定したいなら
dhcp6: no
optional: true #← これを設定しないと、起動時にネットがないと待たされる
#addresses: [192.168.1.80/24] #← 以下はDHCPではなく固定する場合の設定
#gateway4: 192.168.1.1
#nameservers:
#addresses: [192.168.1.1, 8.8.8.8, 4.4.4.4] ←字下げ必要
ですが、いくつかのハマりポイントがありました。
① yamlという形式なので、字下げで構造を示している。
② 字下げはTABは不可。スペースで字下げすること
③ nameserversの後ろのaddressは字下げ必要
です。
2024.03.14
事業再構築補助金の実績報告差し戻し対応
事業再構築補助金の実績報告が差し戻されていた問題で、理由書を書いて差し戻し対応を行いました。
今回差し戻された理由としては、
① 実績金額が交付申請より10%以上減っている理由を書け
② 展示会出展に納品書がない
③ 納品書に出荷日しか記載されておらず、納品日が記載されていない
④ 請求書に締切日しか記載されておらず、請求日が記載されていない
⑤ 自社製品を購入した場合の銀行振り込みの証票がない
というものでした。ほかにもくだらない理由のがいくつか。
まず、②は本当に世間知らずかと。展示会の出展に納品書があるのかと逆に聞きたい。逆にワイが納品しているようなもんです。実施マニュアルにも展示会の場合は「納品書または完了報告書」なので、報告書を付けているだろうがと電話で言ったのですが文章にしてやらないとダメなようでした。
③も④も、事務局の人は世間で働いたことがないのでしょうか。納品書に出荷日しか書いていない会社もあるし、請求書が締め日しか書いていない会社もあるということを知らないのでしょう。それぞれの会社のフォーマットなのだから仕方がないのですが、こんなくだらないことで差し戻ししてくるのはやめてほしいものです。
⑤は、自社製品を部品を集めて組み立てたのだから、自社から自社へ振込をするはずがないのですが、振り込んだ証拠を出せというのです。
実績マニュアルには原価以内と証明できれば良いと書いてあるので、原価リストとその部品の支払い証票を出しているのですが、おそらく、事務局の人はマニュアルを把握していないのではないかと思われます。
最後に①の実績額が10%以上減っているからというのも、交付申請を意味不明な理由で無駄に差し戻すし、そもそも交付決定が遅れたから発注できなかったというのもあるのですが、もう少しオブラートに包んだ理由を書いて提出してあげました。
2024.03.12
Spartan-7ボードの出荷を再開
長いこと品切れしておりました特電Spartan-7ボードの出荷を再開しました。
このボードは、XC7S50スピードグレード2を中心に、DDR3メモリ、100MイーサPHY、USB2.0、RasPiカメラインタフェースなどを備えたボードです。
サンプルデザインを書き込んで、RasPiカメラを接続すればこのように綺麗な画像がFPGAに取り込めます。
また、Cypressを使ったUSB2.0 AXIインタフェースのコアも用意しているので、お客様のデザインを速やかに作成可能です。
どうぞよろしくお願いします。
2024.03.08
未踏会議2024に出展します
突然ではありますが、明後日の日曜日にベルサール秋葉原にて『未踏会議2024』という展示会が行われます。
特殊電子回路は、そのイベントの中で「MITOUJTAG 20年の軌跡」と題した展示をさせていただきます。
思い返せば特殊電子回路は、2003年の未踏ソフトウェア創造事業で開発された「包括的JTAGサポートソフトウェアMITOUJTAG」を販売するために設立されました。
早いもので、MITOUJTAGを販売開始してから20年経ちました。
その間にいろいろなことがありました。
いまさら古巣である「未踏」事業の展示会で、ソフトの営業をしたり、機能や新規性がどうという展示をするつもりはありません。
本展示会では、どのようにして一人の零細企業として生き延びてきたか、どのようにしてピンチを乗り越えてきたか、といった極小零細企業の泥臭い、自転車操業的な面に焦点を当てた展示をする予定です。
これから自作のソフトウェアやハードウェアで起業したい、商売を始めたいという方々とつながることができれば幸いです。
P.S. 昨年開発した半導体真贋判定装置「シン・IC」も、MITOUJTAGを応用した成果であるため、一緒に展示いたします。
場所 ベルサール秋葉原2F S-7ブース
日時 3月10日(日) 10:00~17:00
URL https://www.ipa.go.jp/jinzai/mitou/mitoukaigi/
主催 情報処理推進機構 一般社団法人未踏
入場料 無料(事前登録が必要です)
■展示会Webサイト
2024.03.01
ZCU111のGTY(SFP+)のクロックを156.25MHzに設定する
XILINXのZCU111というRFSoCボードにはGTYにSFP+のポートあります。このボードは大変すばらしいボードなのですが、Si5382などの超高性能クロックジェネレータICを操作しないとクロックが供給されません。ADC/DACもそうですし、SFP+のクロックもそうです。
超高性能のPLL ICなので設定するべきレジスタはいっぱいあるし、I2Cのバスが22個もあるので、アクセスするだけでも苦労します。
そんなZCU111のこのクロックを156.25MHzに設定して10Gイーサを使えるようにしたいと思います。
なお、156.25MHzを64倍すると10000MHzになります。10Gイーサのケーブル上の速度は64b/66b変換をしているので10.3125Gbpsになります。
ZCU111のSFPは下の図のように4つあって、GTYにつながっていて、おそらく左から3 2 1 0です。25Gイーサも使えるようですから、素晴らしいですね。
まず、AMD XILINXのZCU111のページからSystem Controller GUI Tutorialの付属ファイルをダウンロードします。
下のイメージのようなツールで、ZCU111のシステムコントローラチップ(MSP430)を操作して、ボード上のクロックや電源を設定するというツールらしいのですが、実際には何をやっても固まってしまって動きませんでした。(購入した直後のまっさらな状態じゃなきゃダメ?)
というわけでこのツールは使えないのですが、ツールの rdf0475-zcu111-system-controller-c-2019-1\zcu111_scui\BoardUI\tests\ZCU111\clockFiles フォルダにある、Si5382A-RevE-ZCU111-Registers-156.25MHz.txtをコピーしてきます。似たようなファイル名のファイルは他にもありますが、どれでもいいんじゃないかと思います。
ファイルの先頭を見ると、
# Si538x/4x Registers Script
#
# Part: Si5382
# Project File: C:\Users\sethm\Documents\Si5382A-RevE-ZCU111-Project.slabtimeproj
# Design ID: ZCU111
# Includes Pre/Post Download Control Register Writes: Yes
# Die Revision: C0
# Creator: ClockBuilder Pro v2.21 [2018-01-19]
# Created On: 2018-02-28 14:51:24 GMT-07:00
Address,Data
#
# Start configuration preamble
0x0B24,0xC0
0x0B25,0x04
0x0540,0x01
# End configuration preamble
#
# Delay 300 msec
# Delay is worst case time for device to complete any calibration
# that is running due to device state change previous to this script
# being processed.
#
# Start configuration registers
0x0006,0x00
0x0007,0x00
0x0008,0x00
0x000B,0x68
0x0016,0x03
0x0017,0xDC
0x0018,0xBB
0x0019,0xDD
0x001A,0xDF
0x0020,0x02
・・・
というふうになっています。
つまり、このアドレスとデータの組をI2Cで書いていけばよいようになっています。
肝心のI2Cポートの番号ですが、私のビルドしたLinuxでは/dev/i2c-10になっていました。
dmesgで見ると、下の図のようにi2cバスが割り当てられていくのが見えます。
ZYNQのPSに2つのI2Cがあって、I2C0とI2C1といいますが、これが/dev/i2c-0と/dev/i2c-1に割り当てられています。
ZCU111ではI2CエキスパンダでI2Cバスが複数に拡張されているのですが、I2C0はTCA9544で4個に、I2C1は2個のTCA9548APWRで16個に拡張されています。そういうわけで、/dev/i2c-2~/dev/i2c-5はTCA9544配下の拡張バスに、/dev/i2c6~/dev/i2c-21はTCA9548の16個の拡張バスになっています。
上から順番に6,7,8,・・・となっているので、ディジタル系のクロックを作っているSi5382は/dev/i2c-10になります。この番号はデバイスツリーの書き方で変わってくると思うので、ボード用のLinuxを構築する際に考慮してください。
さて、/dev/i2c-10を操作するとSi5382にアクセスできるのですが、Si5382のデバイスアドレスは0x68です。
i2c_write("/dev/i2c-10,0x68,addr,data,1);
のようにして書き込みます。
Si5382のアドレスは8bitですがレジスタ自体は4096個あります。そこで256バイトごとにページという仕組みが使われていて、各ページのアドレス0x01はページ切り替えレジスタになっています。
例えば、0x0B24,0xC0 に書き込むというときには、まずレジスタ0x01に0x0bを書き込んで、0x24に0xc0を書きこむという手順になります。ファイルに記載されたとおりにすべてのレジスタを設定するとSi5382は156.25MHzを出力しはじめます。
UltraScale+でGTYのREFCLKをユーザロジックで利用するには、Utility Bufferの中にあるIBUFDSGTEとBUFG_GTを使います。
IBUFDSGTEはREFCLKを引っ張り出してくるプリミティブで、IBUF_OUTとIBUF_DS_ODIV2の2つのポートがあります。IBUF_OUTはGTYなどのトランシーバ専用のクロックポートで、ユーザ回路に出すにはODIV2のほうを使います。ODIV2にはDIVという文字が含まれていますが、デフォルトでは分周はせずに÷1で出てきます。
ODIV2から出てきたクロックをユーザ回路につなぐには、もうひとつ、BUFG_GTというのを使います。BUFG_GTもUtility Bufferにあって四角い箱になりますが、実体は単なるクロックバッファのようです。
こうして、Si5382のクロックがFPGAのY31とY32から入力されますので、XDCファイルにそのピン番号を書いておきます。
本当に156.25MHzになっているかどうかを確認するためにはオシロを使ってみるのがベストですが、こういう基板ではクロックの配線が内層を通っていたりして見ることができない場合もあります。
また、手元にZCU111があるわけではなくリモートで接続していたら、オシロをつないでみるわけにはいきません。
そこで、PLから出てきた100MHzのクロックをClocking Wizardで156.25MHzを作りバイナリカウンタを動かし、また、GTEから来たクロックも同じ分周比のバイナリカウンタを動かしてLEDチカチカをしました。
LEDチカチカの信号は十分に遅くなっているので、ピンの状態をMITOUJTAGを使って観察します。
このとおり、内部クロックの156.25MHzと、GTE由来の156.25MHzは同じ周期でカウントアップしているのが確認できたので、無事に156.25MHzに設定できたと言ってよいでしょう。
最近のコメント