« 2015年7月 | トップページ | 2015年9月 »

2015.08.27

Cosmo-ZのファームウェアとFPGAを更新

Cosmo-Zのファームウェアを更新しました。今回の更新点は、

  • WebインタフェースでFFTと、ノイズのヒストグラムが見られるようにした
  • Webインタフェースの改良
  • 見たいチャネルだけを見られるようにした

です。

波形ボタンの右に、ヒストグラムボタンとFFTボタンがあります。

Csz_1

例えば、チャネル5と7のノイズのヒストグラムだけを見たい場合は、CH5とCH7にだけチェックを入れて、ヒストグラムボタンを押します。そして、表示範囲を「自動設定」ボタンを押します。

Csz_2

FFTをしてスペクトラムが見たい場合には、FFTボタンを押します。

現在、オーディオアナライザとファンクションジェネレータからテスト波形を入れているので、FFTをした結果が見られます。

Csz_osc


上の2台の発振器で正弦波を作っています。

Csz_3

さて、Cosmo-Zを持っている人はダウンロードページから最新版をダウンロードしていたwだきたいのですが、持っていない人でも試してみることができるよう、特電のオフィス(千代田区)に置いてあるCosmo-Zをインターネット経由で操作することができるようにしました。

http://cosmoz.tokudenkairo.co.jp/

でアクセスできるので、ぜひ試してみてください。

上のURLでアクセスされるサーバは北海道にありますが、Cosmo-Zは東京にあります。

北海道のサーバが、特電の社内にあるCosmo-Zにアクセスして、その画面をそのままリダイレクトして表示するようになっています。

お客様→北海道のサーバ→東京の実機→北海道のサーバ→お客様と、非常に長い経路をとってアクセスすることになりますが、あまり遅くは感じないと思います。

| | コメント (0)

2015.08.26

Cosmo-Zを無理やり18bit化してみた

ZYNQ搭載のADCボード「Cosmo-Z 」は標準で12bitですが、オプションで16bitのADCを搭載することもできます。

7月28日のブログの記事「Cosmo-Zの16bit版を作ってみた」でも書いたのですが、入力0のときのノイズのヒストグラムはこんな感じでした。

Csz16_4

1LSB=30μVなので、σ=160μ程度のノイズが乗っています。

まぁ、16bitの高速ADCだとこれくらいは仕方がないです。

sun

さて、16bitのADCにディジタルフィルタとデシメーション(オーバーサンプリングの逆)をしてやれば、もっと精度が出るんじゃないかと思い、やってみました。

XILINXのCoreGeneratorにはCIC Generatorというフィルタのウィザードがあるので、これを使ってみました。

Cic

拡大してみるとわかると思いますが、25分の1デシメーションのCICフィルタです。125MHzで入ってきた信号が10MHz以上で-100dB、7MHz前後で-75dBという強烈なLPFになっています。

CICフィルタについては、詳しくは、過去の記事「12bitのADCを18bit分解能にする方法」「CICフィルタのオーバーフローとビット数」「CICフィルタでビット数は増えるのか?」をご覧ください。簡単に言えば、加算と減算とレジスタだけで作れるローパスフィルタです。

このフィルタを通すと、5LSB程度(約160μV)あったノイズが、1LSB(約30μV)の幅に収まります。高周波成分をカットするので、当然ながらノイズは減ります。

Cic_16_hist

これを18bitに拡張して見てみると、σ=4LSB(約30μV)程度の綺麗な正規分布が出てきます。

Cic_18_hist

つまり、フィルタによって16bitのADC値から意味のある18bitの値が作り出されているというわけです。直感的に言えば、2つの整数を足して平均すれば0.5の桁までわかる、ということをもっと複雑にやっています。

sun

では、FFTしてスペクトルを見てみます。

80MHzでサンプリングしていますが、25倍オーバーサンプリングとして扱うので、信号のレートは3.2MHzになります。したがって1.6MHzまで見えます。

まずは、16bitで測ったデータをFFTしてみます。信号源はオーディオアナライザで作った100kHzの正弦波です。基本波-20dBに対して高調波が-90dBくらい下がったところに出ています。

Fft_16bit_2

↑16bitでのFFT

次に18bitで測ったデータのFFTです。メインの部分は変わりありません。1MHz以上のノイズフロアが-10dB減って-160dBを差すくらいの違いしかありません。

Fft_18bit

↑18bitでのFFT

したがって、18bitにすることはDC電圧の決定には意味があるのだろうけれども、FFTした結果にはあまり影響が出ないといえます。

sun

Cosmo-Zの18bit化ができました。

このシステムがどれほどの性能を持つかは、より歪の少ない発振器を使ってみないとわからないといえます。

-100dB以下の発振器が欲しい。

| | コメント (0)

2015.08.22

複数の特電Spartan-6ボードを開く64bit版DLL

あるお客様から

「64bit版アプリから、複数の特電Spartan-6ボードを同時に使用したい。」

というご依頼をいただきました。

複数の特電Spartan-6ボードを開くためのドライバとDLLは、必要とされるお客様に32bit版で提供してきたのですが、どうしても64bit版が必要とのことでした。

WOW64があるから32bit版のDLLでできるのではないかと思っていたのですが、MFCを使うアプリではだめなのですね。きっと。

そこで、「複数のボードを同時に開くDLL」を作ろいとしたのですが、VisualC++でのDLLの作り方を忘れていたため、いろいろとはまりました。

まずは、DLLの作り方を備忘録として書いておきます。

DLLで関数をexportするには、関数の宣言の前に__declspec(dllexport)を付けるか、その関数の名前をDEFファイルに書いておきます。私は__declspec(dllexport)のほうが好きです。

descspecを使う場合は、

__declspec(dllexport) int WINAPI hoge();

のようにして関数を宣言します。

descspecを使わない(DEFファイル)の場合は、

int WINAPI hoge();

のようにします。

WINAPIは、DLLからエクスポートする関数にはこれを付けます。引数が右から順にスタックに詰められるそうです。

DEFファイルを使ってエクスポートする関数を列挙する場合、「DEFファイル」は、

LIBRARY     "tkusb"

EXPORTS
    USBGetMaxInstance            @1
    USBGetBoardInfo              @2
    USBSetBoardUserId            @3
    USBGetDriverVersion          @4
    USBGetFirmwareVersion        @5
    USBReadEEPROM                @6
    USBWriteEEPROM               @7
・・・

のように書きます。@数字は、序数といってDLLの中に入っている関数を示す数字です。

自分の過去のプログラムを見ていて、以下のような書き方をする場合もありました。

LIBRARY     "tkusb"

EXPORTS
  USBGetMaxInstance@0     = USBGetMaxInstance     @1
  USBGetBoardInfo@4       = USBGetBoardInfo       @2
  USBSetBoardUserId@4     = USBSetBoardUserId     @3
  USBGetDriverVersion@0   = USBGetDriverVersion   @4
  USBGetFirmwareVersion@0 = USBGetFirmwareVersion @5
  USBReadEEPROM@12        = USBReadEEPROM         @6
  USBWriteEEPROM@12       = USBWriteEEPROM        @7
・・・

「関数名@数字 = 関数名 @数字」という形になっていますが、これはBorlandC++で作ったDLLをVisualC++で使うためのインポートライブラリを生成するための書き方です。@数字は、その関数の引数の総バイト数を表すようです。この形式のDEFファイルの書き方でVisualC++でビルドすると、USBGetMaxInstance@0という関数名の関数として扱われてしまうようで、リンクできません。

まぁ、この形式のDEFファイルを作るには人間が引数を数えなければいけないから、ミスも入るでしょう。DLLはVisualC++で作るべきだと思います。

さて、これでDLLを作る準備ができたわけですが、VisualStudop2010 Expressで64bit版のDLLを作る方法は、過去の記事「Visual Studio Expressで64bit版DLLを作成してみる」

http://nahitafu.cocolog-nifty.com/nahitafu/2014/04/visual-studio-e.html

に書いてありました。

過去の記事に書いてあった方法でビルドはできました。しかし、実行すると不正な処理して止まってしまいます。

どうやら、その原因はCyAPIをOpenしていることが原因でした。

64bit版のCyAPIのバージョンが古いためか、

CCyUSBDevice hCyApi= new CCyUSBDevice();
delete hCyApi;

だけで不正な処理をして止まってしまうようです。結局、cyusb.sysとcyapi.dllを使わずに、ezusb.sysベースのデバイスドライバを使うようにしたところ、止まらずに起動できるようになりました。

自分の過去の日記を読んでみると、

「Spartan-6ボードのWindows7 64bit対応
http://nahitafu.cocolog-nifty.com/nahitafu/2011/02/21/index.html

に書いていたのですが、2011年ごろに一時期EZ-USB FX2LPをCyAPIでアクセスしようとして開発していたけれども、速度の問題などで、結局、古いezusb.sysを64bit版でコンパイルすることにしたようでした。

マルチボード対応のDLLを使ったアプリは、

#include <stdio.h>

#include "tkusb.h" int main() { TKUSB_HANDLE h = USBOpenExByID(0); printf("Handle = %x\n",h); if(!h) return 0; USBSetSmajModeEx(h,0); // Smajモードを解除し、通常動作モードへ unsigned char buffer[256]; for(int i=0;i<256;i++) buffer[i] = i; USBWriteDataEx(h,buffer,256,1); // BRAMに256バイト書き込み memset(buffer,0,256); USBReadDataEx(h,buffer,256,1); // BRAMから256バイト読み出し for(int i=0;i<256;i++) { printf("%x ",buffer[i]); } USBCloseEx(h); return 0; }

という感じになります。最初のUSBOpenExByIDという関数の引数を変えると、USBにつながった複数のSpartan-6ボードを開けるという仕組みです。

もちろん、PCにつながっている特電Spartan-6ボードの総数を調べる関数もあり、ボード上のEEPROMに書かれた小さなデータを読み出す機能もあるので、複数のボードを区別して開くこともできるというわけです。

もう数日テストしてみて、問題がなければリリースしたいと思います。

| | コメント (0)

2015.08.20

次期JTAGバウンダリスキャンツール

お盆休みもおわり、徐々に平常業務に戻ってきました。

長い休みの間、私は何をしていたかというと、せっせとプログラムに励んでいました。

次期JTAGバウンダリスキャンツールの開発です。

新しいJTAGバウンダリスキャンツールは、Webブラウザベースになります。

(もちろん、MITOUJTAGもこれからも残りますし、3D化や新デバイス対応、そして基板検査機能など、どんどん進化していきます。)

WebブラウザベースのJTAGバウンダリスキャンツール

なぜ、Webブラウザかというと、インストールが不要で、世界中のどこからでも気軽に使えるからです。

「Webブラウザの中からUSB-JTAGケーブルが操作できるのか!?」と思われるかもしれませんが、できます。

Internet ExplorerのActiveXという拡張プラグインの形を作りました。これによって、JavaScriptから特電製JTAGケーブルはもちろん、XILINXやDigilentのUSB-JTAG、ALTERAのUSB-JTAGを操作することができます。

(Google Chromeを使っている人や、Firefoxの人はどうするのかというと、残念ながらActiveXが使えないので別途小さな常駐型のソフトをインストールしてもらうことになります。)

そうです。新しいJTAGバウンダリスキャンツールは、WebブラウザでJavaScriptで動くようになるのです。

もちろん、基本的に無料で使い始めることができる(XIやALTERAのJTAGケーブルを購入する費用は必要)し、世界中にいるユーザとつながることができるようにしようと考えています。

| | コメント (4)

2015.08.06

特電に新しいスタッフが入りました

今日から特電に新しいスタッフが来てくれることになりました。

並列計算と粒子法によるシミュレーションと可視化が趣味と研究を兼ねているという、超ハイスペックな院生さんで、シェーディング言語を使ってGPGPUもできるとのことです。とてもすばらしいです。

FPGAや電子回路は未経験とのことですので、特電もそろそろSDSoCに踏み込むべきかなと感じています。SDSoCはソフトウェア技術者がFPGAを意識せずにハードウェア化して高速化するためのものと聞いているので、お盆明けからみんなで勉強していこうかと思います。

特電の今後としては、SDSoCに対応したボードとリファレンスデザインを作り、高速な数値計算のソリューションを提供するというのも面白いんじゃないかと思います。

今年から入ってくれた人に、VHDLやRTLを教えて古い開発スタイルを発展させていくよりも、SDSoCやVivadoHLSで何かやったほうが夢があります。

それに、特電が力をいれている分野がCosmo-Zなどのインテリジェントな物理計測装置なので、その後段階の処理としてリアルタイムに数値計算を行うというと話がつながってくるからです。

現に、Cosmo-Zで計測したデータをもとに1000×1000くらいの行列を数マイクロ秒で計算しなければならない案件とかがあって、そういう案件では1000個くらいのFPGA内乗算器を同時に動かす必要があります。

そういう面白い(?)案件をVHDLで書く気にはなかなかなれません。

それから、今年入った人は皆、OpenGLを使った3次元表示ができるそうです。今日は全員がそろったので、MITOUJTAG V3という新しい3D表示のMITOUJTAGを創っていくためのキックオフをしました。お盆前かお盆明けには、新しいコンセプトのMITOUJTAGのコンセプトを発表したいと思います。

| | コメント (0)

« 2015年7月 | トップページ | 2015年9月 »