FC2カウンター FPGAの部屋 2008年10月25日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

柿の収穫

今年も柿の木に柿がなって食べごろになった。今年は本当に当たり年で数え切れないほどの実がなっている。
今年は柿の実の当たり年だそうで、うちでも食べきれないほどの柿がなった。

kaki_1_081025.jpg

今日は、下の娘とばあちゃんとで柿の実を収穫した。立派な柿をたくさん収穫したが、まだまだ全体の1/3くらいだ。後の柿はもう少し明るむまで木に残して置く。実をもいだほうが鮮度が落ちるのが早いので、食べない分は残しておくのだ。しかし、それでもたくさん取れたので、どこかにおすそ分けしないと。。。柿をもいでいるときに近所の人が通りかかったので、早速、おすそ分けをした。

kaki_2_081025.jpg
  1. 2008年10月25日 22:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後5(bootloaderをいじってみる)

昨日は35回もブログ拍手をいただきました。そんなに喜んでもらえたのか?とうれしかったです。今週は木、金曜日と2回も宴会があって忙しかったです。そういうわけでsoc-lm32でuClinux計画もあまり進んでいません。やはり、今までのFPGAハードウェアに加えて、ソフトウェアまでやるのは結構大変ですね。覚えなくてはいけないことが多いです。
というわけで今までできた成果といいましょうか、ISEのプロジェクトをほしい方はいらっしゃるでしょうか?でもまあ、soc-lm32のDDRが動けば今のところ同じレベルなので、あまり変わらないという気がします。同じプロジェクトをいじってもらって、uClinux を載せるアドバイスをしてほしい気もしますが、どうやって配布するのかも問題ですね。バッチファイルでの差分の適用やcygwinをインストールしてもらうことにしてmakeで差分を適用するとかですかね?

今のところはuClinuxやtool chain をビルドするために、VMware Server をインストールしたので、その上にFedora9をインストールする準備をしています。
それと平行にbootloaderはソフトウェアの勉強のために、いろいろいじりました。ダウンロードしてきたbootloaderだとタイプしたコマンドが出力されなかったり、とても味気なかったので、表示するように変更したりしています。
どうもですます調だと調子が出ないので、ここからである調にします。

DDR SDRAMでのプログラムの動作とソフトウェアの書き方を覚えるために、gpioにマップされているLEDを点灯するプログラムを書いていた。u (upload command) でimage.ram のイメージを読めるようにして、それをDDR SDRAMのアドレスに送って、gコマンドで走らせたが、なんか暴走してしまう。(当然、crt0ram.o はld からはずしました)
とりあえず、bootloader にLEDを点灯するためのコードを追加してみた。
LEDを点灯させる関数ledtestを1回呼ぶごとに+1した値を表示するようにしてみた。機能を実現するためにstatic char c=0; を定義して関数を呼ぶごとに+1 するようにした。
led_write(c)は、gpio_out に8ビットの値(c) を出力する関数だ。gpio_out がトップのsystem.v でボードのLEDにつながっている。

void ledtest(void)
{
 static char c=0;

 led_write(c++);
}


これを追加すると、(当然ここに飛ぶようにはしてあるが)プロンプトを表示しただけで、コマンドを受け付けなくなってしまった。こことコマンド待ちで飛ぶところをコメントアウトすると動作する。要調査。
それではと、表示する値を入れることにした。lコマンドを入力すると、Led Display Data = と聞いてくる。ここで値を入れると、その値をLEDに表示する。下の図では55 を入力している。

soc-lm32_11_081012.png

上のようにやって、SW1をONにしても01010101(55) が表示されない。ちなみにSW1をONにした時にgpio_leds の値を表示するようになっている。

assign led = (sw[1]) ? gpio_leds : debug_leds;


動かないので、本格的に調べることにした。まずはsoc-lm32全体のメモリマップはどうなっているのだろう。
全体のWishBoneバスの調停はwb_conbus_top.v が行っているようだった。アドレスデコードの様子を見るためにVerilogコードを見ると、アドレスの最上位1ビットは無視しているようだった。
最上位のsystem.v でwb_conbus_top.v のparameter は下のようになっている。ちなみにパラメータで各モジュールのアドレスマップを決めるようである。

wb_conbus_top #(
 .s0_addr_w ( 3 ),
 .s0_addr ( 3'h4 ), // ddr0
 .s1_addr_w ( 3 ),
 .s1_addr ( 3'h5 ), // flash0
 .s27_addr_w( 15 ),
 .s2_addr ( 15'h0000 ), // bram0
 .s3_addr ( 15'h7000 ), // uart0
 .s4_addr ( 15'h7001 ), // timer0
 .s5_addr ( 15'h7002 ), // gpio0
 .s6_addr ( 15'h7003 ),
 .s7_addr ( 15'h7004 )
) conmax0 (


よって、アドレスマップは

DDR0   0x40000000~ または 0xC0000000~
FLASH0 0x50000000~ または 0xD0000000~
BRAM0  0x00000000~ または 0x80000000~
UART0   0x70000000~ または 0xF0000000~
TIMER0  0x70010000~ または 0xF0010000~
GPIO0   0x70020000~ または 0xF0020000~


となるはず。。。
bootloader フォルダの中のspike_hw.c のgpio_t 構造体定義のところのコメントを削除していたのだが、そこが間違っていた。最初は下のように書いてあった。

gpio_t *gpio0 = (gpio_t *) 0xF0002000;


良く見ると、上のアドレスマップからすると間違っている。正しくは下。

gpio_t *gpio0 = (gpio_t *) 0xF0020000;


こうしたところ、LEDに正常に表示するようになった。
soc-lm32_081025.jpg

今度は、DDR SDRAM上でソフトを動作させてみようと思う。
それから、moleのあなぼこさんの”Spartan3E Starter KitでuCLinux 2”でも書いてあったが、bootloader を変更すると論理合成からやり直しでは時間がかかる。moleのあなぼこさんでは、data2mem で直接BRAMにプログラムをロードしていた。私もdata2mem の記事は書いたことがあるし、やり方は知っているが、image.ram も変更しておかないとシミュレーションがうまくいかない。ということで、違うやり方を試してみようと思う。
  1. 2008年10月25日 08:56 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0