PICマイコンを使って測定ツールを作ってみよう(番外編2) ―― FPGAを使って測定ツールを作ってみよう
tag: 組み込み 半導体 電子回路 ディジタル・デザイン
エレキ系DIY 2012年6月21日
●フラッシュROMから画像ファイルを読み出して表示するデモ・アプリを移植
LTMにはCD-ROMが付属していて,DE0だけでなく,さまざまな基板のデモ・アプリが収録されています.その中で使えそうなものが,DE2_115やDE1向けの「Ephoto」です.これは,480ピクセル×1140ピクセルの画像ファイル(bmpファイル)をフラッシュROMに書き込んでおくとLTMに表示されるというものです.LTMの隅をたたくと,3枚の800ピクセル×480ピクセルの画像が順次,入れ替わりながら表示されます.これなら,タッチ・パネル制御と画像表示の勉強ができそうです.
ただし,DE1のFPGAのコードをそのままコピーしても動作しません.基板の仕様に合わせた修正が必要です.DE0の基板の回路図とDE1の回路図では,フラッシュROMの制御に違いがあります.同じフラッシュROMを使っているのに,DE1では回路が8ビット幅に固定されており,DE0では8ビット幅と16ビット幅の両方に対応しています.この指定は「BYTE#」というピンで設定するようになっています.DE0では,このピンがしっかりとFPGAのI/Oピンに接続されています.またGPIOコネクタの名前のつけ方も変わっています.
DE1やDE2_115では,40ピン・コネクタのうち電源ピンを除いた36ピン全部がGPIO0_D[35:0]と命名されています.ところがDE0では,GPIO0_D[31:0],GPIO0_CLKIN[1:0],GPIO0_CLKOUT[1:0]に分けられています.名前そのものをDE1と同じに修正してもいいのですが,ピン・アサインのほうも修正しないといけなくなるので,DE1のソース・ファイルをコピーしてDE0とし,その中のDE1用の名前をDE0用に修正しました.こうすると,DE0のピン・アサインをそのまま使えます.
FPGAの設計にはVerilog HDLという言語を使いました.仕様や定義のしっかりしたVHDLという言語もありますが,普及度の高いVerilog HDLがDE0でも使われています.Verilog HDLのファイル(拡張子が.v)は下記のとおりです.
- adc_spi_controller.v
- DE1_LTM_Ephoto.v
- flash_to_sdram_controller.v
- lcd_spi_cotroller.v
- lcd_timing_controller.v
- Reset_Delay.v
- three_wire_controller.v
- touch_point_detector.v
このほかに,サブディレクトリにSdram_Control_4Portがあり,この中に以下のファイルが入っています.
- command.v
- control_interface.v
- sdr_data_path.v
- Sdram_Control_4Port.v
- Sdram_PLL.v
- Sdram_PLL_bb.v (これは不要です)
- Sdram_RD_FIFO.v
- Sdram_WR_FIFO.v
修正はDE1_LTM_Ephoto.vのみに必要で,ほかのファイルは修正する必要がありません.また,ピン・アサインはDE0の付属アプリケーションからインポート(Import)します.
以上の修正を施し,コンパイルしたファイルをzipでまとめたものを,以下のところに置きます.
この中の,DE0_LTM_Ephoto.sofをプログラマ(「QUARTUS2」→「tool」→「programmer」)でFPGAにダウンロードすれば動作します.本来の機能のほかに,7セグメントLEDにタッチ・パネルを押したときのXY座標を表示するようにしています.2けたずつしか表示できないので,それぞれ12ビットの上位8ビットを4ビット2けたに分けて16進数表示しています.またLEDにはタッチ・パネルからの各種信号を表示しています.押したときだけ点滅するので,動作確認にも使用できます.
画像を表示するには,前もってフラッシュROMにbmpファイルを書き込まないといけません.800ピクセル×480ピクセル,24ビット・カラーのbmpファイルを3枚縦につなげ,800ピクセル×1440ピクセルのbmpファイルにして書き込みます.
これだけで約3.3Mバイトあるので,4MバイトのフラッシュROMはほぼ満杯になります.書き込みの際には,付属アプリケーションのコントロール・パネルを使います.CD-ROMに付属しているものは古いので,最新版をTerasic社のWebサイトからダウンロードします.古いアプリケーションでは,ファイルの最大サイズが512Kバイトに制限されています.最新版では制限は4Mバイトになっています.
写真1が動作した様子です.LTMを縦にして,右上隅をたたくと次の画面に進み,左下隅をたたくと前の画面に戻ります.LCDの上で指を走らせると,そのXY座標が7セグメントLEDに表示されます.
このデモ・アプリが実用的であるといったのは,その実現手法にあります.LCD端末では,出力は画像,入力はタッチ・パネルが主流です.この両方を備えています.そして,内部の制御にSDRAMを使い,高速に表示できるようにしてあります.簡単なものはSRAMを使って表示しますが,SRAMは容量がSDRAMと比べて小さく,高価です.一方,SDRAMは制御が難しく,自分で一から作るのは容易ではありません.Ephotoにはこの面倒な部分が最初からそろっています.
4ポートのFIFO(First-in First-out)を使い,フラッシュROMから読み出しながらSDRAMに書き込み,同時にSDRAMから読み出してLTMに出力しています.これをPICマイコンに処理させると長い時間がかかります.SRAMのアドレスそのものが22本必要になり,PICマイコンの28ピンや44ピンでは制御できません.安価なCPLD(例えばAltera社のEPM240T100)を使って実現することも可能ですが,全部自作するとなると,けっこう時間がかかります.HDLの勉強を目的としない人は,Ephotoのようなデモ・アプリを利用したほうが近道だと思います.
●FPGA内部のCPUから描画するデモ・アプリも移植
Ephotoは必要な処理をHDLだけで実現していて,肝心のCPUから描画するという機能がありません.それを可能にしているのが「Starter」という付属アプリケーションです.これはNios IIという(ソフト・マクロの)CPUコアを使っており,Cでプログラムできます.ここでは評価目的だけに使える機能制限版を使用します.フラッシュROMに書き込めるPOFファイルは作れず,time_limitedと末尾についたSOFファイルしか生成できません.電源を切ったりUSBケーブルをはずすと,動作は停止します.
これも移植したので,zipでまとめたものを以下のところに置きます.
これは,LCD画面にフレーム・バッファを2枚用意して,交互に表示するようにしています.四角形,丸,直線などの基本図形は簡単に描画できます.画面に文字を表示するのは少し面倒です.
まず,sprintfによってSztextにフォーマット付きで文字列を書き込みます.次にvid_print_string_alphaで,バッファに書き込みます.最後に,alt_video_display_register_written_bufferで表示するバッファに切り替えます.こうすることで,書き込み時に出やすいちらつきを抑えます.
タッチ・パネルの入力も簡単です.alt_touchscreen_get_penでXY座標が読めます.タッチ・パネルが押されていれば,戻り値がTRUEになります.whileで待ち受ければ,値を取得できます.
この二つとSDカードの読み書きで,たいていの作業は可能になります.
手軽なツールとするには,もう少し小ぶりなDE0nano(79ドル)が良いのですが,このボードにはSDカードが付いていません.microSDカード・コネクタを付ければ,非常に使いやすいものになります.A-Dコンバータもあるので,aitendoなどの安価なタッチ・パネル付きLCDが使えます.3軸加速度センサも付いているので,おもしろいアプリケーションを実現できます.
なお,開発ツールであるQuartus IIをAltera社のWebサイトからダウンロードすると11.1sp2がインストールされますが,Windows 7の64ビット版にインストールすると,USB-Blasterの機能をが使えなくなります.OSはきちんとドライバを認識していますが,プログラマ(programmer)が認識しません.Altera社のFORUMを見ていると,同じ問題についてコメントされており,11.1sp1以前のドライバなら認識されるとありました.筆者も,以前のドライバを持ってきて使っています.
なかにし・しろう
(有)NSL