MATLABで使う
MATLABとの接続
特殊電子回路製FPGA評価ボード「TKDN-SP6-ES/16/45」は、MATLABと接続してデータ計測や制御に役立てることができます。本ページではそのやり方を紹介します。
Spartan-6評価ボードをMATLABから操作するには、MEXファイル(MATLAB Executable)を使います。MEXファイルというのはMATLAB上から外部のライブラリを実行するための拡張機能で、MEX介して特電USBライブラリを呼び出すことで、MATLABからSpartan-6ボードのUSBにデータを入出力できるようになります。
MATLABで使うための準備
まず、下記のボタンを押して、MEXファイル一式をダウンロードして展開してください。
これらのファイルをMATLABのワークスペース(いわゆるプロジェクトのディレクトリ)か、またはパスの通ったところにコピーします。
・tkusb.dll
・USBOpen.mexw32
・USBClose.mexw32
・USBReadData8.mexw32
・USBReadData16.mexw32
・USBWriteData8.mexw32
・USBWriteData16.mexw32
MEXファイルは関数ごとに用意されています。つまり、上記のファイルをコピーするとUSBOpen等の関数が使えるようになります。機能は名前のとおりです。
詳しい使い方は下記のPDFファイルをご覧ください。
データの読み出し方法
デモンストレーションを行うために、Spartan-6ボードにサンプル・リファレンス・デザインか、USBサンプルデザインを書き込んでおいてください。お客様が作成されたデザインがあれば、それを書き込んでください。
Spartan-6ボードに特電USB IPコアが実装されると、各USB関数が使えるようになります。
FPGAの準備ができたら、MATLAB上で以下のプログラムを入力してください。
USBOpen(); len = 4096; flag = 0; read_data = zeros(4096,1); [read_data,s] = USBReadData8(len,flag); USBClose(); plot(read_data); |
USBReadData8という関数が、Spartan-6ボードからデータを8ビット形式で受け取るコマンドです。サンプル・リファレンス・デザインでは、flag=0にしてデータを読み出すと、シーケンシャルにカウントアップするテストパターンが受け取れます。
flagというのは、FPGAの中に実装されたいろいろなモジュールのうち、どのモジュールにデータを送ったり、どのモジュールから受け取ったりするかを指定するものです。標準のサンプルデザインでは、flag=0でテストパターン、flag=1だと内蔵BlockRAM、flag=2だとDDR2 SDRAM、flag=3だとピンヘッダにつながります。
したがって、上のプログラムを実行した結果、FPGAボードからテストパターンが読みだされ、MATLABのプロットに以下のようなのこぎり波形が表示されます。
flag=2にしてデータを読み出すと、次のようにSDRAMの内容の初期値が読みだされます。
計測への応用
SDRAMに計測データをため込むようなデザインをFPGAに実装すると、SDRAMの内容を読み出すたびに新たな計測データが読みだされます。
ここでは、Spartan-6ボードに簡単なADコンバータをつないで、周囲の音をマイクで拾った結果をMATLAB上で取り込んでみます。次の写真は、実験用に万能基板で作成したボードです。
このボードではコンデンサマイクで拾った音をOPアンプで増幅し、AD変換して、Spartan-6に入れています。AD変換されたデータはボード上のDDR2 SDRAMに格納されます。
SDRAM上のデータをUSBを経由してMATLABに取り込み、波形を表示させたり、スペクトルを表示させたりするためのMATLABのスクリプトは以下のとおりです。
USBOpen(); len = 131072; flag = 2; % SDRAMから取り込み axes('YScale','log');
while(1) read_data = zeros(len,1); [read_data,s] = USBReadData16(len,flag); plot(read_data); % 生の波形を表示 pause(0.0001);
y = fft(read_data,len); f = (0:len-1)*(1/len); power = y.*conj(y)/len/2048; % loglog(power); % スペクトルを表示 pause(0.0001); end; |
取り込んだデータは以下のように表示されます。
(クリックで拡大)
スペクトルとして表示すると、以下のようになります。
画像計測への応用
MATLABでは二次元プロットができるため、画像処理への応用も可能です。
次の図は、OV7670で作るCMOSデジカメのデザインを書き込んで、CMOSイメージセンサをつないで、先頭10ライン(の輝度データ)を読み出した場合の読み込んだ場合の表示です。DDR2 SDRAMにはカメラの画像が書き込まれるので、このようなデータが読みだされます。
OV7670は水平方向のドット数は640なので、640周期で似たようなデータが繰り返します。
このデータは640周期で480回繰り返しています。これを二次元プロットを行うと、MATLABの中でデジカメのようなアプリが動くようになります。
(クリックで拡大)
さらに、以下のような式でラプラシアンフィルタを作って適用すると、輪郭が抽出されます。
f=[1,1,1;1,-8,1;1,1,1]; Zf=filter2(f,Z,'same'); Zf = uint8(Zf); |
下の画像は、パソコンのキーボードと私の手です。輪郭が抽出されて見えるようになりました。
(クリックで拡大)
これは静止画ではなくて、MATLABのプロット画面の中でリアルタイムに動いて表示されます。
このデモで使用したスクリプトは次のとおりです。
clear all; close all;
USBOpen(); row = 480; col = 640; len = row*col; flag = 2; Z = zeros(row,col); Z = uint8(Z); Zf = zeros(row,col); Zf = uint8(Zf); tmpdata = zeros(len,1); s = 0; gwe = 4997; hh = 1792; h = 4121; l = 1024; g1 = 124; g2 = 832;
% カメラのI2Cレジスタの制御 USBWriteData8(gwe,2,7); USBWriteData8(hh,2,7); USBWriteData8(h,2,7); USBWriteData8(l,2,7); USBWriteData8(g1,2,7); USBWriteData8(g2,2,7);
while 1 [tmpdata,s] = USBReadData8(len, flag); for index=1:480 Z(index,:) = tmpdata((index-1)*col+1:index*col,1); end f=[1,1,1;1,-8,1;1,1,1]; Zf=filter2(f,Z,'same'); Zf = uint8(Zf); C = Zf; C(:,:,2) = Zf; C(:,:,3) = Zf; image(C); pause(0.01); end |
まとめ
このように、FPGAを通じた計測やその後のデータ処理が、MATLAB上でできるようになります。
(クリックで拡大)