2013/01/23

ZedBoardでDSLiteを拡大表示

今回はZedBoardでの作例を書いてみます。
ずいぶん前に製作してたのですが、写真の用意など遅くなって今更ブログに載せてみることになりました。

全体像がこんな感じです。


DS Liteを改造して表示画像をFullHD級にリアルタイム拡大する、というものです。
いわゆる偽トロキャプチャの亜流って感じでしょうか。
拡大等の処理はZedBoard上のZynqで行ってます。
Androidと接続していて、Android側を操作することで拡大率や拡大アルゴリズムを切り替えられるようにしています。

残念なのは改造の都合で、上下2画面の下側しか取り出せなかったことです(^^;

ブロック図にするとこんな感じです。

元の画像は256✕192ピクセルです。対して、表示モニタは1,920✕1,080。
上の写真は拡大無しで表示しているので、左上に小さく出てるな~って感じです。
一応、よって写真とるとこんな感じ。


これを拡大率をあげていくと……こんな風になります。





最終的に縦幅をフルにしたところで5倍ちょっとです。
写真撮ってないですが、もっと高い倍率でも動きます(その場合、当然、元画像の一部分が画面いっぱいに表示されることになります)。

拡大率だけじゃなくて、拡大アルゴリズムも切り替えられます。
両方とも、教科書に載ってる基本のアルゴリズムです。
上がニアレストネイバ、下がバイリニア(ちょっとエッジ強調入れてます)です。
あんまりうまく写真撮れてませんが……。

DS Liteの改造はこんな感じです。
液晶へのフラットケーブルこねくたの半田付け部分にUEWを半田付けしてます。
あと邪魔だったので、GBAカセットのコネクタは取っちゃってます。
半田付けがめちゃ疲れました……。

Android周りは一旦PICマイコン(PIC24FJ64GB002)に接続してからZedBoardに接続してます。
Android-PIC間はMicroBridgeで接続しています。
PIC側の実装は石井さんのmicrobridge-picではなくて、自分で実装したものを使ってます。
PIC-Zynq間はPIC側がマスターのSPIで接続しています。

Androidの画面はこんな感じです。
拡大率をシークバーでずるずるできます。
見た目では分からないのですが、下の黒い領域でピンチイン/ピンチアウトしても拡大率が変わるようにしてます。

とりあえず、わーっと写真披露した感じです。
お小遣いで買えるぐらいのFPGAボードでもFullHD(1,920✕1,080) 60fpsとかが扱えるんだぜ、ということで。

後日、部分部分で取り上げて、もう少し詳しく書くかも?です。

2012/12/14

FT311Dの設定

 引き続き、チップ単体そのままでADKが実現するFT311Dについてです。

 ADKは機器をAndroidに接続した時に機器を区別して立ち上げるアプリを別々にできるように文字列を送る仕組みになっています。
FT311Dのデフォルトは以下のようになっているそうです。
  • Manufacture : FTDI
  • Model (FT311Dのモードに以下のいずれか)
    • FTDIGPIODemo
    • FTDIUARTDemo
    • FTDIPWMDeomo
    • FTDISPISlaveDemo
    • FTDISPIMasterDemo
  • Version : 1.0
  • Serial : VinculumAccessory1
  • Description : Vinculum Accessory Test
  • URL : http://www.ftdichip.com
データシートによれば、これらは設定ユーティリティを使ってWindowsPCから書き換えられるそうです。
確かに設定ユーティリティがダウンロードできます。
こんな画面です。

 ですが、Development ModuleとどうやってPCと接続するのか分かりません。基板はUSB Type-Aコネクタですから、USBケーブルでは繋がりませんし…。
ユーティリティのドキュメントは「AN212 User Guide for FT311 Configuration Utility V1.0」らしいのですが、FTDIのウェブサイトにはまだ上がっていないようです。

 もしかして「VNC2 Debugger/Programmer Module」が必要なのかも?
ひとまずは、デフォルトのままでも困らなさそうなので、このまま使おうと思います。

FT311D Development Moduleを動かしてみました(その2)

 前回に引き続きFT311DのDevelopment Moduleを動かしてみました。
今回は簡易ロジアナを接続してどんな波形が出てるか見てみました。

GPIOモード

 まずはGPIOモードを見てみました。
モードは基板の3つのジャンパプラグで選べるようになっています。
下図の丸で囲んだ部分です。基板のシルク印字に従ってOpen/Closeを設定してから電源入れるとOKです。


 GPIO0とGPIO6を出力にして波形を見てみました。
まったく同タイミングで立ち上がっているようです。

 どうせ後で簡易ロジアナを使うならGPIO0~GPIO6全部を観測すれば良かったのですが、この時点ではオシロで測ってました。
おそらくですが、GPIO0~GPIO6は全て同一タイミングで変化するんじゃないかと想像してます。

 力業で何かのプロトコルを実現するのもできそうですね。

 GPIOの状態ですが、Androidのアプリが終了しても維持されるみたいです。
AndroidとのUSB接続が切れた時にFT311D側がリセットされるようで、出力に指定していたピンもハイインピーダンスになるみたいです。

PWMモード

 次はPWMモードで動かしてみました。
簡易ロジアナでPWM0, PWM1, PWM2を見てみました。設定は
  • 周期1ms
  • PWM0 デューティ 20%
  • PWM1 デューティ 40%
  • PWM2 デューティ 60%
としてます。
周期は1~250msを1ms単位で、デューティは5~95%を1%単位で指定できるみたいです。デモアプリの動きを見ると、デューティは0%も指定できるみたいです。

 波形はこんな風でした。
チャンネル間で立ち下がりが一致する形で動いているのが分かります。

 PWMモードもAndroidのアプリが終了しても信号出力は維持されるようです。
AndroidとのUSB接続が切れた時点で全チャネルLowになるみたいです。

SPI Masterモード

 最後にSPI Masterモード (FT311Dがマスターになる) を試してみました。

 デモアプリから何バイトかWriteしてみてSS0, CLK, MOSIを観測してみました。
上から3Byte, 4Byte 8Byteを送出した場合です。
3Byteの時は時間分解能が異なります。


 SSをかなりがっつりアサートしているようです。まぁ、きわどいのよりはいいです。
若干不思議なのは、送出バイト数によってSSの立ち上がりタイミングが遅くなったり早くなったりするみたいです。細かいことですが…。

 1Byteを送出した時のCLKとMOSIはこんな感じでした。
SPIはモードが4つありますが、FT311Dでは Androidのアプリ側から設定して切り替えられるようです。

 アプリの準備などができたら、どのくらいのレートが出るか測ってみたいな、と考えています。

2012/12/13

FT311D Development Moduleを動かしてみました

 ZedBoardも触ってはいるのですが、
FTDI社のFT311D Development Moduleが届いたので、とりあえずAndroidに接続してみました。

 FT311DはそのままでAndroidに接続するだけでADKが使えるというチップです。
FT311D側がUSB Hostになって、Androidに給電しながら動く形です。
コンフィグピン(3bit)の設定で
  • GPIO (7bit)
  • UART (1ch)
  • PWM (4ch)
  • I2C (1ch)
  • SPI (1ch, FT311Dがスレーブ)
  • SPI (1ch, FT311Dがマスター)
のどれかで動作させられます。(追記:PWMが抜けてたので直しました2012/12/13)

 これまでAndroidに何か繋ぐとなると、Arduino, PIC, mbedなんかでMicroBridgeかADKという感じでしたが、
簡単なGPIOや、ともかくUARTでいいって場合には、もうこれでいいんじゃない、というお手軽なモノです。

 FTDIサイトでデモアプリのソース、APKを配っています。
ひとまず、GPIODemoを試してみました。

 Nexus7 (Android4.2.1) で動かすとこんな感じで、すんなり動きました。
  • OUT BITMAPで0, 1をチェック
  • CONFIGをクリック
  • OUTDATAを操作して、WRITEをクリック
とすると、LEDが反応しています。

 次はNexus S (Android 4.1.1) に接続してみると…、動きません。というか画面が変です。
こんな感じです。

 どうもレイアウトがダメっぽいです。これでは右にあるはずのCONFIGやWRITEがクリックできません。

 ソースも配布されているので、手っ取り早くレイアウトをいじってみました。
手抜きですがこんな感じになりました。基本的にWidthとかMarginとかを小さい値にした感じです。
 これでなんとかCONFIGやWRITEがクリックできます。

 実際、接続してみると、操作しにくいですが動きました。

 このままGPIOなんかで使ってもいいのですが、
今後はFPGAとAndroidの接続に使ってみようかと考え中です。
Twitterで情報が流れてて、「あ、それがいいな」と。

 今までは

  • Android --(USB)-- PIC --(SPI)-- FPGA (PICでMicroBridgeを実装)
  • Android --(USB)-- MAX3421E --(SPI)-- FPGA (FPGA上のNiosIIにMicroBridge or ADKを実装)

とかやっていたのですが、FT311Dを間に挟むのがトラブらなさそうで良いかなと期待しています。

2012/11/14

ZedBoardのDDR3 SDRAMチップ

 ふと気づいたのですが、ZedBoardの2012/08/24版の回路図にはDDR3 SDRAMチップは
MT41K128M16HA-187E
となっています。 ですが、Hardware User's Guideには
MT41J128M16HA-15E
と書かれています。 Board Definition Filesのzedboard_RevC_v2.xmlにも
MT41J128M16HA-15E
と書かれています。

 結局、-187Eなのか、-15Eなのかどっちだよ。

 実物は……、直接の型番は刻印されてないんですよね。これに限らず、最近は小さい部品が多くて、刻印見ても型番分かりづらいですよね。

 でも、調べてみると、MicronはWebページにFBGA Decoderというのがあって、FBGAのチップ刻印とパーツ型番の対応を調べられます。

 結論としては、FBGAの刻印 D9LGQ は -15E と対応するので、搭載チップは-15Eの方でした。

 さらに、ZedBoardのサイトをチェックすると、2012/11/08版の回路図が提供されていて、それでは、型番が直っていました。ボードにも色々Errataがあるらしく、赤字でいろいろ書かれていて不安になる回路図です。

 ところで、-187E-15Eで何が違うのかというと、主には最大動作周波数みたいです。PCパーツ風に言えば、DDR3-1066かDDR3-1333かということですね。-15Eを666MHzで動かす場合はCL=9ですが、-187Eを533MHzで動かす場合はCL=7になるとのこと。-15Eは533MHzで動かせば-187EとコンパチになりCL=7で動かせるみたいです。

 ということで、ZedBoard開発では実物が-15Eでも、533MHz動作なのでCL=7にセッティングするのが、CL=9に比べて、ホンのわずかアクセスが速くてお得そうです。実際にSDKにExportされるhw_platformのサマリを見た限りでは、-15E設定でもCL=7になっているので、デフォルトで大丈夫みたいです。

Xilinx ISE 14.3

 これまでZedBoard用にはXilinx ISE 14.2を使っていましたが、14.3をインストールしてみました。

 WebPackライセンスでXPS立ち上がるときにラインセスエラーのダイアログ出るのは相変わらずでした。

 とはいえ良くなっている点はあって、まず、新規プロジェクト作成時のボード選択にZedBoardが追加されていました。


 これまではZC702で進めていって、後でZedBoardの情報をImportさせる、としていたので、一手間減りました。

 他にもPlanAheadでも見た目など微妙には変わっているようです。ですが、大きな落とし穴が……。

 BitGenまで進むと、
ERROR:Bitstream:188 - Bad time stamp "MON 29 OCT 10:2:52 2012". Expected "YYYY/MM/DD HH:MM:SS".
といったエラーが出ます。 既にXilinxのサポート情報にも載っていて、「ISE 14.3 - 「ERROR:Bitstream:188 - Bad time stamp"」というエラー メッセージが表示される」によると、

  • エラーと出てもbitファイルは生成される
  • LANGUAGE環境変数がJapaneseだと発生する
  • 14.4で修正予定

だそうです。エラー内容自体がどやねん、って感じですが、エラーと言っておきながらbitファイルは生成されるって……。

 それでも、発生条件が分かったので、回避できるか試してみました。
PlanAheadはバッチファイル(私の場合C:\Xilinx\14.3\ISE_DS\PlanAhead\bin\planAhead.bat)から起動しているので、それの最初の方に
set LANGUAGE=usenglish
と追記してみると、エラー出なくなったみたいです。

 Linuxでは試していないですが、同様の状況なら、LANG環境変数をCかen_USあたりにすれば回避できるように想像できます。

 長く使っている人ならCADツールのロケール周りの問題は珍しくはないですね。

 最近は、よく海外に行く人と話していると「シリコンバレーとか中国系とインド系の人ばっかり」とか聞きますので、ツール開発には英語ネイティブじゃない人が多く加わっていそうですが、それでもソフトウェアのインターナショナル対応は進まないものですね。

2012/11/13

ZedBoard未使用ピン

 ZedBoardというかZynqについてなのですが、PL部分の未使用ピンはどうなるのかな?と思ったので調べました。

 Xilinxの開発フローでは未使用ピンの状態はBitGenの時点で決まります。
BitGenはフローの最後に.bitファイルを生成するステップです。

 「コマンドラインツールユーザーガイド」のBitGenの章によると-gオプションで、サブオプションUnusedPinというところになります。

 Version 14.1については、Pulldown, Pullup, Pullnoneのいずれかが設定でき、デフォルトはPulldownだそうです。(デフォルト値はツールバージョンによって変わったことがあった気がします。XilinxじゃなくてAlteraの話だったかもしれませんが…)

 ZedBoardのチュートリアルなどでは、特にBitGenにオプション指定していないので、デフォルトのPulldownになっているのだと思います。

 ZedBoardのような開発ボードでは、FPGA外にいろいろ繋がっているけど全部は使わない、ということが多いので (例えば、SSRAM繋がっているけど使わない、とか)、変なことにならないようにしておきたいです。
 まぁ、気になるなら、使ってないデバイスについてもポート宣言キッチリしてCS#なんかをHigh固定でネゲートするとかすればいいんですが。

 DC特性によれば、Zynq側でのプルアップ/プルダウンは10kΩ以上の抵抗値みたいです。ということで、それより十分に小さい抵抗でプルアップ/プルダウンしている分には外付けのプルアップ/プルダウンが優先されそうです。うーん、でも、それはそれで、電流消費が増えたり、プルアップ/プルダウンに逆らってドライブするのが大変とか、相手のVILとVIHの範囲が云々…、と色々悩ましい感じもしますが。

 ま、ともかく、簡単にZedBoard回路図を見てみると……、

  • スライドスイッチ、プッシュスイッチ、LEDは変に電流流れたりすることは無さそう
  • Audio Codec、HDMI Transmitterは細かくは見てない。I2Cの外付けプルアップとZynq内部のプルダウンがぶつかっていて少し気持ち悪いかも
  • OLED(信号部分)も細かくは見てない
  • OLEDの電源スイッチのN-MOSのゲート信号が外付けプルアップ 10kΩとZynq内部プルダウンがぶつかっていて、上のI2Cより気持ち悪い気が

――というので、実はむしろPullup設定の方がいいのでは?という気も。

 とはいえ、ZedBoardのForumとかでも話題に出てないみたいだし。うーん、調べだしたはいいけどスッキリしない感じです……。