読者です 読者をやめる 読者になる 読者になる

Tech と Culture

テクノロジーとカルチャー

ポーティング

自分の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.vhdにjpegコアを追加

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/
ここにあるファイル:rcSのIPアドレス指定部分を自分の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
で実行