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

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

これで、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だとピンヘッダにつながります。
その結果、テストパターンが読みだされ、以下のようなのこぎり波形が表示されます。

次に、flag=2にして同じことをやってみると、SDRAMの中身が読みだされます。

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

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

USBWriteData8関数を呼び出せばFPGAボードにデータを送ることもできるので、カメラのI2Cレジスタの書き換えなどもできます。
スクリプトを作って.mファイルにしてまとめておくと便利です。

MATLABなので、MATLABらしく、数値計算してみましょう。
以下のような式でラプラシアンフィルタを作って適用してみます。
f=[1,1,1;1,-8,1;1,1,1];
Zf=filter2(f,Z,'same');
Zf = uint8(Zf);

上の画像は、パソコンのキーボードと私の手です。輪郭が抽出されて見えるようになりました。
これは静止画ではなくて、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ボードをつないでみたいとお考えの方、ぜひともお問い合わせください。
最近のコメント