« SP6JTAG for WinでSPI ROMの書き込み | トップページ | MATLABとSpartan-6ボードで音声キャプチャ »

2010.10.19

特電Spartan-6ボードとMATLABとの接続

MATLABから特電Spartan-6ボードを操作できるようにしました。
Matlab_sp6

MATLABワークスペース(プロジェクトのディレクトリ)に、tkusb.dll、USBOpen.mexw32,USBClose.mexw32,USBReadData8.mexw32, USBReadData16.mexw32, USBWriteData8.mexw32, USBWriteData16.mexw32の7つのファイルをコピーするだけで、特電Spartan-6ボードを制御することができるような、そういう拡張コマンドを作りました。

Matlab_0_3

これで、MATLABのコマンドから、以下の関数が使えるようになり、特電Spartan-6ボードを制御できるようになります。
 ・USBOpen
 ・USBClose
 ・USBReadData8
 ・USBReadData16
 ・USBWriteData8
 ・USBWriteData16
機能は名前のとおりです。説明の必要もないくらい簡単な仕様だと思います。

実際にやってみましょう。
まず、Spartan-6ボードにサンプル・リファレンス・デザインを書き込んでおきます。

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だとピンヘッダにつながります。

その結果、テストパターンが読みだされ、以下のようなのこぎり波形が表示されます。
Matlab_2

次に、flag=2にして同じことをやってみると、SDRAMの中身が読みだされます。
Matlab_3
これがSDRAMの中身のデータ(の初期値)の、最初の100000バイトです。

さて、OV7670で作るCMOSデジカメのデザインを書き込んで、CMOSイメージセンサをつないで、先頭10ライン(の輝度データ)を読み込んで表示してみましょう。DDR2 SDRAMにはカメラの画像が書き込まれるので、意味のあるデータが読みだされます。
Matlab_4

二次元プロットを行うと、MATLABの中でデジカメのようなアプリが動くようになります。
Matlab_5

USBWriteData8関数を呼び出せばFPGAボードにデータを送ることもできるので、カメラのI2Cレジスタの書き換えなどもできます。

スクリプトを作って.mファイルにしてまとめておくと便利です。
Matlab_6

MATLABなので、MATLABらしく、数値計算してみましょう。
以下のような式でラプラシアンフィルタを作って適用してみます。


f=[1,1,1;1,-8,1;1,1,1];
Zf=filter2(f,Z,'same');
Zf = uint8(Zf);

Matlab_7

上の画像は、パソコンのキーボードと私の手です。輪郭が抽出されて見えるようになりました。
これは静止画ではなくて、MATLABのプロット画面の中でリアルタイムに動いて表示されます。
(画像が縮小されているので、みづらいです。クリックして拡大してください)

こんな感じで、FPGAを通じた計測やその後のデータ処理が、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

どうでしょうか。こんな簡単なスクリプトでリアルタイムなエッジ抽出カメラが作れます。

MATLABとFPGAボードをつないでみたいとお考えの方、ぜひともお問い合わせください。

|

« SP6JTAG for WinでSPI ROMの書き込み | トップページ | MATLABとSpartan-6ボードで音声キャプチャ »

コメント

コメントを書く



(ウェブ上には掲載しません)




« SP6JTAG for WinでSPI ROMの書き込み | トップページ | MATLABとSpartan-6ボードで音声キャプチャ »