2009/02/10(火)[NiosII][ACM] 動画再生装置(お試し版)

はじめに

NEEKを使用したACM code*1データの再生装置を試作してみた.ALTERA FPGA/cyclone IIIを用いて,NiosIIコア,SOPC Builder・QuartusIIなどの使用に慣れることを目的とした事例である.

実機動作動画

ニコニコのほうにうpしておいたので,会員の方は参照されたい.


構成

cycloneIII内部のブロック図を以下に記す.(UWXGAであればpixel/dotで表示できるだろう)

system_block.png
\図中,背景色が赤いモジュールが自主開発となるモジュールである.\制御ソフトやHDL記述については,別所で記載したいと思う.(ゼロから作り上げたものは少なく,多くは参照したコードやHDL記述がある)

また,システム構成として,NEEKのブロック図を引用させていただく.

Blk_LCD.png

Blk_NEEK.png

本試作においても,全てのリソースを使用しつくしていない.半田付けもせずに.それなりに遊べる評価ボードであると考える.


緒言

ITEM Description part name
FPGAAltera Cyclone IIIEP3C25F324
Parallel Flash Memory8M x16 low voltage parallel flashPC28F128P30B85
DDR SDRAM4M x16 x 4 DDR SDRAMA2S56D40CTP-G5PP
Syncronus SRAM256K x 32 synchronous SRAMIS61LPS25636A-200TQL1


*1 : 適応的コードマッピング(Adaptive Code Mapping).ALTERAで行こう!にて公開されている軽量動画フォーマットです.ここでは,Rev20080421を便宜上v0.1と書かせていただきます.

ブロック説明

前述したブロック図を,SOPC Builderで配置・接続した例を以下に示す.

SOPC_view_ALL.PNG

基本的には,NEEKサンプルの"picture_viewer"をベースとして捕らえ,QuartusIIでフルスクラッチでプロジェクトを作成した.\チュートリアルでは,既存プロジェクトを改変して云々とあるが,新規に自主開発を行ううえで必要となる知識を得ることができないと判断した.\そもそもQuartusIIのver.upに伴う差分に対応できるかも不安であり,また,SDカードI/F等,サードパーティ製のIPを用いている点が引っかかった.\ためしに無償評価ライセンスを取り寄せてみたりもしたが,期限が一月ということもあり,個人でまったりと遊ぶには心もとない.\[em:無ければ作る]の精神で,増築していく方針で進めた.


NiosIIコアの構成

ゲート規模から考えると,余力が十分にあるため,Nios II/fコアの採用とした./eについては,1命令の実行に複数サイクルを要することから,今回のようにCPU演算量が多くなりそうな用途の場合,不向きである.SOPC Builderで,Nios II Processorの編集ダイアログを見ておきましょう.


cpucore_01.png
乗除算器もH/Wで実装させます.cyclone IIIにはmultiplierが載っているので,コレを使わせます.使用するものが無ければ,LUTでテーブルを作ってくれるのでしょう….\リセットベクタ・割込みベクタはSRAMに割り付けておきます.\DDRSDRAMに比べてオーバーヘッドが少ないためです.(今となってはTCMのほうが良いかな)\MMUは未使用としておきます.テーブルルックアップ処理などで,メモリアクセスのオーバヘッドが増えるため,OSが要求してこない限りは使わなくて良いかと思います.


cpucore_02.png
\cacheを有効にします.サイズは適当.本来ならばアプリケーション作成後にチューニングしていくと良いかと思います.D-cacheのline sizeは,SDRAMのburst readサイズにあわせておくのが無難でしょう.


cpucore_03.png
\例外処理等.まぁ特に要らないかなぁ.まじめに製品化を考えるなら,fail safeやエラートラップ・障害発生時のログ機能を作りこんでおくと良いでしょう.


cpucore_04.png
\MMU/MPU設定.今回は MMUを無効化しているので設定はできません.


cpucore_05.png
\デバッグ機能の設定.あまりまじめにやる気が無かったのでlevel2で.1でも十分:)\現段階では,trace機能を使う必要がでるほどチューニングも行っていません.


cpucore_06.png
\カスタム命令の追加.YCbCr→RGB変換の演算をHWで処理してしまいます.ソフトのみでコーディングするのに比べてかなり高速化されます.\カスタム命令の(実装|使用法|概要)については,[NiosII][ACM] 高速化・ベンチマーク測定を参照してください.



記憶領域

コアのインストラクション・データは,それぞれがAvalon-MM Masterとなっています.PCからのダウンロードで,全てのメモリへのデータ供給後にCPU startとなるようです.\それ以外はconfig ROMから吸い上げorスタートアップルーチンがFLASHから吸い上げて転送してくれるのかどうか(未確認).

基本的にSRAMにマッピングしておるので,DDRSDRAM側へのアクセスは少ないはずです.ただし,heap領域およびVRAM(裏面含む)を配置してあるので,データ転送量は相当*2なものとなります.CPUコアによる展開処理での転送と,LCD表示のためのSGDMAによる読み出しの転送とが発生しますので,さらに負荷があがります.LCDは,800x480x60FPSなので,92,160,000 Bytes/Secとなります.

このLCD用のSG-DMAは,DDRSDRAMコントローラとは64bitバスで接続されているので,帯域としては66.5x8=532 Mbytes/sec を有するので,占有は2割ほどです.ただし,コントローラのオーバヘッドや,CPUからのアクセス・SGDMA自身のデスクリプタテーブル読み出しによるアクセスが衝突することで,転送レートに大きな影響を与えます.*3


LCDC

前述のとおり,VRAMとしてDDRSDRAMを用いております.CPUとシェアしており,裏RAMからの転送処理が不要な反面,アクセス衝突によるパフォーマンス劣化が生じえます.

LCDとは,MAX IIを介して接続されており,レベル変換・demax処理をさせています.FPGAからは,RGB各8bitのデータを時分割で送信する形態をとっています.

現状は,picture viewerに習って,altera-video-sync-generatorを用いています.これはAavlon-STを受け取って,LCDに必要な同期信号・フロントポーチ・バックポーチ信号(クロック)を生成します.データはAvalon-ST Packetのback pressure機能を用いて,データ本体の未送出時には取り出さないようにさせています.

SG-DMAと,video sync generatorとは動作クロックも異なり,データ幅も異なります.途中でDFAやFIFOを噛ませて所望の形に直していきます.

表示装置や,Dot Per Pixelに手を加えるには,このあたりのモジュールや接続部分を変更していくと便利かもしれません.



MMC SPI

長船さんが公開されているVHDLのIPをVerilogに移植してみました.無償版のModelSimでのHDL混在シミュレーションができないため,やむを得ず移植しました.本来なら流用してウマーという流れなのでしょうが,無念ですw


その他

ALTERAの基本IPをぺたぺたと貼り付けただけなので,説明は不要でしょう.適宜邦訳版コンテンツやメモ,ALTERAから出ている資料に目を通してください;)



*2 : 240 x 160 x 24bpp x 24fps で 3,686,400Bytes/Sec.

*3 : SOPC Builderの接続図で細サイクル数を指定しているのも,裏RAMアクセス時にLCD表示が乱れたので手を入れてあるのです….

ドライバレベルソフト

ALTERA IPについては,基本的にドライバ(Hardware Adaption Layer)が用意されています.newlibの標準入出力関数に適応したドライバも用意されており,シリアル入出力ポートを用意しておけばデバッグ時に便利でしょう.\無論,JTAG debug機能が有効であれば Eclipse上(NiosII IDE上)からGDB経由でらくらくデバッグが可能でしょうが.


LCDC

NEEKサンプルのソフトを流用します.

C:\altera\72\kits\cycloneIII_3c25_niosII_eval\examples\picture_viewer\software_examples\app\picture_viewer\alt_video_display

SGDMAドライバも内部で使用しています.個人的にVsyncカウントもほしかったので,このソフトにも手を入れています.

SGDMAをPackモードで使用せず,デスクリプタチェインの終了を要因とした割り込みを用いてソフトで再キックしています.プロジェクトが落ち着いてから公開しましょう.恥ずかしいコメントだらけなので(ぇ-


MMC

当該IP制御に関するコードは長船さんのコードをパク…参考に,もってきました.FAT File Systemについては,おなじみのFatFsを使わせていただきます*4

個人でいじっている分には自己責任でアレですが,製品や人に配布するものとして適用してしまうとゲイツ陣営と争う必要が出てくるかもしれません.

また,SDカードの使用については,MMCへのアクセスを行っているだけである,という主張でSDカード非対応を宣言すればライセンシ不要という見方もあるようですが,軽くWEBサイトを見てまわった感じだと,わかりかねます.

データライン4本で転送してみたいものですがね….SPI 25MHz*5だとちょっときつい.



DAI

今回のACM v0.1対応版お試し公開では未使用.MMC I/Fのテストとして,waveファイルオープン・DAI経由でDACへデータを流して再生までは確認済.DAIモジュールにもFIFOを用意してあり,FIFO残量が減ってきたときに割り込みをかけて,FIFOへのデータ転送を行う.将来的にはAvalon-ST sinkポートを設けて,DMA経由で流し込めればCPUの処理を削減することができよう.

現状,ソフトでメモリ上にFIFOを構築して,割込みハンドラでデータを吐き出させている.メイン処理ではメモリ上のFIFO残量をポーリングして,ファイルからデータを吸い出している.


ACM decoder

ALTERAで行こう!暫定公開 → 軽量動画フォーマットの研究を参照ください.\更新されて名前が変わったりしているかもしれませんが,適宜対応ください(^^;




*4 : ChaN氏のFatFs Rev.0.06を取り込み,MMCを論理番号0と成るようにするなどの修正をしています.

*5 : MMCは20MHzまでの仕様だから,それ以上の使用はNGか!? デバイス内のレジスタに上限値が入っているから問題なし?

アプリケーションレベルソフト

Test Programとしてのみ実装.RTOSは未使用であり,単純にSDからデータを吸い出してデコード・表示しているだけです.

frame rateにあわせて時間間隔を所望の時間に近い値でウェイトを入れている.frame rateに対応する待ち時間はシステムクロックの整数倍にはならないので,誤差を吸収する措置を入れてある.(誤差を積算してウェイト値に加算するだけですが)





[コラム] SDカード

つい本日(2009年2月10日)のことです.

トラ技2009年3月号 BASICS [連載] Cによるマイコン操作術〈第12回〉SPIを利用してSDメモリーカードにアクセスしてみよう

ちょうど,この記事を目にできた.立ち読み程度で申し訳ないが,FATFSのライセンス・SDカード使用のライセンスについて,伝聞調で記されていた.参照資料も特別明記無く,商用利用時は調査すべきだ,程度で終わっている.

軽くググってみたものの,SDライセンス・FATライセンスに関する詳細がみあたらない.MSのパテントとして2007年末に米国で認められているようだが,パテント期限が17年(スラドJP過去ログ)とかなんとか….FAT12/FAT16/FAT32/VFATそれぞれで期限が異なるのかしら?

相変わらず疑問だけが残るけれども,ここでも解決せずに筆をおくことになる…(ゴメンナサイ)

  • 切れるとしていつごろ切れるのか.
  • 切れないとして無断使用はNGということで認識は正しいか.
  • linuxのfile systemとしてサポートが残っているが,ライセンス問題はどうなっているのか.

容易に組込み機器とPCとの間でデータをシェアしようと考えると,SD+FATFSが現状の最適解だと思う.active syncプロトコル自体もライセンスが要るようだし

最悪,セガサターンのRAMカセット並みのフォーマットで作ってもいいわけだが….MSDOSのメモリチェーン並みのしょぼさだけど(笑)

OK キャンセル 確認 その他