« 2021年10月 | トップページ | 2021年12月 »

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)

2021.11.13

倉庫の片づけ

お見苦しい写真でスミマセン。

特電の倉庫の状況です。

Souko

特電は2018年末に本郷のオフィスを引き払ったのですが、その中に入っていた書籍や帳簿、在庫、家具、事務機器、備品などで捨てられないものを一時的に入れておくつもりで倉庫を借りていました。

本当は、2019年には再び秋葉原に事務所を構えて、再び人も雇い始めようかと思っていました。そうしたらいろいろ必要になるからと保管していたのですが、いまのレンタルオフィスが快適すぎて、そんな気持ちが一気になくなってしまいました。一人会社って気楽でサイコー!

 

その倉庫っていうのが一言でいえば民家のガレージなのですが、周囲の道路が狭くて乗用車でさえ近づくのが困難だし、一方通行だらけだし、極めつけは夕方の時間帯に車両通行禁止になるというすごい条件なのです。安いのですが、普通の会社なら倉庫として使うことはまず無理ですね。

この倉庫を借りてから3年近く経っているので、使える原材料や事務機器などはすべて取り出された後です。この写真に写っているのはほぼすべてゴミです。撤収の際には宝物だと思っていたのに3年間で一度もアクセスされませんでした。断捨離って難しいですね。

使っていないものを保存するのにお金が落ちていくのがもったいないので、そろそろ片づけて解約しようと思い、残っているものの在庫を確認しに行った次第です。ノベルティで作ったハンドスピナーとか大量に出てきました。イラネー

 

| | コメント (0)

2021.11.11

Cosmo-Zの外部クロック同期

Cosmo-Zを外部クロックで動作するように改造しています。

ADコンバータのサンプリングクロックに同期していない矩形波を入れると、下の図のように毎回すこしずつ違う波形が得られます。

Async

これは、サンプリングポイントが毎回少しずつ変わるからです。

図にするとこんな感じです。

Async_sampling

観測している信号とサンプリングクロックが同期していないので、毎回少しずつ違う場所を見てしまうのです。

それならば、観測している信号に同期したサンプリングクロックでサンプリングできるようにしてみましょう。

 

7シリーズにはBUFGMUXというプリミティブがあって2つのクロックを切り替えることができます。

Extclk_sel

実はBUFGMUXはBUFGと同じで、BUFGには元々クロック選択機能が備わっています。BUFGMUXから切り替え機能を無効にしたものがBUFGです。そのためBUFGから出たクロックをBUFGMUXに入れると「BUFG-BUFG接続」というWarningが出るのですが、無視して無理やり論理合成させることで、ADコンバータのクロックだけを外部クロックに同期させることができました。

 

ついでに、Vivadoでパッケージ化する際にgenericのパラメータに応じて出現させたりさせなかったりする方法を身に付けました。

やり方としては、VivadoでEdit Portする際に、Port Presenceに$の後ろにパラメータの名前を書けばいいようです。

Condition_port

 

Port_presence

これで、オプション的なポートをユーザのカスタマイズに応じて出したり出さなかったりできるようになります。

Dialog

 

さて、実験用の回路は以下のようになっています。この基板はZYNQのメインクロックの100MHzとは別に、150MHzのGTX用の水晶が乗っています。GTX用水晶の150MHzをIBUFDS_GTE2で一般信号にひっぱってきて、それをPLLに入れて50MHzを作ります。その50MHzをピンヘッダ(ext_bp)から出して、別のピンヘッダのピン(extclk_ip)から入力し、PLLで100MHzに上げてAD変換モジュールに入れています。

Extclk

言葉で書くと簡単なのですが、いざVivadoでやってみると、ImplementのRoutingで止まってしまって論理合成が進みません。どうやらクロックが多数あるような回路では、クロックをMRCCのピンから入れるだけではなく明示的にBUFGを追加しないといけないのかもしれません。BUFGMUXを使うとクロックの解析がとても大変になるのでしょう。

こうしてAD変換器に行くクロックだけを外部クロックに同期させてみたところ、下の図のように、何度サンプリングしても形が変わらないようになりました。

Extclk_20211112095701

ちなみに、サンプリングするポイントを少しずつ動かしていくと等価サンプリングができますが、それは別の機会に。

 

| | コメント (0)

2021.11.08

電子回路設計における見積失敗の研究(後編)

見積もりの間違い④ 外注費用を原価で出す

電子回路の設計を行っている会社も、基板製造や部品実装は自分でできないから別の会社に外注するでしょう。ハードウェア開発業界はいい人が多いので、基板製造や実装を安くしてあげたほうが顧客のためだと思ってできるだけ安く出してしまう傾向があります。

例えば、ネットの見積もりで10cm×10cmの6層基板が18万円で作れるとしましょう。過去の実績から実装費用はメタルマスク込みで10万円とします。部品代はDigikeyで調べて5万円だったとしましょう。外注費用と部品代は合わせて33万円です。

さあ、見積書には基板代と実装費用は何円と書きますか?

  1.  33万円
  2.  43万円
  3.  53万円

正解は53万円にするべきです。

なぜかというと、

  • 基板製造会社にガーバデータを送る際に基板製造指示書を作成する時間
  • 基板製造会社に見積もり依頼をして正式に発注する時間
  • 部品表を作成する時間
  • 手持ちの在庫を確認する時間
  • DigikeyやMouse等に部品の発注を行う時間
  • 届いた部品を検品する時間
  • 基板製造会社に見積もり依頼をして正式に発注する時間
  • 実装業者に部品を送るために部品表をチェックしながら詰める時間
  • 残った部品の数を数える作業
  • 残った部品の廃棄する時間と費用
  • 残った部品を在庫としてストックしておく時間と費用

がかかるからです。「そんなの全部で2~3時間くらいでしょ」と思う人は前編の「ダメだった時間を工数に入れてない」を読んでください。正味のメールやりとりしている時間や注文を入れる時間は2~3時間くらいかもしれませんが、実際にはその何倍もの時間がかかっているはずです。

 

基板製造や実装といった外注費用だけではなく、他社製品を購入して組み込んだり、必要な計測器を購入するといった場合も原価で出してしまうという落とし穴があります。どんな商品でも購入の際には悩んで比較したりメーカーや商社に問い合わせたりするので、その分の時間もちゃんと見積もりに入れなければなりません。

会社の実績が積みあがってきたら、過去の実績から「原価×1.8」とかその会社ならではの平均的な数値が出てくるかもしれません。

建設業界では外部から購入した資材や外注費に25~30%を上乗せするのが普通なようです。

外注費用・資材費を上乗せする根拠は、選定や調達にかかる人件費ですから、ためらう必要はありません。

 

見積もりの間違い⑤ リスクが入っていない

基板設計に間違いはつきものです。どんなに注意深く作っても必ずどこかにミスがあります。

しかし、お客様に見積もりを出すときには安くしたいという気持ちが先に出てしまい、「基板は〇〇円でできます!」みたいな見積もりを出してしまいがちです。実際に作ってみるとジャンパが飛んだりするわけですが、お客様によってはジャンパのない基板でないと受け入れられないというかもしれません。

「ジャンパや後付けの修正がないこと」という文言が見積もり依頼の際に入っていることはほとんどありませんが、多くのお客様は無言でそれを望んでいます。しかし、実際にはジャンパも修正もない基板を一発で作ることは不可能です。

だから、基板は再設計をすることを前提で「再設計・製造費用」を見積もりの段階で含めておくべきです。

  • 基板設計・製造
  • 基板再設計・製造

という言い方に問題があれば

  • 試作基板 設計・製造
  • 量産基板 設計・製造

でもいいです。

とにかく2回作ることを前提とした見積もりを書くべきです。備考欄に

※再製作の必要がない場合は、再製作費用は不要です

と書いておけば親切ですね。受け入れやすくなります。

 

ネットの基板業者には基板製造以外に「基板設計」というメニューがあって、それで見積してみると10cm×10cm、1000ピン程度の4層基板なら5日で150,000円くらいで作れるそうです。1日あたり30,000円ですから超激安です。本当にできるのか不安になるような値段です。

こういった基板設計サービスのポイントとしては「回路設計」が入っていないことです。基板設計後にジャンパが飛んだり再製造になる原因の多くは基板の間違いということはあまりなく、回路設計の段階にあります。

基板設計は機械的にデザインルールチェックができるから、ネットリストが正しくつながっている基板でよいならばリスクをあまりとらなくてよいのかもしれません。

 

ハードウェアを作成するということはリスクが大きく時間もかかる仕事なので、ソフトウェア業界とは少し異なってきます。

安い見積もりを出すと、「〇日で出来るといったのに想定以上に時間がかかっている」と思われたりしますが、実際にはうまくいく回路を実験して四苦八苦していることなんてよくあります。これではお互いに良いことがありません。回路設計は研究開発ととらえて、時間がかかることを見積もりの段階でアピールしておけば、納期の遅れ=良い物を作っていると思われて柔軟に対応してもらえるかもしれません。

見えないコストを見積書に含めることで、お客様にハードウェア開発の本当のコストを理解してもらいやすくなります。

 

結論

  • エンジニアの給料の1.5倍程度の見積でコンスタントに受注できれば、雇ったエンジニアの給料が出るだけではなく、間接部門(事務職)を雇うことができるようになります。
  • エンジニアの給料の2倍程度の見積でコンスタントに受注できれば、雇ったエンジニアの給料が出るだけではなく、営業と間接部門(事務職)を雇うことができるようになります。
  • エンジニアの給料の3倍程度の見積でコンスタントに受注できれば、雇ったエンジニアの給料が出るだけではなく、営業と間接部門(事務職)を雇うことができ、広告も打てるようになり、会社が自動的に回るようになります。
  • 社長一人の零細企業で、役員報酬の1.5~2倍程度で見積もりを出したら、たとえコンスタントに受注できていても会社は大きくなりません。

いろいろ考えて出た結論がこれです。一人親方のリフォーム会社みたいにはならないと決めました。

| | コメント (3)

2021.11.07

電子回路設計における見積失敗の研究(前編)

働いても働いても利益が出ず、いつも苦しいのは何故なんだろうとずっと考えていました。

消費税や源泉税の支払いのタイミングできまって資金繰りがショートします。これはいったい何故なんだろうと。(一応、毎期黒字決算にはなっているけど実態は使われなかった部品や基板が在庫を圧迫していてむぐぐ・・)

最近、少しだけ経営的なことを考える時間的な余裕も出てきました。

その結果わかってきたことは、受託開発的な仕事をするときに利益が出るような見積もりをしていなかったのではないかということです。つまり、社長の役員報酬がA円で、1か月くらいかかりそうな仕事なら1.1×A円くらいで見積もりを出していたということです。

例えば、「基板設計が150万円、FPGAが100万円、ソフトが50万円で合計300万円です!エイヤ!」って、過去の類推から非常に大雑把に決めていました。ところが実績ベースでふりかえって計算してみると自分の給料も出ていないのです。

それでも会社が持ちこたえてこれたのはFPGAボードやMITOUJTAG、Cosmo-Zなどの自社製品の売上があるからなのですが、このような価格では従業員を雇うこともできないのは明らかでした。

 

今まで見積もりを致命的に間違えていました。その大きな間違いの例を5つほど挙げます。

 

見積もりの間違い① ダメだった作業を工数に含めない

例えばある回路の設計に「5日かかる」と勘や経験で作業量を見積もったとします。積み上げ法とか積算という方法で見積もりをしたことがある人なら、「工数は5日で人日単価がY円なら、5Y円」という見積もりを出すでしょう。

しかし、間違いは大抵「5日かかる」という前提にあります。回路や基板を作る場合でもFPGAの中身を作る場合でも、ソフトウェアを作る場合でも、「5日かかる」と直感的に思ったら正しい回路図を描いて正しいFPGAのRTLを書いている正味の時間が5日なのです。

正しい回路図にたどり着く前に、いろいろなやり方を試してみて、ダメな方法をいっぱい発見して、何度も行き止まりにぶち当たって戻るでしょう。例えば、新規の部品を探す時間や、データシートを読んでいる時間、回路図描いて部品の配線をしてからこの部品はだめだーっとあきらめて戻る時間、シミュレーションしている時間、実際にテスト回路や評価ボードで実験している時間なんていうのもあるでしょう。

Estim1

そういうダメな方法を試した時間は記憶に残らないので、過去の経験からは本当の作業量の見積もりがしにくいのです。ダメな方法もノウハウとして蓄積されていくので、まぎれもない知的財産ではありますが、お金に変えなければ飯は食えません。

かっこよく言えば研究開発費とでもいいましょうか。お客様からしてみれば正しい方法を探して試行錯誤した時間にお金は払いたくないというかもしれませんね。趣味みたいな研究開発に金は払わんぞと。CADに正しい回路を入力するのにかかった時間だけしかお金を払わないという顧客もいるかもしれませんね。

受託開発の場合、どうしても研究開発的な要素は出てきます。そういった研究開発的な要素をどれだけ見積もりに含めるかということです。

 

見積もりの間違い② 賃金だけで赤字

初心に戻って「システム開発の見積もりのやり方」を考えてみましょう。よく言われることですが、作業単価は給料の2倍とか3倍で出さなければならないということです。

例えば、50万円の給料の人を雇ったとします。

Estim2

労働者に支払われる給料は50万円ですが、健康保険と厚生年金と労働保険で20%程度が会社負担となります。また、消費税が10%かかります。(※受託開発で50万円の仕事を売り上げたら5万円の消費税を預かることになるけれども、給与には消費税はかからない。50万円の人を雇うなら税込み55万円の仕事を取らなければならない。)

つまり、消費税と社会保障費で給料の30%は必須なのです。給料を支払ったらその30%を国に支払うのです。累進課税ではありません。社会保障費は20%。消費税は10%。どんなに給料が安くても絶対に取られます。

これは絶対に乗せなければなりません。これを出さないと赤字になって消費税や源泉税の支払いタイミングで死にます。大事なことなのでもう一度言います。給料の1.3倍が絶対赤字ラインです。「絶対赤字ライン」で雇えても会社にはプラスにもマイナスにもならなりません。自転車操業が止まったら会社はこけます。

このほかに事務所の家賃や、間接部門の人件費、その他の一般管理費が20%くらいかかります。労働者の給料の1.5倍くらい稼げれば、こういった間接費を埋めて会社の収支を助けらる人材になります。

ところがそれでは足りなくて、会社に利益を出さなければなりません。会社の利益がないと、仕事がない月には社長がポケットマネーから補填しなければならなくなります。

人を雇う場合、受託金額-賃金=粗利ですが、粗利ギリギリしか稼げないので間違いなく赤字です。社会保障費+消費税分はもちろん、一般管理費と会社利益が出るようにしていかなければなりません。利益も一般管理費の足しも出ないのに人を雇う意味はありません。

 

では、従業員がいない社長一人の零細企業ならどうかというと、それでも社長の給料×2倍以上で見積もるべきです。

「見積もりのやり方」を調べているとリフォーム業界の例がいろいろヒットしますが、「親方一人の個人商店は、地元の工務店やリフォーム会社より安い」という例がたくさん出てきます。

そうなりたいですか?私はそうなりたくありません。ちゃんと利益を出して発展していく会社にしたいですね。

 

見積もりの間違い③ 単価が安すぎた

次の図はシステム開発業界におけるごく一般的な職種と給与、作業単価をざっくりとまとめたものです。

Estim3

日給(賃金)は、作業単価(人日)の半分で計算しています。

我々ハードウェア屋にはなじみのない職種がいっぱい出てきます。ITのコンサルタントとかPMってのが高給取りですね。

コンサルタントというのは顧客に対して課題を分析したり提案したりする仕事で、PMっていうのはプロジェクトの開発チームをまとめていく仕事です。どっちも上流工程ですが、顧客の方を向いているか開発部隊のほうを向いているかという違いがあります。

SEの仕事でアーキテクチャ設計、基本設計、詳細設計というのは良く聞きますが

  • アーキテクチャ設計・・・システムの骨格や、進め方、ルール、外部製品やミドルウェアを決定する
  • 基本設計・・・モジュールごとのインタフェースを決める
  • 詳細設計・・・プログラムが作れるように落とし込む

という違いがあるようです。

電子回路の世界は人が少ないので細分化していられないのが実情で、全部一人でやらなければならない場合もあるでしょう。例えば、A社の新しいADCとOPアンプを使おうとか、FPGAは何を使おうみたいなことを考えている時間は「アーキテクチャ設計」になるので、システム業界ならば1人日6万円という単価になります。ハードウェア屋さんは人が少ない上に育成に時間がかかるので、もっと高く取ってもいいかもしれませんね。

 

従業員がゼロで社長一人での会社で見積もりを出す場合でも、「回路設計費 一式100万円」みたいにざっくり出すのではなく、

  • アーキテクチャ設計・・・部品・回路方式の決定 〇日 単価〇円
  • 研究開発費・・・新規開発部分の検証 〇日 単価〇円
  • ハードウェア基本設計・・・基板形状、コネクタ、インタフェース、外部接続電圧範囲等の決定 〇日 単価〇円
  • ハードウェア詳細設計・・・各IC、モジュール、回路ブロックなどのインタフェース設計 〇日 単価〇円
  • 回路図入力・・・CADへの回路図入力作業 〇日 単価〇円
  • 基板パターン入力・・・基板パターン図入力作業 〇日 単価〇円
  • 基板FootPrint作成・・・新規部品のFootPrint作成 〇日 単価〇円
  • 基板検図 基板出図前のデザインチェック 〇日 単価〇円
  • 基板出図作業 基板製造業者への指示書作成、発注作業 〇日 単価〇円

というふうに作業項目を細かくわけて、それぞれの作業単価を難易度に応じて細かく出して積み上げていくのが良いかと思います。決定に伴うリスクと影響範囲が大きい仕事の単価を高くして、単純な「入力作業」は単価を安くしてもいいでしょう。単純な入力作業ならアルバイトを雇ってできます。

このように作業内容を細かく書き出すことで、お客様にも、回路・基板設計にどのくらいの作業工数が必要なのかというのを理解してもらいやすくなりますし、値切られにくくなります。値引きする際には作業単価や時間を減らすのではなく「項目を減らす」ということで対応することになるからです。

(続く)

 

| | コメント (2)

2021.11.06

I2Cレベル変換器の動作

I2Cのレベル変換器でGTL2002というデバイスがあります。

Gtl2002_3

1.0V~1.8Vまでの振幅で送られてきたI2C信号を3.3Vや5Vの振幅に変換でき、逆に5Vや3.3Vのロジックを1.2Vや1.8Vに変換することもできるというICです。このICは古いのでNVT2002DP,118といった新しいデバイスに変わっていますが、同様のICはいろいろなメーカーが出しているようで、秋月電子でもPCA9306というのを扱っています。

Pca9306

GTL2002の使い方は下の図のとおりとなります。

Gtl2002_1

このICの中はどうなっているのかというと、なんと、MOSFETたった3個でできています。

Gtl2002_2

これだけ見てもさっぱりわからない謎が多い接続図です。どういう原理で動作しているか回路シミュレータを使って調べてみました。

 

まず、この手のICを使ったレベル変換回路をMOSFETで書き直します。

Circuit_20211108105501

上の図のT2はオープンドレインの出力を作るためのMOS FETで、I2Cの出力を模倣しています。T3とT1がレベル変換IC「GTL2002」の中身に相当します。いま、MOS FETのスレッショルドは0.9Vに設定しています。

この回路で気が付くところは、DREFとGREFが接続されてT3がダイオード接続を構成しているところです。MOS FETのダイオード接続とは、ゲートとドレインを接続して、Vs<Vg(=Vd)のときにFETがONする働きをします。

Mosfet_diode

ダイオード接続のMOS FETに加える電圧を徐々に上げていくとスレッショルドを超えた分がクリップされます。別の味方をすれば、Vg(=Vd)はVs+Vthになるとも言えます。

Mosfet_diode_graph

最初の回路図で左側の電源電圧(=SREF)は1.8Vで、MOSFETのスレッショルドは0.9Vに設定しているので、DREF=GREF=2.7Vに固定されます。

信号をスイッチするのは右のT1なのですが、0V/1.8Vの振幅のロジック信号をソースに入れています。ここで、T1のゲートは約2.7V(SREF+Vth)なので、Vin=LならばトランジスタはONしてVout=0になります。Vin=H(1.8V)ならばトランジスタはOFFして、Vout=5Vになります。

  • Vs < 1.8V・・・MOSFET ON→Vout=L
  • Vs = 1.8V・・・MOSFET OFF→Vout=H

このようにして、左から右へのレベル変換ができます。

Vinvoutvref

上の図の緑の線はVREF、黄色がVOUT、茶色がVINです。

逆に、5V側から1.8V側へのレベル変換ですが、VREFが2.7Vなので、5Vの振幅は2.7V-0.9V(Vth)=1.8V(SREF)にクリッピングされることで行っています。右の回路からSREF以上の電圧が加わったときにMOSFETがその電圧を削って左に与えるというわけです。

 

なお、200kΩの抵抗はゲートにバイアスを与えるための抵抗で、コンデンサはFETがONするときにゲート電圧が一緒に引きずられて揺れるのを防ぐためのものです。シミュレーションではコンデンサがないとVREFに下の図のような大きなスパイクが乗りました。これはただのパスコンじゃないので重要です。GS間の容量に負けないコンデンサが必要です。

Rippile

 

このICの動作をまとめると、

  • 左→右へのレベル変換はMOS FETのON/OFFによるオープンドレイン動作
  • 右→左へのレベル変換はクリッピング動作

によって変換していたというわけです。

この回路で大事なのは「左の回路の電源電圧」<「右の回路の電源電圧」であることです。これを逆にするとうまくいきません。

また、「左の回路の出力振幅=左の回路の電源電圧」であることも大切です。

| | コメント (0)

2021.11.04

GTXから信号が出力されない!?

アルバイトの学生さんが昔作ってくれたGTXの古いデザインではHyperFADCと通信ができたのですが、その学生さんが作ったデザインをベースに私がVivado 2020.2で新たに作りなおしたデザインではなぜか通信ができないので、オシロでGTXの信号を直接見てみることにしました。

使っているボードはCosmo-K+。SFP+のCH1だけをみています。このシステムではHyperFADC→Kintexへの通信は10Gbps×4なのですが、Kintex→HyperFADCの通信は2.5Gbps x1と非対称なのです。なぜならば高速通信を受ける側をArtix-7のXC7A25Tにしたため5Gbpsまでしかいかないし、そもそもFPGAからADCへ送る情報ってほとんどないからです。XILINXのGTXは送信側を2.5G、受信側を10Gという非対称な設定にもできるのです。

1478579823_cosmok

オシロで見たところ、ビットレートは2.5Gbit/sで、1011011000 1011011000 1011011000・・・の繰り返しです。

Cskporg1

こういった波形の始まりの場所を探すにはカンマを探します。カンマとは1または0が5bit連続する符号を含んだコードで、通常はK28.5です。

ありました↓

Cskporg2 

5bit連続コードから後ろを解読すると111110100110001011011000101・・と読めます。

これを解読するわけですが、ここで8b10bの変換表の一部を載せます。

8b10b

1が5bit連続するコードはK28.1、K28.5、K28.7の3種類しかありません。この中でも特に性質が良いとされるK28.5が普通はカンマとして使われます。この5bit連続の部分に着目して解読すると、

11111010] [0110001011] [011000101]・・・

となって、K28.5 D0.0 D0.0 D0.0 D0.0 D0.0・・・という符号の列だったことがわかります。

では、私が作ったデザインではどんな符号が出てくるのでしょうか。

Cskporg4

なんと!信号が出ていない!

これでは通信ができるはずがないですね。

さて、いったいどこで間違いが起きたのか。

アルバイトさんが作ったちゃんと動くデザインからいろんなものを少しずつ削除して挙動を調べたところ、PCI Expressの部分を削除すると動かなくなることがわかってきました。PCI ExpressのコアもGTXを使っているけど、なぜもう一つのGTXチャネルであるSFP+まで動かなくなるのか・・。クロックとかが絡んでいるのかな。

そして、GTXのコアや出来上がったファイルを比較してみることにしました。その結果、なんと!出来上がったFPGAのピン配置に違いがありました。

Diff_20211105120701

PCI Expressのコアを削除したほうは、光ファイバに出すGTXの信号が元PCI Expressの端子に行ってしまっていたのです。

これが原因で通信ができなかったようです。

どうしてこんなことが起きたかというと、XDCファイルに問題がありました。

Samepin  

光ファイバ(QSFP+)へのGTX出力(GT_gtx_p)の記述が2回あって、片方がPCI Expressの配置と被っていたのです。しかも、Vivado(2020.2と2019.2で確認)は、このような状況でもWarningを出さないようです。

普通のI/Oが被ったらすぐにWarningやErrorを出すはずのVivadoもGTXの端子の重複に対しては寛容なようです。

もちろんXDCファイルを修正したら動くようになりました。

また一つ、Vivadoのバグを発見したかもしれません!!!

| | コメント (0)

2021.11.03

古いデザインの解析

2018年にアルバイトさんが作ってくれたデザインを解析してみます。

まずは3月9日ごろのデザイン。

Design1

一見すると大変複雑そうで、MicroBlazeまで入っています。MicroBlazeは、XILINXのDMAコアをAXI Liteでレジスタ設定するために使っていたといっていたような気がします。

Design2

複雑なデザインの開発はここでいったん終わり、2018年4月から新たにデザインを作りなおしたようです。最後のデザインは特電のGitLabにアップロードされていました。

それが、こちら。

Newdesign1

JESDブロックの中は、このような感じ。

Newdesign2

PCIEブロックの中は、このような感じ。

Newdesign3

非常にすっきりしています。

MicroBlazeによるレジスタ設定がなくなって、PCI Express経由でホストPCからレジスタ設定を行う仕組みに変わったようです。

 

アプリも、2018年3~5月まではこういう感じだったのですが、

Oldapp

GitLabに上がっていた2018年5月18日の最終版では

Newapp1

と、変わっていました。

ただ、どちらのアプリも起動時にDLLがロードできず、エラーになります。

PCI ExpressのDLLがx64とx86とで不整合を起こしているのか、DLLが他のDLLに依存していてそれが見つからずにロードできずエラーが起きているのかもしれません。

| | コメント (0)

2021.11.02

HyperFADCの開発を再開します

HyperFADCという16bit 2ch 1Gspsの超高速ADCの開発を再開します。

Fdlks99aaaefpi

この装置は1GHzでサンプリングしたAD変換データを40Gbpsの光ファイバで送って、QSFP+とPCI ExpressのついたCosmo-K+で受信するというものです。

1478579823_cosmok

開発を行っていたのは2017~2018年ごろなのですが、使用しているADCが16bitなのに14bitの精度でしか出てこないとか、発熱がべらぼうに大きいとか、いろいろな問題があって中断していました。

 

どこまで開発が進んでいたかというと、2018年にアルバイトさんがサンプルデザインとサンプルアプリを作ってくれていたのですが、

Fdlkbwauaa0tm2

Hyp_app1

動かしてみると、

Hdadc_app1

DLLの読み込みでエラーが発生してしまいます。

 

まずは、アルバイトさんが残していってくれたデザインを解析するところから始めるとしましょう。

 

| | コメント (3)

2021.11.01

C#のオシロアプリでマウスで範囲選択などができるようにした

C#を勉強しながら開発中のオシロアプリに右クリックのポップアップメニューを実装して、かなり良い操作性になってきました。

右クリックするとプルダウンが出て、

Mouse1

マウスの左ボタンを押すとカーソル1が置かれ、そのままドラッグして、離すとカーソル2が置かれます。このカーソルで時間が測れます。

Mouse2

また、複雑に込み入った波形の場合、範囲を選択して拡大を選んでおけば、

Mouse3

見たいところが見えます。

Mouse4

昔のWindowsのプログラミングでは正方形を描きながらXORでビット演算するということができたのですが、.NET FrameWorkではできないようです。

アプリのBitmapにはXORで描くことはできないのですが、調べたところControlPaint.DrawReversibleFrameというメソッドがあるようで、下のコードのようにするとデスクトップに白い線を描くことができるようです。

ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed);
Point endPoint = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
int width = endPoint.X - startPoint.X;
int height = endPoint.Y - startPoint.Y;
theRectangle = new Rectangle(startPoint.X,
startPoint.Y, width, height);
ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed);

上のコードはMicrosoftの解説ページにあったものなので、詳しくはググってみてください。

よくわからないので結局は使いませんでした。CPUが十分に速く、Bitmapに波形を描く時間は10ms以下なので、毎回毎回波形を全部描きながら長方形を描いても体感速度的には落ちなかったためです。マウスで範囲選択をすると毎回毎回波形を全部描きなおしていますが、全くスピード的には問題ありませんでした。

今後、機能が増えてきて遅いなと感じたらControlPaint.DrawReversibleFrameを使うかもしれません。

| | コメント (1)

« 2021年10月 | トップページ | 2021年12月 »