オンチップデバッグIP

Grlibの中にはLOGANというオンチップデバッグIPコアがあります。
Xilinxで言うところのchipscope のコアのようなものです。

見たい信号とLOGANを接続し、LOGAN自体はAPBバスにつないでおくと、GRMONを利用してホストコンピュータからバッファに蓄えられた信号を見ることができます。
digilent社のUSB-Blusterコンパチケーブルが届いてから、Chipscopeの評価版を利用してXilinxのボードだけで発生するバグを取ろうと思っていましたが、とりあえずこのコアを試してみました。

結果は、、、、
どの信号に問題があるか簡単に分かりました。RTLをいじってAPBバスに接続する必要があるという点が少し面倒くさいですが、機能的にはかなり使えます。chipscopeは無料ではないがLOGANは無料なので、これで代用可能です。

問題点は分かったのですが、何が間違いか分からず。。。。 何故か問題のあるvariableをsignalに代入するとバグが消えます。quartusでは発生しない問題なので、ISEのバグかもしれません。もしくは、XilinxVHDLの理解の仕方が何か特殊なルールがあるのかも。。。。

いずれにしろ、ちょっとしたワークアラウンドXilinx系のボードで画像によって発生する乱れが消えましたので、数日中にPUSHする予定です。

ポーティング

自分のFPGAボードにポーティングする方法について

私が動作させてみたボードは、GR-XC3S1500(Xilinx), BLANCA(Xilinx), NEEK(Altera)です。それ以外のボードにポーティングする方法


FPGAボードに必要とされる機能
・XC3S1500 相当もしくはそれ以上のサイズを持つFPGAが載っていること。XC3S1500で90%ぐらい使用します。
・VGA16bit出力がある。(DVIへのポートもML501の例に従えばできるはず)
イーサネットのPHYチップがある。 (NEEKはLCDイーサネットが同時に使用できないためストリーム再生できません。同様にファイルのみ再生で良いならこの条件は必要なし。)

1 gitでソースをダウンロード
#git clone git://git.sourceforge.jp/gitroot/fpga-leon-mjpeg/leon-mjpeg.git
#git checkout -b mytrial(任意の名前) origin/net-mjpeg
#cd leon-mjpeg/grlib-gpl-1.0.22/designs
ここに多数のボード用ディレクトリが有る。自分のボードがある場合は make ise-launch または make quartus-launchでJPEGコアなしのシステムがマッピングできる。
自分のボードが無い場合は、同じチップを使っているボードを探してディレクトリ毎コピー。
#cp -r leon3-gr-xc3s1500 xilinx-mine
同じチップが無い場合は、似たチップを使っているボードを探してディレクトリ毎コピーした後以下のように変更。
Makefile中の以下のBOARD指定部分を適当な名前に変更。例 xilinx-mine
BOARD=gr-xc3s-1500 を BOARD=xilinx-mine へ
次の行を見ると分かるようにボード設定のディレクトリからMakefile.incを読み込んでいる
#cd leon-mjpeg/grlib-gpl-1.0.22/board
に先ほどの名前(xilinx-mine)のディレクトリをコピー
#cp -r gr-xc3s-1500 xilinx-mine
xilinx-mineディレクトリ中のMakefile.incを修正して自分のFPGAバイスを指定する。

これで準備完了。まずは、JPEG無しのLinuxシステム動作させる。
#cd leon-mjpeg/grlib-gpl-1.0.22/designs/xilinx-mine

#make xconfig
GUIを使用してシステムコンフィグレーションする
#make ise-launch (alteraの場合は make quartus-launch)
マッピング

次にLinuxコンパイル
#cd leon-mjpeg/snapgear-p42
#make xconfig
GUIを使用してシステムコンフィグレーションする
#make dep; make
image/image.dsu が出来上がる。


ここまでで、通常のLEON-Linuxシステムが動作。次にmotionJPEGシステムを作る方法
#cd leon-mjpeg/grlib-gpl-1.0.22/designs/xilinx-mine
leon3mp.vhdjpegコアを追加

constant maxahbm を1増やす

以下の行を追加

jpgycc : huffdctycc
generic map(memtech => memtech, shindex => 4, haddr => 16#A00#, hirq => 10, pindex => 12, paddr => 12, mhindex => 3 )
port map(rst => rstn, clk => clkm, ahbmi => ahbmi, ahbmo => ahbmo(3), ahbsi => ahbsi, ahbso => ahbso(5), apbi => apbi, apbo => apbo(14));

XC3S1500 では、このままではFPGAに入らなかったため、memtech=>memtech を取り除いて合成ツールにメモリを推測するようにしています(非推奨)。
赤字の部分は、元にしたシステムとぶつからない値に設定する必要があります。
元システムの物理アドレスVHDLシミュレーションの最初に表示されます。または、実機動作中にGRMONでinfo sys
でも表示されます。

これで準備ができたので、#make ise-launch または #make quartus-launch でFPGA用ファイルが完成。入らない場合は、#make xconfigやり直して削除できるものは削除して再トライ

次にLinux
#cd leon-mjpeg/snapgear-2.6-p42/linux-2.6.21.1/drivers/kmjpeg
ここのkmjpeg.cの最初に物理アドレス指定部分がある。

#define AHBADD 0xa0000000
#define RDYADD 0xa0000200
#define APBADD 0x80000c00
#define QTBLADD 0xa000c000
#define ACADD 0xa0004000
#define DCADD 0xa0008000
#define MAXADD 0xa0000400
#define OFFSADD 0xa0000800
#define HUFFVADD 0xa0002000

このアドレスを自分のシステムの物理アドレスへ変更する。
(赤字の部分を先ほどVHDLにIPコアを追加したときに指定したアドレスに変更)

次にsnapgearのrcSの変更

#cd leon-mjpeg/snapgear-2.6-p42/vendors/gaisler/leon3mmu/romfs/etc/init.d/
ここにあるファイル:rcSIPアドレス指定部分を自分のLAN環境で許される値に変更
ifconfig eth0 up 192.168.24.80
赤字の部分を変更

次にsnapgearのカーネルコマンドラインの編集
#cd leon-mjpeg/snapgear-2.6-p42
#make xconfig
2番目に出てくるGUIカーネルコマンドラインを編集する。(NEEKのように画面サイズがVGAで無いものだけ変更が必要)
console=ttyS0 video=grvga:640x480@60,16,614400 をNEEKの場合以下のように変更
console=ttyS0 video=grvga:800x480,16,768000

これで準備完了
# cd leon-mjpeg/snapgear-2.6-p42
# make dep; make;
で image/image.dsuにイメージができる。
(NEEKのようにネットが使用できない:FTPできないボードの場合は、snapgear-2.6-p42/romfs/home ディレクトリに snapgear-2.6-p42/user/jpeg-6b-host/gfdl-qvga.mjpegをコピーしてもう一度#make 。FTPできるボードはブート後にFTPしても良いし、同様に最初から組み込んでも良い)

FPGALinuxをブートさせる。

teratermから以下のコマンド

#cd home
#mknod /dev/kmjpeg c 254 0
#dmjpeg -fb_add xxxxxxxx gfdl-qvga.mjpeg

xxxxxxxx はフレームバッファアドレス。ブート時に出力される。#dmesg で再表示
Framebuffer address from videomemory : 0x40f00000
の部分。

ストリーム再生させるには、ホストでffserverを起動し、準備させておく
#dmjpeg -fb_add xxxxxxxx -ip xxx.xxx.xx.xx
でストリーム再生
ip xxx.xx.xx.xx は、ホストのIPアドレス

よって、framebuffer address : 0x40f00000, ホストIPアドレス :129.168.24.51 の場合
dmjpeg -fb_add 40f00000 -ip 192.168.24.51
で実行

オープンソースワールド

オープンソースワールド」という本を読みました。

内容はエリック・S・レイモンドのオープンソース3部作を中心として、リーナスやストールマンのインタビュー等を追加したものです。

エリック・S・レイモンドの3部作は以下のページで全文を読むことができます。
YAMAGATA HIROO PAGE

伽藍とバザール」は、Linuxのように世界中のあちこちで分散的、自主的に参加する人たちによるシステムの開発(バザール方式)と、Linux以前のしっかりと組織をつくり組み立てていくシステムの開発(伽藍方式)についての話です。多くの人が伽藍方式でなければ複雑なシステムはまともに動作しないと考えていましたが、リーナスはバザール方式の優秀さを証明してしまいました。バザール開発のためのツールGitも開発しています。
結局の所、システムの問題は「問題を発見すること」が一番難しく、「問題の発見」は問題部分を開発した人とは別の人が発見する。そのことを考えるとより大勢の人間が参加するスタイルの方が優れているという内容です。
文中では簡単に「目玉の数さえ十分あれば、どんなバグも深刻ではない」と表現されています。
これは結構目からうろこの話です。特にハードウェアはひとつのミスがすべてを台無しにするので、伽藍方式に対するこだわりが大きい人が多い(私もそうでした)のですが、FPGAが今後どんどん発展していけば少なくともRTLのレベルではバザール開発の可能性が出てくると思います。

「ノウアスフィアの開墾」は、オープンソース界で見られるハッカー文化について説明したものです。
ソフトウェアは、食べ物や宝石のように誰かが手に入れたら他の人が手に入れることができないものではなく、いくらでも無料で複製することが可能です。そのことによって「贈与経済」というルールが組み立てられていることを説明しています。
もっともシンプルな社会システムは軍事力等を用いた「上位下達システム」です。現代の社会システムは自由経済原理に従った「交換経済」です。
それらの世界と異なる「贈与経済」について説明されています。
最近では、FacebookのCEOも贈与経済というビジョンを持っているという話をしています。
オープンソースに限らず、インターネットが発達したことによる現代のパラダイムシフトについて示唆を与える内容でした。

「魔法のおなべ」は、その贈与経済の中にいるオープンソース開発者がどうやって生活していくか、オープンソースと通常の交換経済のビジネス社会との関係はどうなるのかについて書かれたものです。
ここは、いまだにはっきりしていない部分だと思います。贈与経済の中にいるオープンソース開発者でも実際に食料を購入して生きていかねばならないので、それをどのような方法で成り立たせるかいまだに試行錯誤が行われていると思います。

この三部作はオープンソース活動のみに限らずに、現代社会で起こっている変化を見る視点を与えてくれるような示唆に富んだ文でした。

ネットの発達で世界中の人と意思疎通が可能になり透明性が高まる現在、集合的知性を引き出す手法が求められていると感じました。

sourceforge 6

ハフマンデコーダまでハード化したものをPUSHしました。

Branch 名

hw-huffdctycc


Alteraでは完全に動作しますが、Xilinxだと少し画像が乱れる時があります。
XC3S1500の時はRAMを論理合成に推定させないとFPGA内に入らないので、論理合成に推定させていますが、
そのせいではないかと予想しています。
今ある自宅の機材ではここまで。。。

まだソフトがネットワーク再生対応していないので、これから微修正します。