« 2013年11月 | トップページ | 2014年1月 »

2013.12.31

2013年をふりかえって

この1年は、2012年でボロボロになった体制を立て直すのに必死でした。でも、引っ越しを機に運勢が変わり、なんとか乗り越えられました。そして、2014年に向けて変えていかなければならないことが多数あることに気付きました。

総括

ざっと振り返ってみると、今年の前半は2012年を引きずっていて、その解消に奔走していました。2012年にピンク色の基板に手をだしてしまった結果、資金的に非常に苦しい事態に追い込まれました。その資金難を解消すべく受託開発を増やした結果、特電オリジナル製品の開発ができなくなりました。

2012年~2013年3月ごろまで、受託開発やRXマイコンばかりやって自社のオリジナル製品の開発を怠っていました。そのため、本来やるべきJTAGやFPGAの開発に大きな遅れを出してしまいました。ある人が言った「特電のハブられ感が半端ない」という言葉でふと我に返りました。このままRXマイコンをやってもその先には何もないとはっきりと悟ったのです。

本来やるべきJTAGとFPGAという特電の使命を思い出し、Artix-7ボードの開発やADCボードの開発をはじめました。


風水について

風水もいっぱいやりました。現状を打破するために、3月に非常に資金的に無理をして引っ越しをしました。一時的に無理をしてでも運がよさそうな物件に引っ越して大正解でした。その結果、運勢がよくなったのをはっきりと実感しました。

前のビルは2007年ごろから5年間入居していたのですが、その5年間、特電は本当に停滞していました。新しいビルに移ってから半年くらいして「今のままFPGA評価ボードを作っていてはいけない」ということに気が付きました。前のビルにいては決して気が付かなかったでしょう。

・古いビルにいたとき(~2013年3月)

  • 経営状況・・・いつも苦しく借金まみれ
  • ビルの質・・・暗く陽が当たらない。周囲には廃墟ビルが点々。不動産屋とは内容証明を送る仲。
  • スタッフ・・・喚き叫ぶバイト君。
  • 新製品・・・Raxino-i (\9,800)
  • 展示会・・・ルネサスエンジニアセミナー(2012年9月)、ETに無理して出展
    2013_raxinoi

・新しいビルに移ってから(2013年3月~)

  • 経営状況・・・不思議なことに改善した。未来のことが考えられるようになった。
  • ビルの質・・・新しく明るく、川の眺望がすばらしい。オーナーさんはとても良い人。
  • スタッフ・・・優秀な学生アルバイトさんが来てくれた!
  • 新製品・・・Artix-7ボード(\80,000)、8ch 高速ADCボード(10万円台なかば)
  • 展示会・・・XILINXのセミナー(2012年8月,9月)、ETに楽に出展

    2013_artix2013_adc

2012年と2013年では、このように全然違いました。纏めてみると唖然とします。古いビルにいた5年間、年々下がってきた感じがしていました。2013年は特別に我武者羅に努力をしたわけではありません。引っ越しただけでこんなに違います。これが風水の効果でなくて何だというのでしょう。

具体的に何をやっていたのか

何をやっていたのかを思い出してみます。

1月~3月

2013_rxdip

1月~3月は、受託開発のモータ制御基板を作りながら、RX-DIPのような小さいマイコン基板を開発したりRXduinoをCubesuiteに対応させたりして、まだRXマイコンを何かしようと頑張っていたように思われます。

3月に神田川のほとりのビルに引っ越しをしました。その時点から何か運勢が変わり始めた気がします。

4月~6月

4月から運が開けてきた気がします。RXマイコンにも見切りをつけることができました。理不尽に抱えさせられていた大量の型番違いのRXマイコンをR社に処分してもらい、ようやく過去との決別ができました。Twitterとヤフオクのおかげです。

2013_pcie

ADCやZYNQの設計依頼が急に舞い込んで、新しい風が吹き始めました。5~6月にはArtix-7ボードを設計しました。EZ-USB FX3の仕事を受託したことでやる気が出て、高機能で使いやすいIPコアを開発することができました。EZ-USB FX3のソフトもサクサクと開発できるようになってきました。

PCI Express本の無事に出版できました。4月にはとても優秀なアルバイトの学生が入ってくれた入ってくれたのも嬉しいことです。月刊特電のVol3も出版できました。

 

7月~9月

2013_hdmi

AXIやEZ-USB FX3の勉強をしながら、Artix-7のHDMI出力サンプル回路などを開発したり、Artix-7にLinuxを移植するなどをしていました。そうしたら、幸運なことにXILINXのプライベートな展示会に出られることになりました。

月刊特電別冊の「Artix-7の基礎知識」も無事に出版できました。

Artix-7とSpartan-6用のI/O拡張ボードというのも開発したのですが、結局、発売しないまま年を越してしまいました。

10月~12月

2013_etすごく久しぶりにMITOUJTAGを更新しました。RXマイコンのほうも、長年の懸案だったイーサネットやTCP/IPもそれなりに動くようになりました。このあたりからA/D変換拡張ボードなるものを設計しはじめました。きっと来年には販売できるでしょう。

また、運良く、ET2013にはXILINXブースの中で出展することができました。

経営的にも落ち着いてきたし、このままやっていけばあと1~2年は食べてはいけるでしょう。だけど、何もしなければ先細りになるのは明白です。今のままの特電ではいけないと思い始め、大規模な構造改革を決意しました。

そして、人を増やして会社を大きくしていこうという決意と、人材育成のための方針ができました。


いろいろあったけど、ようやく過去のしがらみを断ち切ることができました。来年は今までとは違った方向に成長していきたいと思います。

| | コメント (0)

Excelで汎用の計測用マクロを開発中

Excelはとても便利なツールです。ビジネス用途はもちろん、実験データの整理、家計簿、お絵かき、なんでもできる素晴らしいソフトです。

そこで、ExcelからFPGAボード用のUSB DLLを呼び出して、AD変換で得られた結果をそのままシートに貼り付けて活用できるようにしようと考えています。

こういうネタは過去にもやっていたし、ダウンロードもできるようにしていたですが、A/D変換の性能を知るためにもヒストグラムと正規分布も表示させたくなったので、新しく作り直すことにしました。

今日の作った画面がこちら。

Excel_adc

上にずらっと並んだボタンを押すと、キャプチャしたり、ヒストグラムを取ったり、FFTしたりということができるようにしようと目論んでいます。

このシートの肝はExcelのVBAです。

Excel_adc_macro

VBAマクロの先頭で

Declare Function TKUSBFX3Open Lib "tkusbfx3.dll" (ByVal num As Long, ByRef vid As Integer, ByRef pid As Integer, ByVal DeviceName As String, ByVal MaxDevnameLength As Long) As Long
Declare Sub TKUSBFX3Close Lib "tkusbfx3.dll" ()
Declare Function USBReadData Lib "tkusbfx3.dll" (ByVal addr As Long, ByRef Buffer As Byte, ByVal Length As Long, ByVal Flag As Integer) As Long
Declare Function USBWriteData Lib "tkusbfx3.dll" (ByVal addr As Long, ByRef Buffer As Byte, ByVal Length As Long, ByVal Flag As Integer) As Long

とやっておけば、DLLの中の関数を呼び出せるっていうわけです。

キャプチャしたデータは「生データ」ボタンを押せば見えます。

Excel_adc2

ノイズ波形ばかりみていてもつまらないので正弦波を入れてみます。

Excel_adc3

ちゃんとグラフの範囲が自動調整されました。

結論を言うと、作成した18bit ADC装置のノイズ電圧の標準偏差は62uVくらいという結果になりました。これはLSBの2個分に相当します。このA/D変換IC AD7986の性能がまあまあ出せていると思われます。

できればExcelでヒストグラムと正規分布を重ねて描画したいのですが、ググったところ、結構大変そうです。

| | コメント (1)

2013.12.30

ディジタルアイソレータを削除したらA/D変換性能が改善した

不可解な現象に遭遇しました。

アナログ部とディジタル部を分離するためのディジタルアイソレータ(SI8641)を削除したら、A/D変換の結果たるヒストグラムが改善したのです。

ディジタルアイソレータを取り外した後の基板。ちょっと汚いですが、自宅で作業しているため洗浄ができないのでご容赦ください。

Adc_bypass_buf

まずADCの入力をショートしてみた結果。半値幅=3(約93μVに相当)なので、これは従来と同じです。なお、半値幅=3というのは、このA/Dの素の性能なので問題ありません。よくできています。

Adc_short_byp

ADC入力ショート時のADC結果

次にOPアンプからの入力をつないだ結果。半値幅=4(約124μV)のときが出てきました。

Adc_op_byp

OPアンプ出力からのADC結果

ディジタルアイソレータを使っていたときには半値幅=6(約186μV)くらいにまで揺らぎが上昇してしまったので、大幅な改善が見られました。

OPアンプは、THS4521とTHS4130の両方を試してみましたが、大差はありませんでした。つまり、OPアンプのノイズよりもADC自体のノイズのほうが大きいというわけです。

次にDACからの入力を入れてみた結果です。

こんな正弦波が入ってきています。

Adc_short_wave_2

DACが動作していることを確認

このDACの出力を止めて(固定値を出させて)ADCでとってみたときのヒストグラムは、こうなりました。

Adc_short_dac

DAC(固定)→OPアンプ→同軸ケーブル→OPアンプ→ADCの変換結果

半値幅は5なので、150μVくらいのゆらぎということになります。

ADCとFPGAとの間をディジタルアイソレータ(SI8641)でつなぐのではなく、抵抗を介して直結したほうがノイズが少ないというのは一見すると不可解な現象です。この原因を追究していきたいと思います。

SI8641は内部に発振器とコイルのような電磁結合の構造を持っていて、入力信号のH/Lで変調されたパルスを伝えることでディジタル信号を伝達しています。この発振が悪いのかもしれません。

とりあえず、「半値幅」といういい加減な指標ではこれ以上の評価は難しいので、Excelのマクロを改良して標準偏差をとれるようにしてみたいと思います。

ディジタルアイソレータ(SI8641)

| | コメント (0)

2013.12.27

FX3とFPGAをつなぐデザインで短いパケットを送信

特電FX3ボードやArtix-7ボードは、EZ-USB FX3を搭載しています。そして、EZ-USB FX3とFPGAとを接続するためのサンプルデザインやコアを配布しています。

このコアは数KB~数MBといった大きなサイズでデータを転送するのは問題なかったのですが、どうやら2バイトとか4バイトとか、短いデータを送ると動作が怪しいという問題がありました。

まず、特電FX3 APIにあるUSBWriteData()で20バイトのユーザデータを送ってみます。この関数は3DWのヘッダをつけて送るので、USB上にはトータルで32バイトのデータが流れます。

Fx3out_old_20

このようにrdata_validという信号が8クロック分アクティブになりました。これは正常に送れています。後ろのほうが細切れになっているのは、FX3のWaterMarkという機能を使って転送速度を制限しているからです。(詳細はFPGAマガジン Vol3の私の記事を参照)

このAPI関数とFPGAのデザインでは、ユーザデータの前に3DWのヘッダ(マジックワード + 転送帳 + 転送先アドレス)を送ることにしています。

次はユーザデータを8バイトにした場合です。3DWの後にデータが1DWしかありません。最後の1DWのデータのときにrdata_validが出ていないのです。

Fx3out_old_8

この現象は、USBWriteData()関数で8バイト以下のサイズを指定したときに生じることがわかりました。原因は何かというと、EZ-USB FX3が出すFLAGのタイミングの問題です。

FX3のFLAGはEndPointのFIFOの残量を示しているのですが、出てくるのが遅く、数クロック前の状態を示しています。このため、普通に1つのFLAGだけを見てSlaveFIFOのやりとりをすると、終了タイミングを正しく知ることができません。

今まで長いBulk転送の最後の部分でのみFLAGを正しく待つためにWaterMark機能を使って速度制限をしてきましたが、転送の最初でもやらなければならなかったようです。

つまり、CyAPIに8バイトとか16バイトとかのサイズでXferDataをすると、FX3のFIFOの中のデータが最初から少ないことになります。こういう場合に全速力でReadしてしまうとFX3が出すFLAGの値が正しい結果となりません。

これを修正するには、fx3sfsync16p.vhdの258行目あたり

    when 1 => -- out transfer
        fx3_pktend <= '1';
        fx3_slrd <= '0';
        fx3_sloe <= '0';
        outack <= '0';
        ustate <= ustate + 1;

    when 1 => -- out transfer
        fx3_pktend <= '1';
        fx3_slrd <= '0';
        fx3_sloe <= '0';
        outack <= '0';
        if(fx3_flagb = '1') then
            ustate <= ustate + 1;
        else
            fastread <= '0'; -- 低速受信に切り替え
            ustate <= 7; -- WAITステートへ飛ぶ
        end if;

に修正します。fx3_flagbというのがWaterMark機能によるalmost_emptyフラグなのです。転送したくても残りが少なければfastreadというレジスタを0にして、WAITするためのステートへ飛ぶというわけです。

修正した回路では次のような波形になりました。まず4バイトの送信の場合。

Fx3out_new_4

rdata_validが1クロック分のパルス4つになりました。3DWのヘッダと1DWのユーザデータをゆっくりと受け取れていますので、正しいFLAGの値を見ながら動けています。

次に8バイト送信した場合。パルス5発分になりました。

Fx3out_new_8

次は12バイト、16バイト、20バイト、24バイト、28バイトの場合。

Fx3out_new_12 Fx3out_new_16 Fx3out_new_20 Fx3out_new_24 Fx3out_new_28


1つずつパルスが増えていきます。しかし5クロックに1回しかパルスが出ないので100MHz/5×4 = 80MB/secの速さでしか転送できていません。

転送サイズが32バイト以上になると

Fx3out_new_32

このようにバースト転送になりました。ゆえに大きなパケットでは速度の低下はありません。

これで小さいサイズのパケットでも、大きいサイズのパケットでも、任意のサイズのパケットで安定して通信できるようになりました。

●特電Artix-7評価ボード

http://www.tokudenkairo.co.jp/art7/

| | コメント (0)

2013.12.26

Artix-7ボード用のEZ-USB FX3ライブラリを更新

Artix-7ボード用のEZ-USB FX3ライブラリとサンプルアプリを更新しました。

tkusbfx3.dllの主な更新点は何かというと、

  • エクスポートする関数にWINAPIをつけた
  • BulkIn/BulkOutのタイムアウトを設定できるようにした
  • 転送サイズを設定できるようにした

Fx3update20131227


① まず、WINAPIの件ですが、これまで公開していたDLL(バージョン0.5)ではWINAPIが付いておらずcdeclか何かの規約で呼び出されていたと思います。誠に申し訳ございません。今回のバージョン1.1からは、WINAPIにしたので安全にコールできます。また、ExcelなどからActiveXで呼び出すこともできるようになりました。

② 次にBulkIn/BulkOutのタイムアウトですが、CypressのEZ-USB用ライブラリではデフォルトで10秒でタイムアウトするようになっています。この時間を変更して短くしたり、無限に待たせることができるようになりました。

TKUSBSetTimeout(0xffffffff);

とやれば、BulkINで無限に待ちます。

③ 転送サイズの件はちょっと厄介です。これまでのDLLは、ユーザデータを8MByte単位で細切れにしてCypressのAPIを呼びだすようにしていたのですが、メモリが1GBしかないAtomマシンではデバイスドライバの動作が不安定になって、最悪ハングアップしてしまうのです。おそらくCypressのドライバの内部の問題だとは思いますが、転送サイズをデフォルトで1MBに制限しました。ただし、転送サイズを小さくすると速度に影響する可能性があるので、サイズを大きくしたい場合にはTKUSBSetTransferSizeという関数で変更できるようにしておきました。

デフォルトの転送サイズを1MBに制限することで、AtomのノートPCでも、Windows Embedded機でも問題なく動作するようになりました。

アプリのほうも改良をしました。

Fx3_winapp

まず、今までは転送エラーが起きたり、アプリ起動後にArtix-7ボード(またはFX3ボード)を挿したりすると動作が続行できなくなってしまっていました。まず、この点を直しました。

転送エラーで止まっても再びINやOUTのボタンを押せばデータの転送ができるようになり、またアプリ起動とボード挿入をどちらを先にやってもよくなりました。これでより使い勝手がよくなったと思います。

新しいAPIや、そのソースコードは下記のURLからダウンロードできます。

http://www.tokudenkairo.co.jp/art7/download.html

| | コメント (0)

2013.12.25

ちょこっとサイトをリニューアル

特電のサイトをちょこっとリニューアルしてみた。

Site20131225

トップページの幅を1000pxにして、右側にブログの更新情報とツイッターのつぶやきを出してみた。ブログの更新情報を出すにはRSSを使えばよいというのを今更ながらに知った。

それからサイトの上側を広くして、よくあるお問い合わせである支払方法や発送方法をアイコンで示してみた。

もはや上に出ている「トップページ」「製品情報」「ブログ」「JTAG情報」「会社紹介」というリンクナビゲーションはいらないんじゃないかなと思えてきた。左側にサイトの内容をカテゴリごとに表示して、どのページにも2クリック以内でたどり着けるようにした。

| | コメント (1)

2013.12.23

特電のホームページをリニューアルしたい

特殊電子回路のホームページが、もはやわけがわからない構造になっています。

Tokuden_20131224

いちばん最初、特殊電子回路のホームページは、Namo社のHomepage Creatorというマイナーなソフトで作っていました。Homepage Creatorは2003年ごろに購入したソフトなのですが、そのうちバージョンアップされてWebEditorとかいう名前に変わって、それを2008年ごろから使っていたような気がします。

しかし、このソフトはCSSの対応が現代にマッチしていません。太文字に変更する程度のことはできるものの、段組みとかそういうものには根本的に対応していません。また、メニューにカーソルを合わせるとプルダウンでサブメニューが開く、とかそういう動きのあるデザインにもちゃんと対応していません。

極めつけは、Namoは韓国のソフトで新しいバージョンは日本語版がなくなってしまいました。もうWebEditorを使い続けるのが嫌だったので、もっとメジャーなHomePage Builderでも買おうかなと思っていたのですが、何かそれも違うなー、と感じていたわけです。

今の特電ホームページの問題点はいろいろあるのですが、

  1. 更新がやりにくい。
  2. メインの特電ページ以外に、オンラインショップ、JTAG情報、RXduino特設ページ、サポート掲示板、JTAGひろば、など様々なサブサイトが乱立している。
  3. JTAG情報のページと特電メインページの遷移がやりにくい
  4. 特電メインページとオンラインショップの遷移もやりにくい
  5. ユーザが気軽に意見やレビューを書ける場所がない
  6. 特定商取引法の表示など、メインページとオンラインショップの両方に重複している内容が多い
  7. 製品のページのスタイルが製品ごとにバラバラ(10年分の歴史?)で、内容が古い箇所が散見される
  8. 箇所にリンク切れや未着手のページが多数ある

など、様々な問題点があります。

最大の問題点は更新がやりにくいということです。数ギガBytesもある(しかもどこに何があるかわからない)Webサイトのファイル全体をローカルPC上に持っていて、それをFTPで更新する、という古いスタイルが間違っているのではないかと思ったわけです。

そのため、もしHomePage Builderを使ってサイトを作り直しても、結局、ローカルで作ってFTPでアップロードするというスタイルに変わりはないわけです。いずれサイトの更新が面倒になるだろうし、将来的にWeb担当者を入れてもその人に任せるということができなくなるだろうなというのが容易に想像できるわけです。

今、やりたいことは、スタッフの誰もが気軽に更新できて、全体の構造を瞬時に把握できて、階層構造のとおりにナビゲーションが自動的に更新されて、データベースと連携していて、最新情報がわかりやすく更新される、ということです。

特電の現在のホームページは考え方が古すぎるのです。 ホームページの横幅は780くらいにしているのですが、今の基準では狭すぎます。なぜこんな幅になっているかというと、10年くらい前の本に「PCのディスプレイは横幅1024ピクセルで使っている人が多く、Internet Explorerの『お気に入り』が表示されている状況ではさらに狭くなるから780ピクセル前後がベストです」というようなことが書いてあって、そのときの常識で作ったからなのです。

昨今のPCでは横長ディスプレイ多く普及してきているし、そんな昔の常識はすでに通用しませんよね。昔の因習にとらわれて最初のスクロールしない1ページに表示できる情報を自ら制限してしまっていたのです。

それに、10年前の書籍には「HTMLメールは表示できない人も多いからやめましょう」なんてことが書かれていて、(それを真に受けていまでも実践していますけど)、今時HTMLメールが表示できない環境のほうが稀です。

この数日間、本を読み漁って、最近のWeb事情がよくわかってきました。

どうやら最近のトレンドはCMSといって、ブログみたいにWebの画面上からWebサイトを更新できるもののようです。で、CMSにはWordPressが有名であると。

Movable TypeとかDrupalとかもあるのですが、やはり書店で一番多く見かけるのはWordPressの本なので、メジャーなのが一番いいのかなと思います。

WordPressがどこまでカスタマイズできるのか、その可能性を年末年始に探ってみたいと思っています。

| | コメント (0)

2013.12.19

AD変換でいろいろ遊んでいます

AD7986を使っていろいろ試しています。

基本的に完全差動アンプの後にCRフィルタを通って、AD変換器に入るごくふつうの構成なのです。

Adc_conf_1

こうしてADCからキャプチャしてみた結果を、FPGAの空いている端子に出して、MITOUJTAGのバウンダリスキャンを使ってみてみます。

ロジアナモードにして、デコードしたビットを波形として表示させると・・

Adc_conf_2_2

こんな感じで下4bitが激しく動いているわけです。18bitのADCなのに14bitくらいしかないのか、と思われるかもしれません。

そこで使うのがヒストグラムです。

Adc_conf_3

これを見ると半値幅が6LSBなので、まぁ、前回の「ADCのIN+とIN-入力をショートした」場合の半値幅3LSBに比べると増えていますが、OPアンプとか通しているのでこんなものでしょう。

Adc_conf_4

次に、完全差動アンプの入力にさらにOPA211という超低ノイズのOPアンプをつないで、そこにBournsのポテンショメータをつないで、指でぐりぐり回してみました。

先日のExcelで計測するマクロを使っています。

Adc_test_1

このように、ポテンショメータの巻線に由来すると思われる階段状の波形が見えました。

0V付近の電圧を入力したところ、OPアンプのオフセットにより完全にゼロにはならないのですが、このように半値幅6くらいのヒストグラムが得られました。

Adc_test_2

たまに大きな負の値が出ています。

次に、ポテンショメータをまわして、マイナスの電圧を入力してみます。

すると、

Adc_test_3

こんどは上側に髭が出ました。

つまり、+の入力をした場合には下側に髭がでて、-の入力をした場合は上側に髭が出ます。これは何を意味しているかというと、おそらく、ADCがサンプリング動作を行うときに生じる過渡電流が悪さをしているのだと思われます。

データシートに記載されている半値幅は3LSBで、「裸のADC」の状態ではこの値は達成できました。しかしアンプを通すと半値幅が6LSBに増えてしまいます。6LSBならいいんじゃないかと思えるのですが、1LSBが約30μVなので大きいような気もします。

これからもコンデンサを取り換えてみたりいろいろ頑張ってみますが、AD変換器の入力が常に揺らいでいるのは仕方がないのかもしれません。

現在はAD7986を500kHzでサンプリングしていますが、当然ながら一次CRフィルタの特性は緩やかなので500kHz以上の帯域のノイズを消せません。

また、500kHzでサンプリングしているからといって500kHzで考えればよいのではないという気がしてきました。AD7986がAcquisitionフェーズに要する時間は100nsだそうなので10MHzで考えなければならないのではないかという感じもします。

それに、Acquisitionフェーズの間にAD7986の最初のコンデンサに電荷がチャージされますから、この期間にはディジタルの線は動かさないほうが賢明です。

次回は、さらなる精度向上のためにADコンバータへのタイミングを調整してみることにします。

おまけ

DACで作ったSIN波をADCに入れてみたところ

Adc_test_4

| | コメント (0)

2013.12.15

ADCボードからのデータの取り込み

開発中のADCボードにArtix-7 FPGA評価ボードを乗せて、USB経由でデータを取り込めるようにしました。

まずは、ADCの生の実力を見ることにします。

Adcboard_7

使用しているADCはアナデバのAD7986。このAD7986のIN+とIN-を抵抗で直結して、AD変換値を読み出してみます。

こういう計測ではExcelを使うと便利です。ExcelのVBAマクロからtkdnfx3.dllを呼び出せるようにして、測定データを表に取り込めるようにしました。USB Readというボタンを押すと取り込んでくれて、そのままグラフに出してくれます。

18bitのADCなので0~262143まで出してきます。中心が131072になるようにFPGA内で0x20000を足しています。

さて、取り込んだデータは、

Adc_excel_1

Excelだからヒストグラムを作るのも簡単。(別途「分析ツール」をインストールし、アドオンの管理で分析ツールを有効にする必要あり。)

分析メニューをつっついて、ヒストグラムを選択します。

Excel_hist_1

そして、ヒストグラムをとりたい範囲を指定します。ここでグラフ作成オプションを入れておきます。

Excel_hist_2

すると・・・

Adc_excel_2

このように、ほとんどの取得されたデータが131071と131072に集中していることがわかります。ただし、データは完全には停止してくれず絶えず揺らいでいます。

ですが、AD7986のデータシートにあるヒストグラムを見る限り、これとほぼ同じくらいの精度(ばらつきの少なさ)が達成できていると思われます。

Ad7986_hist

次に、ADCのIN+とIN-をショートするのをやめて、前段のプリアンプからの信号を与えてみたところ、結構バラけるようになってしまいました。

Adc_excel_3

ADCの生の性能は良かったので、アンプが悪いわけです。このようにヒストグラムが出せると特性が一発でわかります。どこからノイズが入ってくるのか、究明したいと思います。

ちなみに、ボード上のDACで作ったのこぎり波をADCプリアンプの入力に入れてみたところ、このような波形が表示されました。

Adc_excel_4

Excelで計測できるっていうのは結構便利だと思います。いずれこの計測ワークシートを公開したいと思います。

| | コメント (0)

2013.12.12

ADCボードを実装した

先日設計したADCボードを実装しました。

Adcboard_1

SAMコネクタが7個あります。差動入力が2chと、クロック/トリガ入力1ch、アナログ出力2chで計7個です。

Artix-7ボードか、Spartan-6ボードを乗せることができます。

Adcboard_2

タカチのHEN型ケースにぴったり収まりました。

Adcboard_3

このボードはLT3439という超低ノイズなスイッチング電源を使っています。

Adcboard_4

普通のスイッチング電源は、コイルに流れている電流をOFFにして急激な電流変化を起こすことで昇圧したり負の電圧を作ったりしています。それに対してLT3439はコイルに緩やかに変化する電流を流して励起することで2次側に巻き数比に応じた電圧を発生させるという仕組みです。

そのためのトランスが、上に写真に写っている黒い四角いもの(村田製作所の78253)です。

まず、電源の動作テストから行いました。LT3439の発振を司る時定数のコンデンサの端子をオシロで見てみると・・

Adcboard_5

45kHzくらいで発振しています。CとRの値を間違えたかな?ちょっと計算と違います。

コイルの一次側を見てみると・・・

Adcboard_6

うーん。何かを間違えたかもしません。

でも、ダイオードを通した後の電圧は、オシロではリップルが見えないほど平滑化されて綺麗になっていました。

| | コメント (1)

2013.12.11

誘電体吸収(DA)

Addabook_2高精度なAD/DAボードを作りたいと思って購入した書籍「A-D/D-A変換ICの実用技術: 高性能を引き出す回路の作り方と実装方法」に、コンデンサの厄介な性質として誘電体吸収というものが紹介されていました。

 

理想的なコンデンサとは違い、現実のコンデンサには真の容量のまわりに漏れ電流となるRPや、等価直列抵抗ESRやインダクタンス成分ESLなどが加わっています。

これだけなら良いのですが、厄介なのは下の図で書いた誘電体吸収という成分で、真のコンデンサの隣に寄生した容量と抵抗がつながっているやつです。

Da_1

これらの寄生成分は個々に独立して存在しているのではなく、相互に絡み合っていて(つまり上の図はあくまでもモデル)、もっとぐちゃっとした感じになるそうです。

いずれにせよ、この寄生容量によって、コンデンサは過去の電圧を思い出そうとするメモリのような性質を持ってしまいます。つまり、端子をショートしてからオープンし、放っておくと前の電荷が回復してしまうということです。

Da_3

電解コンデンサで端子をショートさせた後に、電圧が復活しているような経験はなかったでしょうか?それが誘電体吸収です。

誘電体吸収があると、たとえば、A/D変換のサンプル・ホールド回路でこの性質が問題になります。サンプル・ホールド回路で前の電圧を思い出されたらたまったものではありません。

Da_2

実際にこの実験をやる回路を作ってみました。

Da_4

MOS-FETをバチバチやって、充電したり、放電したりします。MOS-FETのコントロールは手元にあったArtix7を使いました。

Da_5

上のコネクタの部分に測定対象のコンデンサを差し込みます。

さて、放電時間をどうするか難しいところなのですが、誘電体吸収を測定するための決まった方法はないそうです。放電時間が長ければ当然ながら誘電体吸収は小さく出るでしょう。この誘電体吸収の時定数はミリ秒のオーダーになることもあるそうで、コンデンサによってバラバラです。

とりあえず、1uFのコンデンサに対して10u秒の放電で試してみました。

千石で買ってきた1uFのコンデンサたちです。左からタンタル・積層フィルム・積層セラミックです。

Da_6

タンタルコンデンサに充電して、10u秒後にオープンしたときの波形をご覧ください。

Da_7

ショートしたときに完全にゼロにはなり切っていないのですが、オープンにした後、電圧が回復していくのが見えます。当然、ショートしている時間がもっと長ければ回復する電圧は低くなります。

図には出しませんが、フィルムコンデンサの場合はもっと少なくなりますし、意外なことに積層セラミックコンデンサのは小さかったです。

次は0.01uFのものです。このあたりの容量なると、マイカやスチロールコンデンサが使えるようになります。

Da_8

容量が小さいので、ショート時間は1u秒にしました。ディップドマイカの場合は結構、電圧が復活しています。

Da_9

ブログの図には出しませんが、予想通り、積層フィルムやスチロールコンデンサでは、かなり小さくなっていました。

※月刊特電の次号に掲載予定

結論を言うと、DAの時定数がみんな特性がバラバラなので、正しい測定方法がわからないし、適切な放電時間もわからないので正しい測定方法などないのですが、千石に売っているこれらのコンデンサはかなり良い感じでした。

Da_10_2

意外とおすすめです。

| | コメント (0)

2013.12.10

Artix-7で、USB3.0経由でDDR3メモリ読み書きに成功。でも・・

ようやく、Artix-7ボードで、USB3.0経由のDDR3メモリ読み書きに成功しました。

このPanasonicのノートPC「CF-AX2」が一番速く、360MB/s付近の数字をたたき出します。

Artix7ddrjikken_2

Artix7ddrspeed

256MBのデータを読み書きが1秒くらいしかかからないので、USB3.0の圧倒的な速度を感じさせます。

ただ、新たな問題も生じました。データサイズを1MBytesにしておけば何時間回しても止まらないのですが、8MBytesくらいのサイズにすると、突然止まってしまうことがあります。きっと、USBの転送タイミングの切れ目のタイミングと、64bit→32bitの変換のFIFOのEmptyかFullの処理で何かおかしなことが起きているのでしょう。もうちょっとデバッグが必要なようです。

さて、いま現在のFPGAの内部構成はこんな感じです。

A7a4d3_struct1

EZ-USB FX3との信号をやりとりする「USB3.0用コア」の出力を「AXIマスタラッパ」でAXI-4に変換して、それをCoreGenで生成したAXI-4 DDR3コアにつないでいます。

これでUSB3.0を経由してDDR3メモリに読み書きできるようにはなったのですが、この構成だとカメラをつないだり、AD変換器をつないだりといったことができません。

だから、次は、AXI-4のインターコネクトを入れてみたいと思います。

A7a4d3_struct2

CoreGenで作るMIGのDDR3コアは、メモリの速度(DDR後の2倍速度)の4分の1の速度でユーザ側インタフェースが出てきます。そのときのバス幅は、DDR3ならば8倍です。

つまり、DDR3メモリとFPGAが8bitでつながっているときには、MIGのコアは64bitで出してきます。メモリのクロックが400MHz(速度で800MHz)の場合は、ユーザ側インタフェースは100MHzです。つまり、64bit 100MHzのインタフェースでAXI-4が出てきます。

(MIGの設定で32bitで出させることもできるのですが、オプションを変えるのは怖いので、AXI-4のインタコネクトを使ってみようというわけです。)

EDKに入っているAXI-4のインターコネクトは、マルチマスタ・マルチスレーブなN×Mの構成が可能ですが、ISEのCoreGenで作るものはマルチスレーブはできません。マルチマスタはできるので、上記のようなシステムが作れるものと期待しています。

EDKを使わずにISEだけでできるので、追加の出費がいらないということは多くのユーザにとってメリットになるのではないかなと思います。

そういうわけで、次は上のような構成のAXI-4ベースの汎用計測システムを作りたいと思います。

| | コメント (0)

2013.12.09

USB3.0からAXI4経由でDDR3メモリに書き込めるようにする

USB3.0からAXI4経由でDDR3メモリに書き込めるようにしました。

この単純な回路が結構苦労しました。

それは、CoreGenのMIGで作ったAXI版DDR3メモリコントローラが64bit 100MHzでインタフェースなのに、拙作のUSB3.0コントローラが32bit 100MHzだからです。

データバスの幅の変換をするのにCoreGenのFIFOを使おうとしたのですが、どうもEMPTYの扱いがおかしい。

入力側から32bitのデータを2回書いたら、出力側で64bitのデータ1個になってほしいのですが、そのあたりの考え方がCoreGenと私が望むのとでちょっと違うみたいでした。

そこで、CoreGenのFIFOにビット幅変換をやらせるのはあきらめて、32bit→64bitへの変換はユーザロジックで行うことにしました。

それで書き込んで見たのが次の波形です。

Axi4usbwr

最後のほうがパラパラ・・・ってなっているのは、FX3からの出力タイミングが間欠的になっているからです。(WaterMark機能を使っている)

とにかく、USB3.0(EZ-USB FX3)から受信したデータをAXI-4に乗せて、DDR3 SDRAMに書き込むことができるようになりました。USBからの受信データ(OUT転送)は200~320MB/sで、DDR3は670MB/sあるので絶対間に合うはずです。

| | コメント (2)

Artix-7のAXI-4版DDR3メモリコントローラのリセット方法

MIGで作ったArtix-7のAXI-4版DDR3メモリコントローラには、2つのリセット信号があります。

input                             aresetn,
input                             sys_rst

これらのリセットはどうしたらいいでしょうか?

実は、結構複雑です。

最初、aresetnとsys_rstを同時にL→Hとやっていたのですが、これは間違いです。動くときもありますが、動かなくなるときもあります。

動かないときには、

  • AXI-4のReadが止まってしまう
  • 読み出したデータが違っていることがある

という現象が起きます。

どうやら、正しいやり方はsys_rstを先に解放してaresetnを後から解放するようです。

sys_rst   ______|^^^^^^^^^^^^^^
aresetn   ______________|^^^^^^

なんか、イメージ的に逆ですが、これで正しいです。

リセットパルスの時間や、時間差はどのくらい必要なのかよくわかりませんが、5ms+5msくらいで行っています。リセット回路のソースはこんな感じです。

signal reset_timer          : std_logic_vector(20 downto 0);
・・・
  process(clk100m) begin
    if(clk100m'event and clk100m = '1') then
      if(pushsw_ip = '0') then
        reset_timer <= (others => '0');
      elsif(reset_timer(reset_timer'left) = '0') then
        reset_timer <= reset_timer + 1;
      end if;
      if(pushsw_ip = '0') then
        sys_rst_n <= '0';
      elsif(reset_timer(reset_timer'left-1) = '1') then
        sys_rst_n <= '1';
      end if;
      aresetn <= reset_timer(reset_timer'left);
    end if;
  end process;

sys_rstはDDR3コントローラのリセットで、aresetnはたぶんAXIのリセットです。aresetnを先にディアサートしたり、sys_rstと同時にディアサートするとその後、AXIコントローラが動作しなくなることがあるようです。

| | コメント (2)

2013.12.08

Artix-7用のAXI-4 DDR3コントローラの読み出し速度

今度は読み出し側です。

DDR3コントローラの読み出し側も、動かしていると突然固まってしまうという現象に悩まされてきました。

その原因の一つは、RDVALIDが不定期にディアサートされるということでした。

Axi4ddr3rd_1

基本的に、MIGが作ったDDR3コントローラは、すべてのメモリリードトランザクションの最後の2個前くらいのところで、RVALIDが1クロック分ディアサートされます。

リフレッシュと思われるタイミングでもRVALIDが変な形でディアサートされます。

Axi4ddr3rd_2

このディアサートされるタイミングがちょうどLASTのときとかぶると、LASTのパルスがびよーんと伸びます。

このようなパターンに対してちゃんと応答するようにステートマシンの遷移条件を見直したら、何MB連続で読み出しても問題なく読めるようになりました。

次の図はDDR3メモリに対して256MB、読み書きを繰り返している波形です。WriteよりもReadのほうが少し遅いです。

Artix7axi4ddr3rdwr

1.2秒周期で読み書きを行っていますので、毎分50回読み書きして、それを10時間続けました。7.5TBほど転送したことになりますが、全くのノーエラーでした。

Spartan-6と比べて気が付いたのは、全然熱くならないことでした。Artix-7とDDR3の組み合わせは、思ったほど熱くないのです。

いい加減な表現ですが「あったかい」くらいです。

| | コメント (0)

Artix-7用のAXI-4 DDR3コントローラの書き込み速度

Artix-7用のAXI-4 DDR3コントローラで、ようやく大きなサイズのメモリ転送ができるようになりました。

いままでは、数MBのデータ(といってもXorShiftの乱数)を書こうとすると、いつの間にかDDR3コントローラが反応を停止してしまうという現象に悩まされてきました。

その原因は、BRESPにありました。

Axi_ddr3wr_800_2

今まで、①AWREADYを確認→②AWVALIDをアサート→③WREADYを確認→④WVALIDをアサート→①AWREADYを確認→②次のAWVALIDをアサート→③WREADYを確認→④WVALIDをアサート→・・・

という手順で、どんどんアドレスとデータを送っていたのですが、これが間違えていたのです。

ZED Boardのようにメモリ速度が4000MB/sくらいあればよいのですが、今回のメモリ速度800MB/sしかなくAXIバスと同じ速さです。したがって、アドレスをどんどん送っていくと、コントローラの中で詰まってしまうのです。

正しい手順は、

①AWREADYを確認→②AWVALIDをアサート→③WREADYを確認→④WVALIDをアサート→⑤BVALIDを待つ→①AWREADYを確認→・・・

なのです。ただし、BVALIDが返されるタイミングは、すべてのデータを送り終わった後かもしれないし、送り終わる前かもしれません。したがって、ステートマシンでBVALIDを直接見るのではなく、BVALIDが入ったことを確認するための信号(上の図ではBVALID_DETECT)を見て動かしています。

ただ、BVALIDを待ってから送っていると遅くなる可能性があります。そういう場合はs_axi_awidを変えていけばよいのです。

つまり、①AWREADYを確認(AWID=0)→②AWVALIDをアサート(AWID=0)→③WREADYを確認→④WVALIDをアサート→①AWREADYを確認(AWID=1)→②次のAWVALIDをアサート(AWID=1)→③WREADYを確認→④WVALIDをアサート→・・・

このようにすれば、前のトランザクションと後ろのトランザクションが多少オーバーラップしても問題ないようです。AWIDはこういう使い方をするのでしょうかね。

で、DDR3メモリに256Mバイトの書き込みを行ってみました。

Axi_ddr3wr_800_3

256MBを400msで書き込んでいるので、実効速度は670MB/sという計算になります。

なお、AXIバスの1回あたりの書き込みサイズを増やしても、この速度は速くはならないようです。つまり、DRAMのリフレッシュや、プリチャージなどによってバスの使用効率が83%に落ちてしまっているのです。

| | コメント (0)

2013.12.06

ADCボードが出来上がってきた

ADCボードが出来上がってきました。

Adc_board

早速、アルバイト君に実装してもらっています。

このボードは、ボードとして提供するのではなく、箱に入れた「製品」としたいと思っています。

FPGAにはあらかじめデザインを書き込んでおいて、Windowsの計測ソフトも用意して、電気の専門家でなくてもすぐに使っていただけるような製品を目指します。

タカチのケースにぴったりと収まるように作りました。

Adc_case


ケースにぴったりすぎて、本当にこれでいいのか心配ですが・・

まずは実験機ですので18bit 2Msps程度の低速なものを目指しています。

あくまでも本命は来年作るであろう数百MHzのADC装置と、多チャネルのADC装置です。

| | コメント (0)

2013.12.05

Artix-7用のAXI-4 DDR3のデザインで模索

CoreGenのDDR3メモリコントローラ(MIG)を使ってArtix-7用の汎用デザインを作るため、AXI-4を勉強中です。

MIGでAXI-4を使うにはVerilogにしなければならないので、コアはVerilogとして作り、ラッパをかましてVHDLのトップデザインから参照できるようにしています。

Axi_wrapper

こうすれば、VerilogのParameterなどをVHDLから指定しなくてもよくなるのかなーと。

MIGの設定では、メモリのクロック速度は400MHzにします。これで800MB/sで動作するようになります。バス幅を64bitにしているので、1回のAXIバスの転送で8バイト転送できます。ゆえにAXIバスの速度は100MHzになります。

Mig_ddr3_axi4

MIGでは、sys_clk_iはメモリのクロック速度と一致(400MHz)させ、clk_ref_iは200MHzにするようです。(たぶん)

さて、実際にメモリにライトしてみたときの波形です。64ワードごとに区切ってコマンドを発行していますが、完全に等間隔になっているわけではなく、リフレッシュとも関係なく、ところどころ転送にWAITがかかっているようです。800MB/sのバス速度に対し、実効速度は670MB/sくらいのようです。

Axi_ddr3wr_800

一方、ReadしてみたときのAXI4バスの波形はこんな感じです。

Axi_ddr3rd_800

転送中にWAITがかかることはありませんが、READコマンドを発行してから実際のデータが出てくるまでに300nsくらいかかっています。DDR3 DRAMだから当然といえば当然なのですが・・

高速化するには1つの転送が終わる前に次のREADを発行して、オーバーラップさせていかなければならないと思います。

AXI-4 DDR3のデザインで模索

| | コメント (2)

2013.12.04

第1回社内勉強会

12月4日(水)、初めての特殊電子回路の社内勉強会を行いました。

液晶プロジェクターを購入して、壁に映し出して発表します。

Shanaibenkyoukai

この写真に写っている冴えない人は私です。

みんな時間がないなか資料を作ってきてくれて、無事に発表できました。

Shanaibenkyo_title

私はExcelを使って回路図や構成図、家の間取り図、その他各種の図面を描く方法を説明しました。この方法をつかって、みんなが、図表のたくさん入ったドキュメントを作成できるようになればいいなと思っています。

Aさん(仮名)は、Windows Azureのことを調べてくれました。Azureの概要を知ってMicrosoftのアカウントを作って、Azureにも申し込みました。来週の発表ではWindows7とVisualStudio Professionalを入れて続きをやるようなので楽しみです。

Bさん(仮名)は、ある本を読んで、特電のホームページの問題点をたくさん指摘してくれました。はい、そのとおりです。たくさん問題点がありました。

Cさん(仮名)は、製品の発送の手順を皆に説明してくれました。箱の中に入れるマニュアルや回路図、ピンヘッダなどの付属品の袋詰め方法など、非常に細かい作業がたくさんあることに驚きました。

こんな感じで来週もやろうと思います。私はET2013でもらってきた各社のパンフレットのレイアウトやキャッチコピーの分析をして、みんなでよりよいパンフレットを作れるように研究していきたいと思います。

特殊電子回路はこんな会社です。

今、一般事務をしてくれる方と、RXマイコンのプログラムができる方を急募しています。

興味をもった方は、求人情報をチェック! 皆様いっしょにやりましょう!!

| | コメント (0)

2013.12.03

特殊電子回路では一緒に働いていただけるスタッフを募集します

特殊電子回路ではスタッフを募集します。

http://www.tokudenkairo.co.jp/jobs.html

電子回路のエンジニアだけではなく、一般事務、マーケティングスタッフ、Webエンジニアなど、さまざまな人材を必要としています。

パート、アルバイト(大学生・大学院生)、正社員、いずれの形態でも構いません。一緒に働いていただける方を募集します。

※以下に書いていたことは古い募集要項なので、誤解を生じないために削除いたしました。

| | コメント (0)

2013.12.02

ようやくA/D D/A変換ボードを出図しました。

Np1067pcb_1

試作器なので、P板.comの急ぐコースです。

ボードとして販売するのではなく、計測システムにしたいので、タカチのHEN型(アルミ製)放熱ケースに入れられるように設計しました。

この基板を設計するにあたって、先日の「A-D/D-A変換ICの実用技術」に書かれている知識をふんだんに使いました。(使ったつもり)

  • レールツーレールOPアンプなど存在しない → 0V~フルスケールまで出すために、より広い電源電圧で最初のアンプ駆動した。
  • ADCがサンプリングするときの過渡電流・・・十分に考慮した。
  • コンデンサの誘電体吸収(DA)・・・小さいコンデンサを選定
  • アナログ部とディジタル部の分離・・・完全にアイソレートした
  • ADCのディジタル側の信号の帰還・・・十分に考慮してパターンを引いた。
  • 帰還抵抗のマッチング・・・マッチングの取れた高価な抵抗を使った
  • 抵抗の温度計数・・大きな分圧比は作っていないので大丈夫

ほかにも諸々の注意点が書かれていました。

さて、「A-D/D-A変換ICの実用技術」に書かれていたことで、最もショッキングだったことは、ADCにあるDVDDやDGNDは、ディジタル電源につないではいけない、ということでした。

DVDDやDGNDという端子は、あくまでもADCの中のディジタル的な動作をしている部分の電源端子という意味であって、ここにディジタル回路からのGNDをそのまま使うと、ノイズの混入の原因となるそうです。

正しいつなぎ方は、DVDDはAVDDからEMIフィルタをつかってつなぎ、DGNDとAGNDは直結する、ということでした。また、ADCのディジタル出力には必ず抵抗を入れてからバッファICに通せ、ということが書かれていました。

なぜならば、ADCのディジタル出力から電流を多く取り出すと、過渡現象がノイズとなってアナログに混入するから、ということです。バッファICを介して取り出そうとしても、バッファICの入力には10pFくらいの容量があるので、この10pFの入力容量を充電するために瞬間的に10mAくらいの電流が流れてしまうので、それもノイズの原因になる。だから、500Ωくらいの抵抗を挟んでからバッファに通して、それからディジタル回路に渡せということが書かれていました。目からうろこでした。

サンプリングクロックはの水晶発振器の電源はアナログ電源から取らなければならないほか、トランスを使って結合しろとか役立つノウハウ満載でした。

あと面白いのは、0.035mmのパターンの抵抗は、0.14mΩ/squareで計算できるそうです。

銅の抵抗はρ長さ/(幅・厚さ)なのですが、この式はつまり(長さ/幅)に比例します。面白いのは、具体的に式に数字を入れて計算する必要はなく、パターンを正方形が何個積み重なってできているかを考えるだけで抵抗値が求まるということです。

つまり、



■■■■■■■■

というパターンがあったら正方形は10個なので、1.4mΩなのです。太いパターンならば抵抗値は低くなるし、細いパターンなら抵抗値は高くなります。要するに正方形の個数だそうなのです。つまり、GNDのパターンを正方形にしておけば、一辺から対向する辺への抵抗値は0.14mΩになります。

基板の仕上がりは金曜日になります。土日で実装できればいいなと思います。

| | コメント (0)

« 2013年11月 | トップページ | 2014年1月 »