(For Maker Faire Taipei 2017 customers: English explanation is written after Japanese.)

お待たせしました。MFT2015で頒布したPICUAL(PERIDOT用LCDシールド)のデモデータを公開しました。

Demonstration and sample data for PICUAL & PERIDOT board:

相変わらずの更新ペースですみません...。

先日MFT2015にサークルsilicombi名義で出展してきました。
そこで出してきたものの紹介や、頒布物を購入して頂いた人への情報ページリンクを提供します。

IMG_20150801_120055.jpg

SoCKitがやってきた

| コメント(0) | トラックバック(0)

Terasicに注文していたSoCKitが届きました。注文時はPre-Order 2014/03/07と表示されていましたが、

待たされるのを覚悟で注文してみたら、2週間で届いてしまいました^^;
PC050669.JPG
(http://sockit_support.terasic.com/)
送料(FedEx)含めて$330くらい。

載っているのは、AlteraのCycloneVにARM(Cortex-A9)を混載したSoCです。5CSXFC6D6のES版。
データシート等は誰でもダウンロードできます。→ http://www.altera.co.jp/literature/lit-cyclone-v.jsp

http://www.rocketboards.org/foswiki/Documentation/ArrowSoCKitEvaluationBoard
にブロック図がありますが、このボードはFPGA側、HPS(Hard Processor System; 要するにARM)側それぞれに
DDR3、スイッチ、LED等がついています。この規模の評価ボードとなると、DE0の頃のようなMILコネによる
GPIOはもはや付いていません。右端にあるHSMCになります。変換基板も一緒に買うべきか迷いましたが、
今回は保留しました。

rubic (mruby on NiosII)

| コメント(0) | トラックバック(0)

イベントの時だけ更新する、という放置っぷりから脱却を図るべく、現在挑戦中(そして次のイベントで出展予定)のネタについて書いておこうと思います。

組み込み向けRubyの「mruby」をAltera FPGAのソフトコアCPU「Nios II」で動かそう、というプロジェクトです。プロジェクト名を rubic と名付けてぼちぼち進めています。

Nios IIはソフトコアCPUだけあって、自分で命令セットを増やせるとか、Tight coupled memoryが使えるとか、普通のプロセッサには無い特徴があります。それを上手く使ったらmrubyを高速化させたりできないか?というのが、このプロジェクトを始めたきっかけですね。
詳しいことはコミケで頒布している薄い本(silicombi電子工作本 vol.3)に書いてます。

作業場所はこちらに。
https://github.com/kimushu/rubic

東雲LCDの件で半年ほどrubicから離れていたら本家mrubyの進化に追いつけなくなったので(^^;)、これまでの成果は放置してやり直しをするかもしれません。

これからしばらく、rubicやmrubyの話を書いていこうかと思います。では。

(2013/11/10 サンプルデータアップに伴い記事修正しました)
(2013/11/11 マニュアルの誤記修正)

えー、2年以上ぶりの投稿です^^;
相変わらずブログを書く習慣が付かず、放置気味というより完全放置のブログになっちゃっていますね...。

2013/11/3~4に東京お台場で開催されたMaker Faire Tokyo 2013に @silicombi というサークル名義で出展してきました。
そこで「東雲LCD基板」なるDE0-Nano用のLCD拡張基板を頒布しましたので、その情報をこちらに掲載します。

組み立てマニュアル:manual_20131111.pdf

FPGAのサンプルプロジェクトおよびプログラミング用データは準備中です。もうしばらくお待ち下さい。

(2013/11/10 追記)
お待たせしました。FPGAのサンプルプロジェクトを公開しました。(Quartus II 13.0sp1 Linux版で作成しています)
https://github.com/kimushu/shinonome-lcd/tree/v1.1.20131110

とりあえずすぐに動作検証できるよう、合成済みのjicファイルを用意してあります。
mft2013-demo/output_files/demo_jic.zipを展開し、その中にある de0nano_epcs*.jic と colorbar_epcs*.jic を
Quartus II Programmerを使って書き込んでください。de0nanoとcolorbarの2つはどちらから先に書き込んでも構いません。

なお、DE0-Nanoはリビジョンによって搭載しているSPI Flashの型番が異なります。初期のリビジョンではEPCS16、
後のリビジョンではEPCS64となっているようです。両方のイメージを用意してありますので、お持ちのDE0-Nanoに
搭載の型番を確認の上、一致する方のjicを使って書き込んで下さい。

※なお、私の手持ちのDE0-NanoはすべてEPCS64のため、EPCS16での動作検証できてません。
   どなたかEPCS16で検証出来た方はご一報頂けると大変助かります。

de0nano_*.jic はFPGAの合成結果が入っています。Quartus IIで合成したものを、EPCSの先頭に配置します。
colorbar_*.jicはNios II用のアプリケーションです。Nios II EDSでビルドしたelfをEPCSの最終セクタ(末尾-64kByte)に
配置するように設定されています。EPCSの最終セクタからELFロードするためのブートローダは
https://github.com/kimushu/altera_bootloader で公開しているものです。

デモには4つのモードがあります。DIP-SWで切り替えます。
  1. DIP-SW(1:ON,2:ON,3:ON,4:ON) -- フルカラーバー(7帯)表示
  2. DIP-SW(1:OFF,2:ON,3:ON,4:ON) -- 基板名称表示
  3. DIP-SW(1:ON,2:OFF,3:ON,4:ON) -- GPIO/アナログ入力値読み取り
  4. DIP-SW(1:OFF,2:OFF,3:ON,4:ON) -- MFT2013でやっていたマンデルブロ集合表示

こだわりはじめると公開が遅くなるので、マンデルブロ集合は相変わらずズームとか出来ません...。
MFTのときのままで、3枚の固定座標順次切り替えです。

コミックマーケット80で暑い中ブースを見に来ていただいた方、どうもありがとうございました。
そして、本が売り切れだった方、行ってみたら撤収した後だった方、すみませんでした。
今度からのイベント参加では、十分な数を用意するようにします。

さて、頒布していた本の「FPGA向けMPEG2デコーダ」の記事について、現状のソースコードを公開します。

m2v_dec_impl_r250.zip

1つめはデコーダIP本体、2つめはデコーダIPのテストに用いるソフトウェアデコーダです。
いずれも最初にreadme.txtをお読みください。

現状、
・単体テストは入力データ終端の取り扱いが上手く行かないかもしれません(=テストの最後でデータの取りこぼし等発生するかもしれません)
・結合テストは3フレーム目以降は動かないかもしれません。
・実機ではまだ動きません(ダレカタスケテ...)。回路図等もまだ含まれていません。
と、ひどい有様です。ただ、完璧を目指していてはいつまで経っても公開できないので、
大きな修正がある毎にアップしていきたいと思います。要望が多ければ管理しているsubversionのリポジトリ自体を見てもらえるようにできるかも。

前回のmakeから取り組んでいるプロジェクトなので、やりきってしまいたいですね。もうちょっと頑張ろうと思います。

気がついたら3ヶ月ちかく更新さぼってました...。

いきなりですが、夏コミに出展しています!本日(土曜日)、東地区T-02b サークル「silicombi」です!

今回の記事は「FPGA向けMPEG2デコーダをほぼフルスクラッチで作ってみた」です。
動画再生挑戦結局結合デバッグが通り始めたところまで進捗しましたので、そこまでの内容を書いています。

なお、ソースコードを当ブログで配布しますが、会場からのネットワークでトラブっているため、後日アップロードします。
ソースコード目当てで来られた方、申し訳ないですが少々お待ちください。

ずっとMPEG2の作業ばっかりやっていると、たまに違うことをやりたくなるわけでして。
先週、無性にアートワークがしたくなった時があって、ちょうどあったフリスクの空きケースを見て
思ったわけです。
「神は言っている。フリスクサイズのマイコンボードを(ry」

で、ありきたりではありますが、設計してみました。
フリスクケースに収めれば、携帯オーディオプレイヤーに。普通にピンヘッダつければブレッドボードでも使えそうなマイコンボードに。

使ったマイコンは最近秋月で単品販売を始めたルネサスRX(R5F56218BDFP)です。デコード専用IC等は載せません。
検証してませんが、たぶんRXならソフトウェアデコードできるだろう、と思いまして。

回路図はこちら3枚。
frisk-rx1.sch.sheet1.png frisk-rx1.sch.sheet2.png frisk-rx1.sch.sheet3.png
または→frisk-rx1.sch.pdf

ご覧になると分かるとおり、まだ定数値をTBDにしている箇所が結構あります。
(まだ何にも考えずに作っている証拠ですw)

現時点でのレイアウトも載せておきます。
frisk-rx1.brd.top.png frisk-rx1.brd.bottom.png

なお、今回のマイコンはD/Aが1chしかありませんので、別途D/A (MCP4922)を載せました。
そして、その基準電圧をRXの持つD/Aから出すようにしてみました。MCP4922は
出力段のアンプでゲイン2倍を選べるので、RXのD/A出力を中心に振ることができるうえ、
そのD/A電圧でボリューム調整ができるのでは、と思ったためです。
これでまっとうな音が出るのかは、試してないのでまだ不明です。
※詳しい方、ぜひツッコミいただけると嬉しいです。

とりあえずアナログ部分の試作評価と、ソフトウェアデコードが出来るのかをRX-Stickでも使って検証していきたいと考えています。

今回はMPEG2デコードIPの全体構成についてです。

その前に、まず動画像の基本を軽く解説します。
動画像とは、パラパラ漫画のように複数の静止画を連続して表示することで実現されます。これについてはご存じの方が大半でしょう。この静止画のことをフレームと呼びます。

問題はフレームの情報をどうやって圧縮するかです。1枚1枚をJPEGなどで圧縮すれば良さそうに思えますが、それだけでは圧縮率を上げることが出来ません。
そこで、動画像の時間的連続性を利用します。

動画像では多くの場合、連続する2枚のフレームの間に共通要素があります。シーンチェンジの瞬間を除き、前後2枚が全く別の画像になることは稀で、
・カメラの動きによる背景の移動
・物が動くことによる、一部の画像の移動
・全く変化無し
など、少なからずとも共通点があります。そこで、1枚前のフレームからの差分を用いることで、データ量を減らす工夫をします。

mpeg2mb.png

また、MPEG2ではフレーム内を図のように空間的に分けて取り扱います。16x16ピクセルの領域をマクロブロック と呼び、1つのマクロブロック(MB)は6つの小ブロック からなります。(分かりやすくするために私は「小」ブロックと読んでますが、規格書ではただの "block" と表されています)
小ブロックは 8x8 のサイズで、輝度成分4つと色差成分2つの計6つです。

なお、MPEG-2規格そのものについては書き始めるときりがないので、当ブログではあまり詳しく解説しません。
その代わり、
・「MPEG Video 技術」 http://home.catv.ne.jp/dd/pub/book/mpeg.html
・規格仕様書「ISO/IEC13818-2 Information technology -- Generic coding
of moving pictures and associated audio
information: Video」
などが参考になります。規格書は本来無料で手に入るものではありませんが、ドラフト版ならばネットで探せば手に入ります。
(大学の理工系図書館や、けいはんなの国立図書館なら正式版を読めるかと思います)


ふぅ、導入だけで書き疲れてしまいましたが、ここから本題のIP構成です。

mpeg2blocks.png

青色の枠が自作するモジュールです。

vctrl ・・・ 入力したビットストリームを解析し、デコードの必要な情報の取り出しと、画素データをrun&lengthペアに分解するところまで行います。run&lengthペアとは、量子化されたデータから、非ゼロの値と、その間にあったゼロの個数とをペアで表したものです。8x8の小ブロック単位で取り扱うので、最大64項目あります。

vdequant ・・・ run&lengthペアと量子化係数を用いて逆量子化を行います。vdequantを出る時点で、各ブロックのデータは8x8の周波数領域画素データになっています。

vidct ・・・ 8x8のIDCT(逆離散コサイン変換)を行います。vidctの出力は、8x8の空間領域画素データになります。

vmc ・・・ 動き補償を行います。前述の通り、MPEG2では直前のフレームとの差分を用いるので、前フレームの参照MBを計算し、vidctからの画素データを足し合わせて、最終的な画像を作ります。作った画像はフレームバッファにいったん格納します。

vdispdrv ・・・ 1枚のフレームをすべて処理し終わったあと、フレームバッファから画像を読み取ってLCDに転送します。

ざっとこんな感じ。すでに全てのモジュールを書き終えていて、単体でのデバッグを進めている段階です。

さて、次回はもうちょっと詳しい内容に踏み込んで書こうと思います。今日はここまで。

復活後一発目の記事では、まず現在作業している内容について紹介しようかと思います。

過去にはMP3プレイヤー(を途中まで)とかアンプ(今は訳あって使ってないけど)とかを書いてましたが、今はちょっとお休みしています。

現在はというと、MPEG2デコーダIPの製作を進めています。
この手のものって市販のIPが存在するので新規性はないんですが、動画コーデックの勉強を兼ねているので良しとします。

その代わり、
  • XC3S250E (Xilinx Spantan3E) ×1の中に収める。すなわち、DWM2007年7月号の付録基板で使えるようにする。
  • フルスクラッチで作る (=OpenCores等からIPの一部をコピーしたりしない。全部自分で書く)
  • (後に述べる)制約条件さえ満たしていれば、MPEG2の規格通りのストリームを処理する。(=コーデック仕様を都合に合わせて勝手に改変しない)
を目標にしています。

まあ、規模の小さいFPGAなんで、解像度が高いのとかはもちろん無理で、以下のように条件を設定しています。
  • MPEG2 PS (ISO13818-2) に準拠
  • 解像度は最高 320x240 (QVGA) まで
  • フレームレートは30fps固定
  • プログレッシブ形式限定
  • フレームタイプは I と P のみ許可
などです。
実は、これをmakeで出したくて前回のMTM06に参加してました。もちろん完成してませんでしたが^^;
会場で見に来てくれた方に次回こそは完成品持ってきます!なんて言っちゃったので頑張って作らないとw

というわけで、これから何回かに分けて製作の様子を公開していこうと思います。
実機で走るレベルまで達成したら、ソースは公開するつもりです。お楽しみに。(MPEG2はライセンス問題とかグレーなところがありますが、趣味でだれでも使えるようオープンにして、いろんな人に使ってもらってこそ取り組んだ甲斐があるので...)

今回は取り組みの紹介まででしたー。