« 2006年12月 | トップページ | 2007年2月 »

2007.01.30

Digikeyの先まで買占め

某社からあるOEM製品を100個という注文をいただいていました。
今日、プログラムの書き込み、組み立て、シール貼り、検査などが完了し、無事に納品することができました。
いやー、大変でした。
基板の実装は別の業者に実装をお願いしましたが、特に問題もなく幸いでした。
こういう仕事では、安全を見てちょっと余分に作っておかなければなりませんね。

今回の教訓は、基板は余分に作るべきということと、Digikeyへの発注は早めに、ということでした。

Digikeyは、在庫切れになると「非在庫保有商品 リードタイム 何とか」と出ますが、在庫切れにもいろいろあるということがわかってきました。

何かというと、現在在庫が切れているだけではなく、次に入荷する予定の商品まで売り切れることがあるようです。

具体的に言うと、たとえば、TPS73118DBVTという、1.8Vで150mAを出力してくれるレギュレータがあります。
この商品は現在「非在庫保有商品」になっていますが、たまたま在庫切れしているだけであって通常は取り扱っている製品です。

たとえば、今日これを10個注文してみると、発送予定日は2007年3月19日と出ます。
ところがこの前試した時には、2月5日と3月19日の分納と出ました。さらにその前は2月5日のみ出ました。

どうやら、2月5日にDigikeyが仕入れる分まで、だれかが買い占めてしまったようですね。

#私じゃありませんよ

入荷日が近い商品は、先のものまで買い占められることがあるようです。
ですから、「リードタイム」と出たから後日注文しようと思っていると、さらに1ヶ月2ヶ月待ちにされてしまうかもしれません。

Digikeyへの注文はお早めにということです。

| | コメント (4)

2007.01.27

技術士1次試験合格者歓迎会

今日は技術士一次試験合格者歓迎会に行ってきました。
目的は、技術士補になってくれそうな若い学生を探しに行くこと。
懇親会に出席したメンバーは、数年前と比べると、年齢層があがったような気が・・
結局、電気電子部門の若い学生はみつからず。

| | コメント (0)

2007.01.26

産総研へ行ってきた

今日は、千葉県先端情報技術活用研究会の行事で、産学官連携の話が聞けるとのことで産業技術総合研究所、いわゆる産総研へ行ってきました。

つくばエキスプレスに乗るとあっというまに到着です。
駅からバスに乗って、20分くらいで産総研に到着。

初めて産総研を見てきましたが、うーん、なんていうか、大学の研究室を集めたような雰囲気のところですね。
朝から晩まで研究に没頭できそうな環境です。
生協もあってCOOPの文字は大学の生協と同じような書体。
大学と違うのは学部生がいないことでしょうか。

午後からは産学官連携のセミナー。
この話は、うーん。ちょっと微妙。

産総研の成果を事業化したり、産総研に仕事を発注(つまり、支援や共同研究をお願い)したり、産総研の持っている特許活用とか、つまるところお金を出すほうの話でした。
産総研から仕事をもらうにはどうしたらいいか、という話だと思って行ったので、期待はずれでした。

| | コメント (0)

2007.01.24

回路の秘密結社?

都内某所で行われた秘密集会に、見学という形で初めて出席。
ひじょ~~~~~~に濃いメンバー。
この会ではいくらでも、大好きな回路の話ができるぞ。
こんなの今までなかった。次の会が楽しみ!

| | コメント (0)

2007.01.18

電流帰還OPアンプの波形

電流帰還OPアンプを使ったアンプが発振してしまったので、オシロを使わせてもらいに、今日再び産業センターへ行ってきました。

なぜアンプが発振してしまったかというと、高域で減衰するであろうアンプの周波数特性を打ち消すような小さなコンデンサを追加したためです。ちゃんと計算しないで変な回路を付け加えてはいけませんね。

追加したコンデンサを外し、オシロで出力を見てみると、ちゃんと綺麗な波形が撮れました。
Opamp

若干波打っているように見えますが、これはプロービングの問題で反射してしまっているのと、300MHzで発振しているPLLのノイズが乗ってしまっているためでしょう。
Webに写真を掲載できる波形はここまでです。

Spartan3 FPGAと、AD9753と電流帰還OPアンプを使えば、そこそこの性能のファンクションジェネレータが作れるでしょう。

めでたしめでたし

| | コメント (0)

2007.01.16

高速デジアナ波形

先日のDACボードの波形をみるオシロを使わせてもらうため、千葉県産業支援技術研究所へ行ってまいりました。

まずディジタル信号の波形。
Digital12ma

写真の上の波形は150MHzのクロックです。LVDSの信号なのでこんなものでしょう。

写真の下の波形はDACに与えているディジタル信号の波形です。これはSpartan3 FPGAのI/OにLVCMOS33,SLOW,12mAの設定(実はデフォルト)をして出力させたものです。波形には少しオーバーシュートが出ています。
波形の立ち上がりは、このオシロでみるとだいたい3.3nsとなっています。
借りたオシロは300MHz級のものなので、実際にはもっと鋭く立ち上がっていることでしょう。

Lレベルのところが振動しているように見えるのは、プロービングの問題でクロックか何かが見えてしまっているのでしょう。
なお、ディジタルの信号は150Ωで終端しています。終端抵抗は特性インピーダンスより大きいと思いますが、ないよりはマシです。

次の写真は、FPGAの出力をLVCMOS33,FAST,24mAにしたものです。つまり、Spartan3に最高のパワーで出すように設定しました。すると、かなりリンギングが激しくなったのがわかります。
LVCMOS33でSLOWの12mAで動いているならば無理にパワーを上げなくても良いように感じられます。
Digital24ma


次の写真は、300MHzのレートで遷移するディジタルの信号です。
300MHz級のオシロで見ているためか、もはや矩形をしていません。
Lが2回、あるいはHが2回続くときには、その振幅が一瞬高くなり、パルスの幅が広がるように観測されます。つまり、実際のデバイスかオシロのどちらかがついてきていないのでしょう。
もちろん、誤動作しないようにするには、クロックとデータの位相をちゃんと合わせる必要があります。この波形を受け取るFPGAなりDACが、然るべきタイミングでHやLが識別できれば良いのでしょう。
Digital300mhz
実は、この波形を測定しているときにはオシロについているAquire-Periodモードの存在に気が付きませんでした。
このモードをONにすると、もっと詳細に遷移状態がわかるようです。

次の写真はAD9753の出力波形です。
階段状の波形を出力させてみました。
Ad9753output

ちょっと角が丸くなっていますね。
これは、AD9753の出力は電流出力なのですが、それを抵抗で電圧に変換させた部分の波形を見ているためです。したがってオシロでプロービングしたことが影響してしまったのでしょう。
より詳しい波形を見るならば、電流帰還OPアンプの出力を見るべきなのですが、作った電流帰還OPアンプが発振してしまったので、今日は見ることができませんでした。


| | コメント (0)

両面基板で300MHz成功!

両面基板で作ったADV7123のDACボードが動きました。

FPGAとDACの間は、300MHzのTTLレベルのバスで接続していますが、問題なく動いてくれました。
Adv7123_1

ただ、ADV7123の出力するアナログ波形は、先日作ったAD9753よりも汚かったです。
100MHzのオシロで見ているので確実なことはわかりませんが、確かにAD9753のほうが狙ったとおりの波形を出してくれました。ADV7123はどうも波形がリンギング気味なのに鈍り気味です。
考えられる原因としては、ADV7123はAD9753よりもセトリングタイムが長いことや、プロービングがいいかげんである、などの問題など挙げられます。
この辺は高速なオシロを借りられたら見てみることにします。
Adv7123_2

また、FPGAからADV7123に供給するクロックは300MHzの速度になりますが、これはTTLレベルで与えないといけません(すごい仕様だ!)。ですが、FPGAから普通に300MHzの信号を出そうとしても出てきませんでした。

どうやら、150MHzあたりが限界のようでした。

よくよく調べてみると、Spartan3のFPGAはUCFファイル等でI/Oに何も指定しないと、「LVCMOSの2.5で、Slew=SLOW」という設定なってしまいます。
つまり、スルーレートが遅く、電流も弱めに設定されてしまっているのです。

これを「LVCMOS33の24mA、FAST」に指定すると、あら不思議。300MHzの信号が出せるようになります。
「LVCMOS33の24mA FAST」はパワーが違うようですね。

300MHzの速度でバスにデータを出力する箇所は、ODDRを使って実現しました。

というのは、Spratan3のFPGAはせいぜい150MHzくらいの速度でしか動きません。300MHzの速度でデータを出力するには、FPGA内部で150MHzの速度で2系統の信号を作り、それをODDRでマルチプレックスしながら出力すればいいわけです。
300MHzのレートでデータを出力する回路

FPGAの中が150MHzくらいでしか動かないのは、普通の設計ではカウンタのようなものがあちらこちらに作られるからです。カウンタを作らずに、単純なデータラッチくらいならばもっと高速に動くでしょう。BlockRAMも単体なら300MHzくらいで動くようです。
カウンタをつくるかわりに、BlockRAMの中にバイナリコードを格納しておいて作るステートマシンもあるそうです。

そういう状況ですので、クロックだけならFPGAの中では300MHzの速度でも動くことができます。また、クロックだけなら、300MHzの速度で出力することができます。
というわけで、データはODDRで、クロックはDCMを使って作り、300MHzの速度でデータとクロックを供給しました。

こんな感じですが、どうやら問題なく動いてくれたようです。

両面基板といえども、頑張ればこのくらいのものは作れるようです。

次はGHzにチャレンジ! いや、それはちょっと無理っぽい!?

| | コメント (0)

2007.01.14

DACがちゃんと動くようになってきた

AD9753を使ったDACボードの実験を進めています。

前回、電流帰還オペアンプが猛烈に発振すると書きましたが、原因は単純なミスで、+入力と-入力の端子を逆にしてしまっていたでした。これを直すとちゃんと動作してくれるようになり、まずは一安心です。

さて、DACの出力に、18MHz(≒300MHz/16)方形波を出してみました。
DACの出力波形はそこそこ方形波っぽい形になるものの、OPアンプの出力は下の写真のように鈍ってしまっています。
鈍った方形波

使用している電流帰還オペアンプは、TexasInstruments社のOPA695というBW=1.4GHzのアンプです。これをゲイン-1倍で使用しているので、300MHzごときで鈍るはずがありません。(少なくともシミュレーションでは)

これは、おそらく回路のいたるところに寄生する容量によってLPFが形成されてしまっているためだと考えられます。SPICEでシミュレーションしたところ、帰還抵抗の部分に容量が寄生すると、当然ながらLPFの特性を示すようになることが確かめられました。

これを打ち消すために、DACからOPアンプへと入力される抵抗に並列にトリマ・コンデンサをつけてみました。
Trim

つまり、周波が高くなるとアンプ部の入力抵抗が減るようにみせかけて、これでアンプ部のLPFの効果を打ち消すわけです。

トリマをぐるぐる回していると、方形波のエッジの部分がとんがったり、鈍ったりを繰り返します。
どうやらこのトリマは180°回すたびに、最小容量と最大容量を繰り返すようです。45°ほど回したところで波形が最も四角く綺麗になります。したがって、だいたい5pF程度くらいで最大の効果が得られるのだろうと想像できます。

綺麗になった方形波

ということで、トリマをはずして、5pFのチップコンデンサを並列に付けてみると、安定して綺麗な波形になりました。オペアンプの発振もせず、また目で見た限りでは直線性も問題なく動くようになりました。

最後に、下の写真は、階段状の波形を出してみた際の写真です。

階段状の波形

値が遷移した直後に軽いリンギングが見られます。
このリンギングがオシロでの計測の問題に起因するものなのか、それともDACチップの性能によるものなのかは、まだはっきりしません。気になるのはAD9753はセトリングタイムが11nsもあることです。

データシートによれば出力の値は、2.5nsで目標値の10%から90%まで変化するそうですが、0.1%の範囲に落ち着くまでには11nsかかるようです。(Output Settling Time)
この値が確定するまでの間は、出力値が振動するのか、それともなだらかに変化するのかわかりません。100MHzのオシロでは調べられないので、来週、オシロを借りた際に調べてみることにします。

| | コメント (0)

2007.01.12

AD9753が動いた!

AD9753は、330Msps,12bitの超高速DA変換チップです。
P板に火曜日に発注して、木曜日に受け取りにいったボードに部品を実装し、金曜日の未明、ついに動きはじめました!
回路構成は、FPGA(XC2S200)→AD9753→電流帰還オペアンプというふうになっています。
Dac1_1

最初はDA変換レートを100MHzから始めていって問題なく動くのを確認し、次に150MHzに上げました。
このあたりでは特に問題なく動いています。

のこぎり波を出すと直線性が悪いのですが、これはおそらく電流リファレンス用に2kΩの抵抗を入れなければならないところ、手元になかったため、1.5kΩの抵抗で間に合わせたのが原因でしょう。

下の写真はAD9753の付近の拡大図です。半田付けした後、洗浄していないのでちょっと汚いですね。
Dac2

電流帰還オペアンプの出力は、と見てみると、どうやら25kHz付近で強烈に発振しているようです。

私の持っているオシロは100MHz物なのであまり鋭い立ち上がりが見ることができません。ですが、電流帰還オペアンプの出力は、5nsの間に-5Vから+5Vまで立ち上がっています。
チップの性能としては1nsくらいで立ち上がることができるものなので、すごいことになっているのでしょう。

これにアンテナなんてつけたら・・・

  とりあえずオペアンプへの電源供給を外しておきましょう。

さて、DA変換の速度を300MHzまで上げて、のこぎり波を出してみると、いろんなところにヒゲが出ていました。おそらくディジタルの信号が暴れているのだと思い、24本あるデータバスに終端用の抵抗をつなぐ場所を用意しておいたので、ここにチップ抵抗を載せました。
Dac3

抵抗値は150Ω。これ以上抵抗値が小さいと電流が流れすぎ、これ以上大きいと効果が期待しにくそう、ということで直感と適当によって決めました。
もちろんインピーダンスはマッチングしていないでしょうが、こういう抵抗があるのとないのとでは全然結果が違います。DA変換の結果にヒゲがなくなって、綺麗なのこぎり波を出すことができるようになりました。

信号が反射してしまうことはある程度はやむをえないと割り切って、できるだけ信号波形が乱れる時間を短くするようにし、クロックが来るより早く乱れが治まれば、うまくいくはず、と思ってやってみたところ、うまくいったようです。

ですが、終端抵抗を入れると、システム全体の消費電力が200mAも増えました。チップ抵抗のあたりがほんのり暖かくなっています。

私の手元には100MHzのオシロしかないので、実際はどんな波形になっているのかを見ることができません。

というわけで、来週のはじめごろに県の産業支援センターに行って、高速なオシロを使わせてもらってこようと思います。センターでは貸し出しはしてくれないので、直接センターに行って使わせてもらうことになります。
産業支援センターは、オシロだけではなく、実に多様な実験機器や設備を備えている上、非常に安い料金で使わせてもらえるので、非常にお得なのです。

| | コメント (0)

2007.01.11

店の名は重慶府 原子力学会のとなり

9日の火曜日に、P板.comの2日コースで注文したプリント基板が、11日の今日発送とのことです。

宅配便で送られると到着が翌日になるので、どうしても基板が早く欲しかった私は電話をかけて、某所にある発送センターまで直接取りに行くことにしました。

その途中で新橋を通過することになったので、途中下車して、新橋重慶府により、ランチを食べました。
新橋重慶府は(財)日本原子力学会の隣にあります。

重慶府のランチの7番は気絶するほど辛いラーメンだったのですが、久しぶりにいってみると普通の坦々麺になっていました。さすがにあれはヤバかったのか。
八重洲に重慶府の姉妹店ができたそうなので、今度いってみることにしましょう。
さて、重慶府で腹ごしらえをした後、某所へ向かい、プリント基板を受け取りました。

本当に出来上がっていた!
さすが2日コースは早いですね!
Np1014_1015

| | コメント (3)

CRC生成回路

PCI Expressでは、何重にもエラー検出と訂正が行われます。

まず物理層では、8b/10b符号のディスパリティ検査が行われます。
PCI Expressのケーブル上を流れる信号は8b/10b変換という変換が行われた信号です。
この変換を施した信号には、1や0のどちらかの符号が過多にならない、という性質があります。
つまり、エラーなどが起きて、1のほうが不自然に0より多くなると、エラーとなるわけです。
これは物理層チップが調べてくれます。

それから、データリンク層パケットには、16ビットのCRCが付与されます。
また、トランザクション層のパケットには32ビットのCRCが付与されます。
さらに、End-to-Endで使用するためのダイジェストと呼ばれる32ビットのCRCもあります。

このようにいろいろなCRCがあるのですが、参考にしている解説書にはその生成方法が載っていませんでした。
16bitの一般的なCRC生成方法をGoogleで調べてみると、
・16-bit CRC  x^16+x^15+x^2+x^0
・CCITT-CRC  x^16+x^12+x^5+x^0
などが出てくるのですが、PCI Expressの上の流れるパケットをこれに当てはめてみても、どうしてもうまくいきません。ビットの順序を反転させたり、初期値を変えたりしても駄目です。
32ビットのデータを入力して、16ビットのCRCを作りたいわけです。

具体的には、こんな感じです。
 元のデータ => CRC
 00000000 => B362
 80014011 => 718C
 40010010 => FBB9
 50010001 => B0DF
 60000000 => D892

どうやらCRCの生成方法は、PCI Expressの仕様書を読まないとわからないようです。
というわけで、仕様書をみるとちゃんと書いてありました。

現在開発中のIPコアでは、まずはデータリンク層パケットを自由に送受信したいので、
16ビットCRCを例に生成方法を調べてみることにしました。

仕様書によれば、
・多項式は100B
・初期値はFFFF
・演算結果を全ビット反転(NOTを取る)する。
・Byte0のBit0を一番先に入力する。(ビットリバースされた感覚)
・出力もビットリバースする。

とのことです。
図で書くと、次のようになります。
Pcie_dllcrc

確かにこの回路をシミュレーションさせてみると、予想どおりの結果が出ました。
しかしこれを実際の回路で使うわけにはいきません。
なぜならば、この回路でCRCを計算すると32クロックを要するからです。

PCI Expressのデータを8bit幅で処理しようとすると、FPGAの動作速度は250MHzになります。
データリンク層パケットは8バイトなので32μ秒で送信されるわけですから、CRCの計算に128μ秒も費やしてはいられません。
ここは、CRCを1クロックで計算する回路が必要になります。

32bitのデータを処理して16bitのCRCを作ればいいわけですから、シフトとXOR演算の操作は32回行われます。
この1回1回の操作を、VHDLでいうところのfunction文で書いてみますと、

function crc_shift ( reg_in : std_logic_vector(15 downto 0) ; bit_in : std_logic)
 return std_logic_vector is
 variable tmp_out : std_logic_vector(15 downto 0);
 begin
  if((bit_in xor reg_in(15)) = '1') then
   tmp_out := (reg_in(14 downto 0) & "0") xor x"100B";
    else
   tmp_out := (reg_in(14 downto 0) & "0");
    end if;
  return tmp_out;
end crc_shift;

となります。

これを32回繰り返すのですが、毎回クロックでシフトすると32クロックかかります。
ここは思い切って、32入力16出力の組み合わせをエイヤッと一発で計算する回路を作りましょう。

論理式で書くと気が遠くなりそうですが、VHDLで書くのは簡単です。
32ビットの入力データ din を処理しようとすると、

process(din)
 variable crc_tmp : std_logic_vector(15 downto 0);
 begin
 crc_tmp := x"FFFF";
  U1 : FOR I in 0 to 31 loop
   crc_tmp := crc_shift(crc_tmp,din(I));
  end loop;
 crc <= crc_tmp;
end process;

こんな感じで計算できるわけです。

きっと、論理合成ツールの中ではものすごい論理式が出来上がっていることでしょう。

WebPACKでSpartan3用に論理合成した場合、Translateの際に出る動作速度予測は122MHzとなりました。
Implementすれば125MHzで動きますので、PCI Expressのデータを16ビット幅で処理すれば間に合います。

合成された論理式がどんなのになるのかは、想像がつきませんが、ちょっとだけ手計算してみることにします。
入力されたデータをb(m)....b(m)とします。(mは0から31)
計算途中のデータをx_n(m)で表すことにします。
ここで、nはシフト演算の回数を、mはビット番号を表します。
32回シフト演算を繰り返せばCRCは計算完了ですから、x_32(m)は出力結果を表すことになります。
また、x_0(m)は初期値(=all 1)を表します。

では、計算してみます。なお、+はXORを表します。
x_1(0) = b(0) + x_0(15) = b(0) + 1
x_1(1) = b(0) + x_0(15) + x_0(0) = b(0) + 1 + 1 = b(0)
x_1(2) = x_0(1) = 1
x_1(3) = b(0) + x_0(15) + x_0(2) = b(0) + 1 + 1 = b(0)
x_1(4) = x_0(3) = 1
x_1(5) = x_0(4) = 1
x_1(6) = x_0(5) = 1
x_1(7) = x_0(6) = 1
x_1(8) = x_0(7) = 1
x_1(9) = x_0(8) = 1
x_1(10) = x_0(9) = 1
x_1(11) = x_0(10) = 1
x_1(12) = b(0) + x_0(15) + x_0(11) = b(0) + 1 + 1 = b(0)
x_1(13) = x_0(12) = 1
x_1(14) = x_0(13) = 1
x_1(15) = x_0(14) = 1

1回のシフトとXOR演算を施した後の結果ビットはこのような感じです。
普通の例題に出てくるようなCRC生成回路ならばここで1回クロックを入れるでしょう。
ですが、どんどん次に行きます。
x_2(0) = b(1) + x_1(15) = b(1) + 1
x_2(1) = b(1) + x_1(15) + x_1(0) = b(1) + 1 + b(0) + 1 = b(0)+ b(1)
x_2(2) = x_1(1) = b(0)
x_2(3) = b(1) + x_1(15) + x_1(2) = b(1) + 1 + 1 = b(1)
x_2(4) = x_1(3) = b(0)
x_2(5) = x_1(4) = 1
x_2(6) = x_1(5) = 1
x_2(7) = x_1(6) = 1
x_2(8) = x_1(7) = 1
x_2(9) = x_1(8) = 1
x_2(10) = x_1(9) = 1
x_2(11) = x_1(10) = 1
x_2(12) = b(1) + x_1(15) + x_1(11) = b(1) + 1 + 1 = b(1)
x_2(13) = x_1(12) = b(0)
x_2(14) = x_1(13) = 1
x_2(15) = x_1(14) = 1

2回目の演算を施すと、XORが2回重なって消えるなどのところが出てきます。
演算の線形性を感じます。

次、3回目。
x_3(0) = b(2) + x_2(15) = b(2) + 1
x_3(1) = b(2) + x_2(15) + x_2(0) = b(2) + 1 + b(1) + 1 = b(1)+ b(2)
x_3(2) = x_2(1) = b(0)+ b(1)
x_3(3) = b(2) + x_2(15) + x_2(2) = b(2) + 1 + b(0) = b(0) + b(2)
x_3(4) = x_2(3) = b(1)
x_3(5) = x_2(4) = b(0)
x_3(6) = x_2(5) = 1
x_3(7) = x_2(6) = 1
x_3(8) = x_2(7) = 1
x_3(9) = x_2(8) = 1
x_3(10) = x_2(9) = 1
x_3(11) = x_2(10) = 1
x_3(12) = b(2) + x_2(15) + x_2(11) = b(2) + 1 + 1 = b(2)
x_3(13) = x_2(12) = b(1)
x_3(14) = x_2(13) = b(0)
x_3(15) = x_2(14) = 1

次、4回目。
x_4(0) = b(3) + x_3(15) = b(3) + 1
x_4(1) = b(3) + x_3(15) + x_3(0) = b(3) + 1 + b(2) + 1 = b(2)+ b(3)
x_4(2) = x_3(1) = b(1)+ b(2)
x_4(3) = b(3) + x_3(15) + x_3(2) = b(3) + 1 + b(0) + b(1) = b(0) + b(1) + b(3)
x_4(4) = x_3(3) = b(0) + b(2)
x_4(5) = x_3(4) = b(1)
x_4(6) = x_3(5) = b(0)
x_4(7) = x_3(6) = 1
x_4(8) = x_3(7) = 1
x_4(9) = x_3(8) = 1
x_4(10) = x_3(9) = 1
x_4(11) = x_3(10) = 1
x_4(12) = b(3) + x_3(15) + x_3(11) = b(3) + 1 + 1 = b(3)
x_4(13) = x_3(12) = b(2)
x_4(14) = x_3(13) = b(1)
x_4(15) = x_3(14) = b(0)

4回のシフトで、結果ビットの左端が初期値の'1'ではなくなりました。
次からは計算がややこしくなります。

次、5回目
x_5(0) = b(4) + x_4(15) = b(4) + b(0)
x_5(1) = b(4) + x_4(15) + x_4(0) = b(4) + b(0) + b(3) + 1
x_5(2) = x_4(1) = b(2)+ b(3)
x_5(3) = b(4) + x_4(15) + x_4(2) = b(4) + b(0) + b(1) + b(2)
x_5(4) = x_4(3) = b(0) + b(1) + b(3)
x_5(5) = x_4(4) = b(0) + b(2)
x_5(6) = x_4(5) = b(1)
x_5(7) = x_4(6) = b(0)
x_5(8) = x_4(7) = 1
x_5(9) = x_4(8) = 1
x_5(10) = x_4(9) = 1
x_5(11) = x_4(10) = 1
x_5(12) = b(4) + x_4(15) + x_4(11) = b(4) + b(0) + 1
x_5(13) = x_4(12) = b(3)
x_5(14) = x_4(13) = b(2)
x_5(15) = x_4(14) = b(1)

次、6回目
x_6(0) = b(5) + x_5(15) = b(5) + b(1)
x_6(1) = b(5) + x_5(15) + x_5(0) = b(5) + b(4) + b(0)
x_6(2) = x_5(1) = b(4) + b(0) + b(3) + 1
x_6(3) = b(5) + x_5(15) + x_5(2) = b(5) + b(1) + b(2)+ b(3)
x_6(4) = x_5(3) = b(0) + b(1) + b(2) + b(4)
x_6(5) = x_5(4) = b(0) + b(1) + b(3)
x_6(6) = x_5(5) = b(0) + b(2)
x_6(7) = x_5(6) = b(1)
x_6(8) = x_5(7) = b(0)
x_6(9) = x_5(8) = 1
x_6(10) = x_5(9) = 1
x_6(11) = x_5(10) = 1
x_6(12) = b(5) + x_5(15) + x_5(11) = b(5) + b(1) + 1
x_6(13) = x_5(12) = b(4) + b(0) + 1
x_6(14) = x_5(13) = b(3)
x_6(15) = x_5(14) = b(2)

手計算だとたぶんどこかで間違えるので、このへんにしておきます。

何となく感じがつかめてきました。
このようにやっていくと、いつかそのうち A xor Aのようになって消える項が出てくるのでしょう。
いずれにせよ、CRCの各ビットは、32入力以下のXORゲートの塊で作れるだろうということが想像できます。

| | コメント (1)

2007.01.08

基板設計は楽しい

昨日設計したDAC変換基板を、P板に製造注文する予定です。

P板は祝祭日は営業していないので、今日出図しても明日しても、出来上がってくるボードの納期は変わりません。どうせなら別の基板を面つけして、いろんな基板を一緒に作ることで個々の基板にかかる費用を安くしようと思いました。

そこで、DA変換チップを、ADV7123からAD9753へ変更したボードを新たに設計しました。
DACボード2枚目

上の図のように、構造は昨日の基板とほとんど同じです。
DACのチップだけ変更して、オペアンプの部分やDAを駆動するFPGAの部分などは使いまわしです。

2層基板なので配線が厳しいかと思われましたが、十分にGNDはベタっぽくすることができました。
こんな基板に300MHzもの信号を流して本当に大丈夫かと思われますが、それは作ってみて判断します。
Dacboard3

周波数が高くなってくると、いろいろな問題がおきるのですが、特にディジタル回路では以下のような問題が発生します。
 1. グラウンドバウンス
 2. 電源の電圧降下
 3. 信号波形の乱れ
 4. 放射ノイズ

これらの問題のうち、1と2は電源のインピーダンスを十分に下げること、2は適切にパスコンを挿入することが効いてきます。基板を4層や6層にして、優秀な電源を使い、コンデンサをベタベタいれれば、それなりに解決できる問題でしょう。

3の信号波形の乱れが起きる原因としては、信号の反射、クロストーク、減衰、インダクタンスやキャパシタンスによる鈍りなどがあります。これが厄介な問題です。

これらの問題のいくつかには、インピーダンスマッチングや、リターンパスの確保などが効いてきます。
特に基板を4層や6層にすると非常に有効です。

なぜならば、電気信号は1本の線の上を伝わっていくのではなく、信号線とGND(など)の間の電界の変化として伝わっていくからです。つまり、多層基板にしてGND層を作れば、信号は表面のパターンとGND層との間の絶縁体の中を電界として伝わっていくことができるからです。

しかし、両面基板ではどうしても信号の裏側を完全なベタGNDにすることができません。そうなると、信号は、近くのGNDのラインとの間に電気力線を張りながら、苦しそうに伝わっていきます。結果として、反射や減衰、干渉などが酷くなります。
今回の基板は両面基板なので信号の通るパスの品質は最悪でしょう。本来ならば150MHzや300MHzのディジタル信号を流すべき環境ではありません。でも、波形の劣化に最も影響してくるのは、信号が走る距離だと考えていますので、なんとかなるかもしれません。
もし駄目なら駄目で、駄目な波形を見てみたいのでやってみることにします。

本当は専門の業者さんに多層で設計をお願いしたいところなのですが、このDAC評価はちょっと急ぎなので、自分で設計してP板.comに2日コースで注文します。

さすがにP板の2日コースは初めてです。
それにしても基板設計は楽しいですね。ついつい時間を忘れてのめりこんでしまいます。

| | コメント (2)

2007.01.05

アナデバの高速DAC

高速なDA変換ボードを作ろうとしています。

目標とするサンプリングレートは300MHz。精度は10bit程度です。

調べていくと、超高速なDAコンバータの中には「Interpolating」と書かれた品種がかなり多く存在することがわかってきました。最初、DACのInterpolatingが何のことかよくわからなかったのですが、データシートによれば、サンプリングレートは1.2Gspsだけどデータ入力速度は150MHzまでとかいうのが多いようです。
それらに共通する特徴としては、チップの内部にフィルタや、SINやらCOSの生成回路、そして乗算器が入っています。

下の図は、AD9777というInterpolating型DAコンバータの等価回路の一部です。DACの前段に、HALF-BAND Filterや、SIN、COS、そして乗算器が入っているのが確認できます。

インタポレーションタイプのDAコンバータ
アナデバのサイトから引用

近年の高速な通信(ADSLなど)では、許された帯域を最大限に使うため、デジタル変調が使われることが多くなっています。ディジタル変調では、元の信号にSINやCOSをかけるという作業がよく行われますが、どうやらこれらをDAコンバータの中でやってくれるようです。
そうなると、例えば、DAコンバータの出力は1Gサンプリング/秒であっても、入力する信号はその半分や、4分の1、8分の1のレートになります。つまり、DAC内部でSIN、COSと掛け算して出力するので、DACに入力するレートは出力レートよりも遅くなるわけです。
こういうInterpolating型のDAコンバータは、ディジタル通信に使う場合では便利なのかもしれませんが、逆に与えたデータを素直にDA変換して欲しいときには邪魔になります。

というわけで、「Interpolating」は不可。300MHz以上で8bit以上という条件で再度調べます。
この条件にマッチするDAコンバータを調べたところ、アナデバとMAXIMで何種類かヒットすることがわかりました。

そこで注目したのが、AD9753とADV7123。

AD9753は普通の素直な12bit-DAコンバータですが、データの入力するポートが2ポートあり、中でインターリーブして切り替えてくれるようです。つまり、300MHzのサンプリングレートで出力したい場合でも、それぞれのポートに150MHzの速度でデータを入力すればよいらしいです。
こうすることで、基板上のシグナルインテグリティが多少は容易になるものと思われます。

恐ろしいのは、ADV7123。
ADV7123は10-bit 330MHzのDAコンバータが3個入ったチップです。
何が凄いかっていうと、330MHzのレートで、しかも標準的なTTLレベルで10bitのデータを入力するようなのです。
しかも、アナログ電源しかないのです。
アナログ電源とディジタル電源が分離されていないのです!
ADV7123のピン配置

うーん、はたしてちゃんと動くのでしょうか。
ADV7123は通信用途じゃなくビデオ用とのことなので、多少データが化けたとしても、画像の淵が汚くなるくらいだから致命的ではない、と考えて設計されたチップなのでしょうか・・
それとも、330MHz TTLレベルの信号でも、信号の走る距離が短ければデータは化けないと考えているのでしょうか。

非常に興味があるので、このDAコンバータをとりあえず動かす基板を設計してみました。
DAコンバータの後ろには、超高速の電流帰還オペアンプが載っています。

設計した300MHz DACボード

この基板の上を300MHzのTTLレベルの信号が走るわけです。

4層にしようかと思いましたが、納期が1日長くなるのと、アナログ部は十分にベタパターンっぽくできたので、両面基板でいくことにしました。
P板に2日コースで発注しようとしたら、3時を回っていたので、今日は断念。
来週の火曜日の朝いちで、別の基板と面付けして出図することにします。

今回の基板は急ぎの実験用なので、次の設計ではAD9753を使った基板で、6層、等長配線で作ると思います。さすがに330MHz TTLは怖いです。

| | コメント (1)

2007.01.03

PCI Express 起動後最初のパケット

PCI Expressのパケットには大きく分けて、TLP、DLP、PLPの3つの種類があります。

PLPは、Ordered-Setとも呼ばれる信号で、リンクの確立や速度あわせ、ビット・フレーム同期などに使われます。これは物理層ロジック同士の間で送受信するものです。

DLPは、リンク層(PCI Express第2層)がやりとりするためのパケットで、フロー制御、ACK/NACK、パワーマネージメントなどの目的に使われます。

TLPは、データを送受信するためのパケットで、メモリRead/Write、IO Read/Write、Configuration Read/Write、Messageなどが規定されています。

DLPの中のフロー制御はPCI Expressにおける重要なメカニズムで、これを無視するとTLPが一切やりとりできません。PCI Expressは互いのバッファの空き容量に関する情報を交換して、空きがあると判断した場合にしかTLPを送れないからです。
したがって、リセット後の初期化シーケンスにおいてPLPをやりとりしてリンクが確立できたら、まず最初にフロー制御の初期化を行います。

フロー制御の初期化パケットは、タイプ①とタイプ②の2種類あって、パソコン側からタイプ①で送られてきた情報と同じ情報をタイプ②のパケットにのせて送り返してやればいいようです。

ところが、このパケットをFPGAで作ろうとしたら、非常に難しいことがわかりました。
なぜかというと、DLPは次のような構造をしているのですが、このCRCの計算方法がわからないのです。
「(スタートシンボル 8bit) (情報部分32bit) (CRC 16bit) (エンドシンボル 8bit)」
32bitの情報部分にどのような演算を施して16bitのCRCを作るかがわからないのです。

私が参考にしている「PCI Express System Architecture」という本には、CRCの生成方法について一切記載されていません。

というわけで、とりあえず動きだけでも見てみたいということで、パソコンから送られてきたパケットを何も処理せずにそのまま送り返すことにしました。すると、見事にパソコン(の中のチップセット)は正規の初期化手順だと思ってくれました。

そしてフロー制御が初期化され、最初のTLPが送られて来ました。
Firsttlp_1

これを解読してみましょう。
1FB 00 00 74 00 00 01 00 E0 00 50 00 00 00 00 00 00 00 00 00 00 00 00 EB 48 93 AB 1FD
最初と最後の「1FB」「1FD」は、それぞれK27.7、K29.7のシンボルで、これはTLPの開始と終了を示す制御ワードです。
TLPの構造は、
「STP シーケンス番号(2Byte) ヘッダ(12 or 24Byte) データ(0~4096Byte) ダイジェスト(4Byte) CRC(4Byte) SDP」
となっています。

したがって、記念すべき最初のパケットは、
シーケンス番号が 0000
ヘッダが74 00 00 01 00 E0 00 50 00 00 00 00 00 00 00 00
データが00 00 00 00
CRCがEB 48 93 AB
と解釈できます。

ヘッダの74 00 00 01は、データ長が1DW(=4Bytes)の、「Message Request With Data」というパケットを示しているようです。
最初のパケットはConfiguration Readだと思っていたのですが、Message関係でした。
Messageというのは、割り込みやエラー通知やパワーマネージメントなどの情報を乗せて送るためのパケットです。

「00 E0 00 50」がそのメッセージの詳細を示しています。調べたところ、最初の2バイトの00E0は、バス番号E0、デバイス番号0、ファンクション番号00のデバイスが送出したパケットということを示していて、最後の50はメッセージの種類を示していて、「Slot Power Message」というメッセージだそうです。

このパケットは、データリンク層がリンクアップすると自動的に送信されると書かれています。このパケットを受け取ったら内部のレジスタに保存しておけばいいようで、特に。


どうやって返事をすればよいのかわかりませんが、ACKを返せばよいのでしょうか。

うーむ、なかなかPCI Expressの通信の本体が出てきませんね。
早くConfiguration Read要求などをみてみたいのですが・・

どうやらこれより先に進めるには、16-bit CRCの生成方法を考えなければいけないようです。


ちなみに、このMessageパケットをパソコン側にそのまま送り返したところ、およそ180ns後にACKとフローコントロールを返してきました。PCI Expressでは、送信したパケットが相手側で受信され処理されて応答が帰ってくるまでには、そのくらいの遅延時間がかかるのかもしれmさえん。

| | コメント (0)

2007.01.01

謹賀新年

あけましておめでとうございます。

昨年は、展示会や講演などを通じて多くの皆様にお会することができ、貴重な時間を過ごさせていただきました。
また、秋葉原という恵まれた環境に事務所を構えることができました。
これもひとえに皆様からの暖かいご支援の賜物でございます。

弊社はこれまでJTAGバウンダリスキャンを組込み開発に応用する技術の開発のために邁進して参りましたが、今年はそれに加えて、JTAGをより簡単に使えるようにするための技術開発や、PCI Express IPコアを誰にでも身近に使えるようにするための技術開発などを目標として頑張ってまいります。

皆様、平成19年も特殊電子回路㈱ならびにMITOUJTAGをよろしくお願いします。


| | コメント (0)

« 2006年12月 | トップページ | 2007年2月 »