製品情報>Spartan-6評価ボード>コラム>MATLABで使う

MATLABで使う

MATLABとの接続

特殊電子回路製FPGA評価ボード「TKDN-SP6-ES/16/45」は、MATLABと接続してデータ計測や制御に役立てることができます。本ページではそのやり方を紹介します。

 

MATLABとSpartan-6がつながる

 

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

 

MATLABのワークディレクトリにMEXファイルをコピー

 

MEXファイルは関数ごとに用意されています。つまり、上記のファイルをコピーするとUSBOpen等の関数が使えるようになります。機能は名前のとおりです。

詳しい使い方は下記のPDFファイルをご覧ください。

Spartan-6のMATLAB拡張機能の使い方

 

データの読み出し方法

デモンストレーションを行うために、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);

リスト1 MATLABからSpartan-6のデータを読み出す方法

 

USBReadData8という関数が、Spartan-6ボードからデータを8ビット形式で受け取るコマンドです。サンプル・リファレンス・デザインでは、flag=0にしてデータを読み出すと、シーケンシャルにカウントアップするテストパターンが受け取れます。

 

flagというのは、FPGAの中に実装されたいろいろなモジュールのうち、どのモジュールにデータを送ったり、どのモジュールから受け取ったりするかを指定するものです。標準のサンプルデザインでは、flag=0でテストパターン、flag=1だと内蔵BlockRAM、flag=2だとDDR2 SDRAM、flag=3だとピンヘッダにつながります。

 

したがって、上のプログラムを実行した結果、FPGAボードからテストパターンが読みだされ、MATLABのプロットに以下のようなのこぎり波形が表示されます。

 

MATLAB上でのプロット

 

flag=2にしてデータを読み出すと、次のようにSDRAMの内容の初期値が読みだされます。

MATLAB上でのプロット

 

計測への応用

SDRAMに計測データをため込むようなデザインをFPGAに実装すると、SDRAMの内容を読み出すたびに新たな計測データが読みだされます。

 

ここでは、Spartan-6ボードに簡単なADコンバータをつないで、周囲の音をマイクで拾った結果をMATLAB上で取り込んでみます。次の写真は、実験用に万能基板で作成したボードです。

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;

リスト2 ラプラシアンフィルタ

 

取り込んだデータは以下のように表示されます。

MATLAB上でのプロット

(クリックで拡大)

 

スペクトルとして表示すると、以下のようになります。

MATLAB上でのプロット

 

画像計測への応用

MATLABでは二次元プロットができるため、画像処理への応用も可能です。

 

次の図は、OV7670で作るCMOSデジカメのデザインを書き込んで、CMOSイメージセンサをつないで、先頭10ライン(の輝度データ)を読み出した場合の読み込んだ場合の表示です。DDR2 SDRAMにはカメラの画像が書き込まれるので、このようなデータが読みだされます。
 

OV7670は水平方向のドット数は640なので、640周期で似たようなデータが繰り返します。

 

MATLAB上でのプロット

 

このデータは640周期で480回繰り返しています。これを二次元プロットを行うと、MATLABの中でデジカメのようなアプリが動くようになります。

MATLAB上でのプロット

(クリックで拡大)

 

さらに、以下のような式でラプラシアンフィルタを作って適用すると、輪郭が抽出されます。

f=[1,1,1;1,-8,1;1,1,1];

Zf=filter2(f,Z,'same');

Zf = uint8(Zf);

リスト3 ラプラシアンフィルタ

下の画像は、パソコンのキーボードと私の手です。輪郭が抽出されて見えるようになりました。

 

MATLAB上でのプロット

(クリックで拡大)

 

これは静止画ではなくて、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

リスト4 MATLABでCMOSイメージセンサの内容を読み出して輪郭抽出

 

まとめ

このように、FPGAを通じた計測やその後のデータ処理が、MATLAB上でできるようになります。

 

MATLABとSpartan-6の連携

(クリックで拡大)

 


© 2017 TokushuDenshiKairo Inc. All rights reserved