製品情報>Spartan-6評価ボード>コラム>LabViewからSpartan-6ボードを使う

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の手順で、いくつか注意しなければならないことがあります。

  1. のアイコンを配置します。は、unsigned char型の数値をブール変数に変換するために配置してあります。C言語のキャストのようなものです。
     
  2. 成功/失敗を表示するためフロントパネル上に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のような配線を行います。

 


 
図6 USBReadを追加した全体像(クリックで拡大)

以下、部分ごとに説明します。

関数の引数

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を使用してコントロールができるようにした例


© 2017 TokushuDenshiKairo Inc. All rights reserved