LabViewからSpartan-6ボードを使う
特電Spartan-6ボードは、National Instruments社のLabVIEWから使うことができます。
Spartan-6ボードとPCとをUSBで接続して、LabView上にデータを取りこんだり、LabViewからSpartan-6ボードを操作したりすることができます。
このページでは、LabVIEWの部品としてSpartan-6ボード自体や、FPGA内に構築したモジュールを配置する方法を説明します。
準備編
用意するもの
LabView本体と、DLL(tkusb_lv.dll)を用意してください。
- 本チュートリアルではLabView 2010を用います。
- tkusb_lv.dllは、任意のディレクトリに置いて構いませんが、本チュートリアルではC:\sp6_labview に置くこととします。
FPGAに書き込むデータ
FPGAには、あらかじめUSB-CMOSカメラのデザインを書き込んでおくものとします。
写真1 Spartan-6ボードとCMOSイメージセンサ
実際にはFPGAボード上のDDR2メモリやBlockRAMに何らかのデータが格納されていれば構いません。
つまり、お客様のアプリケーションが、ボード上のメモリにデータを書き込んでおいて、それをUSB経由でパソコンに取り込むというものであれば、ここで説明する内容はどのようなアプリケーションにも応用できます。
ライブラリ関数の呼び出しの基本
LabVIEWからユーザのライブラリ関数を呼び出すには、以下のように操作します。
図1 [関数]→[コネクティビティ]→[ライブラリ関数呼び出しノード]を配置
tkusb_lv.dll内の関数を呼び出す際の呼び出し規約はCにします。
図2 関数の呼び出し規約
Spartan-6ボードをOpenする方法
しかし、上記の手順ですべてを作っていくのは大変なので、ひな形となるプロジェクト「tkusb_functions.vi」を用意しています。
まず、スタートアップウィザードから[空のVI]を選択してください。または、すでに何らかのVIを開いている場合はメニューの[ファイル]→[新規VI]を選択します。ここではtutorial.viとします。
次に、[ファイル]→[開く]でtkusb_functions.viを開きます。[ウィンドウ]→[ブロックダイアグラムを表示]を選択し、ブロックダイアグラム画面を表示すると、以下のようなライブラリ関数ノードが並べてあります。
図3 tkusb_functions.viにあらかじめ用意してある関数群
この中から、目的の関数をコピーし、tutorial.viのブロックダイアグラム上にペーストします。
ここでは、USBOpen、USBSetSmajModeをコピー&ペーストします。
そして、下の図4、5のようにブロックダイアグラムを配線します。
図4 USBOpenが0を返した場合の処理を記述
図5 USBOpenが1を返した場合の処理を記述
USBOpenが成功した場合は、unsigned char型の1が出力され、失敗した場合は0が出力されます。
図中の枠はケース・ストラクチャで入力された値によって実行されるシーケンスが変わります。ここでは、0(失敗)の場合は図4のように、1(成功)の場合は図5のように処理するように配線します。
USBOpenは、引数startにunsigned char型の1が入力されたときに中のコードが実行されるようになっています。ですので、ここでは定数の1を入力します。
USBSetSmajMode()関数の実行
Spartan-6ボードは起動時にはUSB-JTAGモード(SmartJTAGという)になっているので、USBを通じたデータ通信ができません。
USBRead()またはUSBWrite()を行うためには、USBOpen()の後、USBSetSmajMode()関数を引数mode=0として実行しておく必要があります。
上の図3の構造を実行することで、USBOpen()が成功した際にUSBSetSmajMode(0)が実行されます。
いくつかの注意点
以上で説明したUSBOpenの手順で、いくつか注意しなければならないことがあります。
- のアイコンを配置します。は、unsigned char型の数値をブール変数に変換するために配置してあります。C言語のキャストのようなものです。
- 成功/失敗を表示するためフロントパネル上にLEDを配置します。ラベルは"Open/Close"とします。
連続実行ボタン
LabVIEWの連続実行ボタンを効果的に使用してください。
連続実行ボタンを押すと、USBケーブルをSpartan-6ボードに接続するとフロントパネル上のLED(USBOpenの成功/失敗を示す)が点灯し、ケーブルを抜くとLEDが消灯します。
この動作ではUSBOpenを実行中に何度も繰り返すためあまり実用的ではありませんが、labVIEW上でSpartan-6が動作していることは確認できます。
Spartan-6ボードへのRead/Write
この節では、Spartan-6ボードに対しRead命令とWrite命令を発行する方法を説明します。
本チュートリアルでは、CMOSイメージセンサOV7670で取得した画像データを、labVIEW上で表示することを通じて、USBReadとUSBWriteのやり方を示します。
前項で作成したtutorial.viに追加する形で、以下の図6のような配線を行います。
以下、部分ごとに説明します。
関数の引数
USBReadDataには図7に示すように、いくつかの引数があります。
図7 USBReadの引数
bufに入れている のアイコンは、配列初期化ノードといって、関数パレットの[プログラミング]→[配列]→[配列初期化]で配置できます。
lenには、取得したい画像のサイズを入れます。
flagは、特電製のAPI特有の引数で、FPGA内のどの回路からデータを取り出すかを指定するものです。2を指定することで、ボード上のDDR2 SDRAMのデータを読み出すようになります。
OV7670の画像サイズはVGA(480x640=307200)なので、配列の長さも307200にします。要素の値は何でもいいので0に初期化します。bufには取得されたデータが格納されるのですが、そのためのメモリを確保する役割を持っています。USBReadDataを介してデータが格納された配列は、bufの右側の端子から出力されます。
USBReadDataを配置するには tkusb_function.vi からコピー&ペーストするといいでしょう。
画像変換プログラムを埋め込む
図8のモジュールは、取得データbufを、画像データimageに変換します。
図8 プログラムの配置
bufの各要素の値は、CMOSイメージセンサの輝度にあたるため、これをR、G、B各色に割り当てることでグレースケールの画像データになります。
32ビットピックスマップは以下の図9のようなフォーマットになるので、Gに対しては8ビット左シフト、Rに対しては16ビットシフトして代入します。24~31ビット目は任意で、今回は24ビットピックスマップに入力するため、使いません。
図9 32bit PixMapのフォーマット
こうして、USBから取り込まれた生データbufが、画像データとして変換され、imageに格納されます。
画像表示モジュールを埋め込む
変換された画像データimageを表示する部分を説明します。
図10 画像表示部分
は、LabVIEWのメニューから、[プログラミング]→[グラフィック&サウンド]→[グラフィック形式]→[ピックスマップを平坦化]で配置できます。imageの接続先は24ビットピックスマップで、「左上」のパラメータはアイコンを右クリック→[作成]→[定数]で作成しました。
は、[プログラミング]→[グラフィック&サウンド]→[ピクチャ関数]→[平坦化ピックスマップ描画]で配置できます。
アイコンを右クリック→[作成]→[表示器]で新規ピクチャのアイコン が作成されます。
総合動作試験
以上のモジュールを配置すると、フロントパネル上は以下のようになります。
図11 全モジュールを配置した状態
Spartan-6ボードをUSBケーブルで接続し、連続実行ボタンを押すと、ピクチャ上に画像が表示されます。
図12 USBを通じて画像が表示された
labVIEW上でさらにノードを追加することで、OV7670のゲインや露光を調節することも可能です。
図13 USBWriteを使用してコントロールができるようにした例