FC2カウンター FPGAの部屋 2008年10月

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

FPGAの部屋

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

soc-lm32のその後8(いろいろなlinuxをインストールしてみる)

どうもFedora 9にVMware toolsがインストールできない。
”VMware ESXiにFedora 9をインストールする(5) ~VMware toolsを導入する””Fedora 9にVMware Toolsをインストールするには”
を見てVMware tools をインストールしてみようとした。しかし、yum コマンドで、kernel-devel をインストールすると、新しいkernel ソースをインストールしてしまい、VMware tools にinclude ファイルのバージョンが違うといわれてしまう。それでは、kernel本体をリプレースしようとしても、依存性チェックでインストールできないといわれてしまう。
なんとか、kernel-2.6.25-14.fc9.src.rpm を見つけてきたが、うまくインストールできていないようだし。。。
手詰まりになってきたので、もう1つVirtual Machine を作って、違うlinux でやってみようと思う。まずは有名なUbuntu から試してみよう。Debian GNUの方がいいでしょうか?

FPGAからは外れてしまうが、VMware Server でいろいろなlinux を試してみるのも楽しいような。。。Windowsを走らせながら、試せるのがお手軽でとても良い。。。
  1. 2008年10月31日 05:52 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後7(VMware Server 2.0 のインストール)

DDR SDRAMでプログラムが実行できるようになったので、VMware Server 2.0 をインストールして、Guest OS として Fedora 9 をインストールした。その辺のやり方はバージョンは違うが、”仮想サーバの構築(VMware Server: WindowsXP編)”を見て行った。
VMware_Fedora_install_3_081026.png
上のサイトとは違って、VMware Server 2.0 では、設定はWebブラウザ上から行うようになったようだ。
VMware_Fedora_install_4_081028.png
これでLinuxの環境ができたので、"Building the Linux Port to LatticeMico32 System User Guide Lattice Semiconductor"を見ながらuClinuxをビルドしてみたら、すんなりビルドすることができた。Cygwinではビルドできなかったが、すんなりビルドしてくれたようだ。さすがlinux。。。
VMware_Fedora_install_5_081028.png
上のスナップショットで、imagesディレクトリにvmlinux.img などができているのが見える。
しかし、できたのは良いが、このファイルをWindows に移す方法が今のところわからない。USBメモリをマウントして取り出そうとしたのだが、USBをAuto connect enabled にしているのにConnectしようとするとConnectの設定部分がハイドされていて選択できない。
共有フォルダなどを作ってくれるVMware toolsをインストールしようとして、VMware Serverのマニュアルを見ながらインストールしてみたのだが、どうも、カーネルのCのヘッダファイルのディレクトリがデフォルトは違うようでインストールできない。Fedora9のカーネルのCのヘッダファイルのディレクトリはどこだろう?
VMware_Fedora_install_6_081028.png
いろいろやってだめだったら、Sambaをインストール、起動して共有しようとおもう。

さらに、このビルドできたuClinux はLatticeのボードのMico32用のドライバが付いているはずなので、今のsoc-lm32 の周辺IOとはVerilogソースが違っている。同じ機能を実装しているのかもしれないけど。。。なので、soc-lm32 のtimer や uart のソースやメモリマップをLatticeのボードのMico32にあわせるか?もしくは、uClinuxのドライバを書き換えないと動作しないはず。。。どっちにしようかな?

どうも全体的なuClinuxのブートの様子が良くわからないので、”はじめる組込みLinux H8マイコン×uClinuxで学べるマイコン開発の面白さ”という本も買ってみることにしました。
  1. 2008年10月29日 05:14 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後6(DDR SDRAM上でのソフトの動作)

DDR SDRAM上にbootloader と大体同じプログラムを40000000番地からld でリロケートして、DDR SDRAM用にした。それをbootloader のu コマンドでアップロードして(改造して.ram をアップロードできるように改造していある)動かしてみた。
そうすると、文字が化け化けになってしまった。どうやらuart_putstr(char *str) で書いたときだけだめなようだ。uart_putchar(c) は大丈夫みたい。試しに v コマンドをuart_putchar(c) で実装すると大丈夫。
soc-lm32_12_081027.png
上の図で
1.u コマンドでDDR SDRAMのアドレス、40000000番地にロード
2.TeraTerm のファイル転送でファイルを転送。
3.g40000000 でDDR SDRAMのアドレス、40000000番地にジャンプ
その後のオープニングメッセージが化けている。その後のv コマンドの表示結果は普通。。。これはuart_putchar(c) で書き換えてある。
理由はまた、DDR SDRAMモジュールに入れるアドレスをミスっていたからだった。
前回の”soc-lm32のその後3”で、WishBoneバスのアドレスをDDR SDRAMコントローラに入れるところの非同期FIFOの入力を下のようにしたが、

async_fifo_addr async_fifo_addr_inst (
 .din({wb_r_w, 1'b0, wb_adr_i[31:1]}),


これは、4バイトごとなので、

async_fifo_addr async_fifo_addr_inst (
 .din({wb_r_w, 1'b0, wb_adr_i[31:2], 1'b0}),


でした。またまたミスっていました。
これで、DDR SDRAMでのプログラム動作もよさそう。
soc-lm32_13_081027.png

DDR SDRAMのインターフェースのWishBoneバスにはバイト・イネーブルがないと思っていたが、wb_sel_i がそうだった。これを反転してDDR SDRAMコントローラのinput_mask に入れて、wb_sel_i にビットが立っていないバイトレーンは書き込みをマスクするようにした。でも今のところ、全部のバイトレーン書き込んでいても大丈夫そうだ。WORD幅に足りない変数はパッディングしているのかな?

  1. 2008年10月27日 20:32 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2

下妻ジャスコ、犬小屋の修理

今日の午前中は新装開店の下妻ジャスコに行った。
aeon_1_081026.jpg
入ってみると、反対側が見えないほどの規模。。。びっくり。昔行ったポルトガルのバスコ・ダ・ガマショッピングセンターみたい。。。すごいです。
途中に、ミニコンサートができるスペースがあって、合唱が行われていた。
aeon_2_081026.jpg
これはミニコンサートをする前のスペース。
元からのジャスコのスペースに巨大な専門店外をくっつけた感じ。二階に上がると、真ん中が大きく開いていて、下の様子が見える。1階で上を見ると眺めがいい。
aeon_3_081026.jpg
すごい、雰囲気でいっぱい買ってしまいそう。実際、奥さん、下の娘ともども、たくさん買い込んでいた。私も靴を買ってしまった。

午後からは3年前に作った犬小屋が腐ってきたので、屋根をつけることにした。塗装済みのコンパネ(合板)で作ってあったので、だいぶ持ったのだがそろそろ腐ってきてしまった。これ以上痛まないうちにポリカーボネート波板の屋根をつけることにした。
犬小屋に板を木ねじでとめて下地を作り、その上にポリカーボネート波板を貼っていった。素人仕事なので、だいぶミスってしまった。まずは板の打ち付ける長さを間違った。これは木ねじをはずして修正。
次に波板をとめるときに下を全部止めてしまってから、上が波板の重ねあわせ部分があっていないことが判明。もう一度、釘を抜いて、再調整してから、今度は上下順番にとめていった。こっちのほうが面倒くさい。屋根の上に上ると、たぶんばりっと行って落ちちゃうので、はしごを渡して体重を分散しながらとめているので、上がり降りが大変。疲れました。
一応何とかできました。
dog_house_1_081026.jpg
dog_house_2_081026.jpg

これがもとの状態です。
kaki_1_081025.jpg

  1. 2008年10月26日 22:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Veritak Version 3.51B にドラック&ドロップ拡大機能

Veritak Version3.51Bにドラック&ドロップ拡大機能が実装された。
SHIFTキー+左クリックしたい位置からドラックして、左クリックを離した位置の部分を拡大してくれる。
Veitak_V351B_1_081026.png

上の図で真ん中のピンク縦線の間の部分がドラック&ドロップ拡大機能で拡大を指定しているところだ。この図をとるために、自分の手はSHIFTキー+左クリックでふさがっているため、息子にPrint Screenキーを押してもらった。ピンク縦線の間が左クリックを離す(ドロップ)すると拡大される。
ModelSimでもカーソルをズームモードにすると同様にズームすることができるが、Veitakの方が便利だと思う。(私がModelSimのショートカットを知らないだけかもしれないが。。。)
ズームしたのが下の図。
Veitak_V351B_2_081026.png

さらにズームして、アドレスの値が見えるところまでズームしてみた。アイコンをクリックすることなく、カーソルをその場所あたりに置いたまま、どんどんズームできるので使い勝手が良い。
Veitak_V351B_3_081026.png

さらに全体がもう一度見たいときには、SHIFTキー+右クリックでお手軽にズームアウト(縮小)できる。SHIFTキー+右ダブルクリックでは2回分ズームアウトできる。
とても便利になったと思う。
  1. 2008年10月26日 06:22 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

柿の収穫

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

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

ブログ通信簿

gooのブログ通信簿で私のブログを評価してもらった。結果は
blog_tuushinbo_081021.png
図書委員タイプとのこと。。。最近Cのプログラムをやっているのでそれを見たのか?プログラマを目指そう!!!
実は今年の10月12日にも、通信簿をもらっておいたのだが、そっちはフリーターを目指そうとのこと?なんのこっちゃ?FPGAやISEの写真が旅行に見えたのか?
tushinbo_img_081012.png

最近はuClinuxの勉強をしながら、そういえばDDR SDRAM上では、メモリテストだけでプログラムを動かしてみたことがなかったので、Makefileの書き方を勉強しながら、Cでソフトウェアを書いている。
  1. 2008年10月22日 18:58 |
  2. 日記
  3. | トラックバック:1
  4. | コメント:0

Notepad++の不具合?― その後

”Notepad++の不具合?”で、同じファイルを2ペインで編集しているときに、単語を選択すると1つのCPUをNotepad++が占有してしまうという現象があった。これが解決するオプションを見つけた。
それは、設定 -> 環境設定・・・ を選んで環境設定ダイアログを出す。そこのSmart highlighting のチェックを外せばOKだった。
env_dialog_081021.png

これは動作を見ていると、同じ単語を自動的に探してハイライトしてくれる機能のようだ。これを切ってしまうとOKのようだ。
これで安心して? 2ペインで同じファイルを編集することができる。
  1. 2008年10月21日 12:31 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

自分流こだわり家具作り

昨日の午後は、つくば市の市民講座、自分流こだわり家具作りに行ってきた。この講座は全部で5回開講される。
木工はFPGAのほかの趣味の1つで、こっちの方が一般的に言ってもとおりが良いというか、わかってくれる。FPGAをわかる人はよほどの変人?(として一般の人は見ているだろうと思う) か業界人?
木工はめったにやらないが、必要があるときには棚などを作っている。いつも棚を作るときには1X4材で適当に作るので、本格的な木工も経験してみたいと応募してみた。
公民館の館長さんが講師だったのだが、玄人はだしの方で、いろいろな道具を家に持っているらしい。家具屋のスペースを借りて、作品を売り出す予定もあるそうだ。
素敵な棚が例として飾ってあったが、何を作ってもいいらしい。私は外で使う60cm×90cmのテーブルを作ることにした。材料はタモで、これはバットなどにも使われる硬い木だ。本当に良い材料を使用するようだ。
作り方は私がやってきたように木ねじがそのまま見えるようなやり方ではなく、穴を彫って、その下に木ねじの頭を埋めてダボを打ち込み、切ってヤスリがけ。木の木目を生かすやり方だった。実際に練習をしてみたが、ダボ切るときに、元の木を少し削ってしまった。失敗。。。
もう一度やってみたが、今度は成功。。。良かった。
今回は設計だけで、次回からは組み立てに入るようだ。木は館長さんが、今日の設計図を見て切って来てくれるらしい。
私のテーブルの設計図は館長さんがフリーハンドで書いてくれたものなので、自分で書き直してみようと、帰ってからJW-CADをインストールしてみたが、使い方がわからない。OpenOffice.orgのDrawの方が慣れているので良いかな?
3次元でぐりぐり動くのがいいのだが、手間がかかってしまうか。。。やはり現物あわせか。。。
次までには、のこぎりやコンベックスを買っておかないとだめなようだ。。。
  1. 2008年10月20日 05:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後4(uClinuxの勉強)

”soc-lm32のその後4(とりあえずuClinuxをビルド)”でCygwin でuClinuxのビルドを試みたが、まだビルドできていない。linuxに環境を作って、ビルドしてもいいのだが。。。
uClinuxバイナリはダウンロードできているので、それを使うためにハードウェアをLatticeのボードにあわせてもいいか?と考え始めた。
どっちにしても、uClinuxの勉強をする必要があるので、アマゾンで”組み込みLINUXシステム構築”を中古で購入した。これで一般的な組み込みLINUXの勉強をしようと思う。
”Linux Port to LatticeMico32 System Reference Guide”を読んで、Mico32用のuClinuxについても勉強しようと思う。
  1. 2008年10月18日 18:30 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後4(とりあえずuClinuxをビルド)

とりあえず、Building the Linux Port to LatticeMico32 System User Guide を見ながらTheobroma Systems Limitedにあるlm32-linuxやlm32-linuxのtoolchainsをCygwinでmakeしてみることにした。
順調にビルドできてきたが、10.のtoolchainのmakeでエラーが出て止まってしまった。
uClinux_toolchains_081016.png

このころは順調に進んでいたが、どうやらforkできなくなってエラーが出てしまった。メモリ使用量を見ると3GB使用している。それ以降のmakeはforkができないと言われてできなくなってしまった。Cygwinてメモリリークでもしているのだろうか?Cygwinを落としてもメモリの使用量は変わりがない。
toolchainのmakeはスキップしてもいいようなので、パソコンをリブートして最初からやり直した。
uClinux_Build_1_081017.png

最後の14.のmake でエラーが出てしまった。
uClinux_Build_2_081017.png

原因を調査中です。

追加:
原因はlm32linux-20080206\linux-2.6.x\scripts\mod\libelfbuild\libelf にINSTALL という名前のテキストファイルがあるのが原因でした。これがあるためinstall という名前のフォルダが作れなかったようです。INSTALLをINSTALL.txtに改名したら、そこは通りました。
現在はこの辺でエラーが出ています。
uClinux_Build_2_081017.png
  1. 2008年10月17日 05:30 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:4

VHDLでのブロックRAMや分散RAMの初期化(外部データファイル)

”soc-lm32をSpartan3E Stater Kitにコンフィギュレーション”でVerilogでのブロックRAMの外部データによる初期化を勉強したが、ISE10.1iSP3のXSTガイドのマニュアルのVerilogでの初期化の前にページにVHDLでの外部データファイルでの初期化も載っていた(245ページ)。
それで、VHDLでも、やってみることにした。実験用のMIPSプロセッサのサブセットの命令、データ用メモリがプリミティブで書いてあるので、それをXSTガイドのマニュアル245ページ(ブロックRAMの初期化(外部データファイル)のVHDLコード例)の方法で書きなおしてみた。
プロセッサのシミュレーションで一番問題なのは、プログラムをメモリにロードしないとシミュレーションできないことだ。ちなみに今までは、プリミティブで書かれたVHDLファイルの初期化部分をRuby で作ったスクリプトで、アセンブラの出力したプログラムリストをもとに書き換えてシミュレーションしていた。これの代わりにを外部データファイルでメモリを初期化できたら良いな?と思ったのだった。
idram.vhdはブロックRAMではなく、分散RAM(SLICEM)を使用しているので、dout の部分を process 文の外に出してある。こうするとXSTはブロックRAMではなく、SLICEMの分散RAMを使用してくれるようだ。

library IEEE, STD;
use IEEE.std_logic_1164.all;
use STD.textio.all;
use IEEE.std_logic_textio.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
-- pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
-- pragma translate_on
library work;
use work.lpm_pack.all;

entity idram is
    port(
        clk, reset : in std_logic;
        wr : in std_logic;
        iad, dad : in std_logic_vector(7 downto 0);
        ini : in std_logic_vector(31 downto 0);
        iout, dout : out std_logic_vector(31 downto 0));
end idram;

architecture RTL of idram is
type RamType is array(0 to 255) of bit_vector(31 downto 0);
impure function InitRamFromFile (RamFileName : in string) return RamType is
    FILE RamFile : text is in RamFileName;
    variable RamFileLine : line;
    variable RAM : RamType;
begin
    for I in RamType'range loop
        readline (RamFile, RamFileLine);
        read (RamFileLine, RAM(I));
    end loop;
    return RAM;
end function;
signal RAM : RamType := InitRamFromFile("idram.data");
begin
    -- データ用RAM
    process (clk) begin
        if clk'event and clk = '1' then
            if wr = '1' then
                RAM(conv_integer(dad)) <= to_bitvector(ini);
            end if;
            
        end if;
    end process;
    dout <= to_stdlogicvector(RAM(conv_integer(dad)));
    
    -- 命令用RAM
    iout <= to_stdlogicvector(RAM(conv_integer(iad)));

end RTL;


ここで、idram.data の一部がこれ。全部で256行。

10001100010000010000000000010100
00000000100001010001100000100010
00000000111010000011000000100100
00000001010010110100100000100101
00000001101011100110000000100000
00000000000000000000000000000001


残念ながらhread は使えなかった。read のみ使用可なので、idram.dataは2進数で書く必要がある。
これをシミュレーションすると、インストラクションが実行されている。
VHDL_init_data_file_1_081015.png

IF/IDのinstraction がそれだ。この機械語は、日経BP社の”コンピュータの構成と設計 第2版 下”の435ページのサンプルコードだ。引用させていただいてる。下にその自作アセンブラの出力したリストファイルを示す。

assembler        comment
----------------------------------------------------------------------------
            # P435 ラベル付けしたパイプラインでの命令実行状況
            
000    8C410014    :    lw    $1,20($2)    #
004    00851822    :    sub    $3,$4,$5    #
008    00E83024    :    and    $6,$7,$8    #
00C    014B4825    :    or    $9,$10,$11    #
010    01AE6020    :    add    $12,$13,$14    #
014    00000001    :    .word    1    #


というわけで、シミュレーションで実行できる。
さらに、インプリメントし、FPGAにコンフィグしても分散RAMにプログラムがロードされている。

次に、今までは分散RAMの外部データファイルによる初期化をやってみたが、今度はブロックRAMでやってみる。先ほどのidram.vhdを分散RAMからブロックRAMに変更する。
dout と iout をprocess 文の中に入れるとブロックRAMが生成されるはず。。。

    process (clk) begin
        if clk'event and clk = '1' then
            if wr = '1' then
                RAM(conv_integer(dad)) <= to_bitvector(ini);
            end if;
            dout <= to_stdlogicvector(RAM(conv_integer(dad)));
            
            -- 命令用RAM
            iout <= to_stdlogicvector(RAM(conv_integer(iad)));
        end if;
    end process;


これをインプリメントしてFPGA Editorで見てみる。
VHDL_init_data_file_2_081015.png

INT_00 のところに命令データがロードできているのが確認できる。(FPGA Editorのこの辺の使い方は”DCMの位相シフト量の変え方”を参照)
これで、ブロックRAMの場合も初期化できそうだ。
  1. 2008年10月15日 22:08 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

新しいテーブルを買いました

昨日は台所にいろいろな物を置けるように新しいテーブルを買いました。以前、台所にテーブルはあったのですが、60X120の細長い座卓に自分で足を足して台所のテーブルとして使っていたので、サイズが大きく不便でした。そこで、奥さんの給料も入ったことだしひとつ新調しようとして買いに行ったのでした。
はじめはホーマックで見たのですが、小さな食卓にもなるワゴンがあってそれが良いかな?と思ったのですが、いろいろ見てみようということで保留になりました。
すぐさま、奥さんと石下のホームジョイ本田に行って見てきました。木材コーナーで1X4を並べて自作しようかとか、そこにある2X4で作ったベンチの足を伸ばそうとか?いろいろ迷いました。
結局、テーブルに足をねじ止めする、お手軽なテーブルが良いということになりました。天板は白で波打っているようなテーブル、これが3,980円です。足はキャスターをつけたいと思っていたので、78cmの足にしました。これは1本900円です。足の長さはいろいろ選べます。短いのから最長90cmまでありました。お店の人に別のところで選んできたキャスターを付きますかと聞いたら、大丈夫という返事だったので、それも買ってきました。
いよいよ、家に帰ってから組み立てです。組み立てといっても足のねじ止めとキャスターの取り付けのみです。足は問題なく付いたのですが、キャスターのねじが入りません。
おかしい。。。もう一度、石下のホームジョイ本田に行って前と違う店員さんに聞いてみたら、このキャスターは付かない、そもそも純正はキャスターはなしで、足のキャップのみとのこと。。
えー。と思ったのですが、びっくりして文句も言えずじまいでした。最初に聞いたのは不慣れな店員さんだったのでしょう。。。片道10km以上あるのにプンプン。。。
家に帰って、やってみると純正だけにすんなり足キャップがねじ止めできました。
結構これでもテーブルが動くので、これでよかったかな?ということになりました。
table_081014.jpg
  1. 2008年10月14日 06:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後3

”soc-lm32のその後2”でLatticeMico32プロセッサのコンパイラの準備ができたので、DDRに4つWriteしてから、4つReadするようにCプログラムを書き換えて、シミュレーションしてみた。(元のブートローダ・プログラムはすべてのDDR SDRAMにWriteしてから、すべてReadしていた)
そうすると、自分で書いたWishBoneバスのインターフェースがおかしくて、wb_ack_oが出力されていなかった。これを修正して、WishBoneバスのプロトコルとしては正常になったが、今度はデータが1クロック遅れている。
何でと思ったら、非同期FIFOがFWFTモードでなかったのが原因だった。Coregenをあげて、もう一度見てみると、分散RAMの非同期FIFOはFWFTモードが選べなかった。
以前、”Virtex4のFIFO(FWFTモード)”でやってみた時は、Fifo Generator 2.3 のSpartan3で、BlockRAMと分散RAMのFWFTモードのFIFOをジェネレートできたようだ。しかし、ISE10.1iのFifo Generater 4.4 (Spartan3E) の分散RAMを使用した非同期FIFOでは、FWFTモードが選べない。
FWFTモードが選べないのはしょうがないので、データの出力イネーブルを1クロック遅らせた。
これでハード的には大丈夫なはず。。。
soc-lm32_10_081012.png

もう一度、ブートローダのmコマンド(memtest) をすべてのDDR SDRAMをテストするように戻してからインプリメントして、やってみたところ、まだMEMTEST ERROR が出てしまっている。どんな風に間違っているのかを調べるために v コマンドでDDR SDRAMのデータを見たら、0x40000000 であるはずのデータが 0x42000000 になっている。以下、同様になっていた。
soc-lm32_9_081012.png

これはおかしいと思った。もしやソフトウェアが間違っているのかも?どうも4回りしているような気がする。
soc-lm32/firmware/bootloader/spike_hw.h を見ると

#define RAM_SIZE 0x04000000


と書いてあったが、Spartan3E Starter Kit についてる DDR SDRAM (MT46V32M16P-6T) は512Mbit なので、バイトにすると 64Mbyte なので、0x04000000 であっているはず。
soc-lm32/firmware/bootloader/main.c の memtest.c 一部を下に引用する。

void memtest()
{
    volatile uint32_t *p;

    uart_putstr("\r\nMEMTEST...");

    for (p=(uint32_t *)RAM_START; p<(uint32_t *)(RAM_START+RAM_SIZE); p++) {
        *p = (uint32_t) p;  
    }



(uint32_t *)(RAM_START+RAM_SIZE)

のところで、RAM_SIZEを足した後に、uint32_t * でキャストをすると4倍になってしまうと思ったので、ここを、

(uint32_t *)(RAM_START+RAM_SIZE/(sizeof(uint32_t *)))

に変更した。

これでインプリメントして、m コマンドを入れてみたらOKとなった。v コマンドで内容を見ても、大丈夫そうだった。
soc-lm32_8_081012.png

これで、DDR SDRAMもOKとなった。。。自分で作ったDDR SDRAMコントローラIPの動作が確認できて、とてもうれしい。実際に、プロセッサのメモリとして動いているのを見ると、感慨もひとしおだ。
いよいよ、uCLinuxを勉強しながら、ダウンロードスピードを増すために、UARTのビットレートアップを図っていこうと思う。

2008/10/14:追加 くりさんのご指摘で考え直したところ、(uint32_t *)(RAM_START+RAM_SIZE) はそのままで良いという結論になりました。ということは私の作ったDDR SDRAMコントローラの最上位アドレス2ビットの扱いがおかしいということになります。もう一度、この近辺をデバックします。とりあえず、それ以外は動いているので、すぐデバックできると思います。
くりさん、ご指摘ありがとうございました。勘違いしていました。

2008/10/14:追加2 
DDR SDRAMコントローラの最上位アドレス2ビットの扱いがおかしい訳ではなく、バイトアドレスのWishBoneバスのアドレスを、RAMチップデータ幅単位(2バイト)のDDR SDRAMコントローラのアドレスにそのまま入れていたのが原因でした。
つまり、WishBoneバスのアドレスをDDR SDRAMコントローラに入れるところの非同期FIFOの入力を

async_fifo_addr async_fifo_addr_inst (
 .din({wb_r_w, wb_adr_i}),


から、これに

async_fifo_addr async_fifo_addr_inst (
 .din({wb_r_w, 1'b0, wb_adr_i[31:1]}),


に変更したところ、元のソフトウェアでOKとなりました。
お騒がせして申し訳ありません。。。
  1. 2008年10月13日 19:01 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後2

”soc-lm32のその後1”でMico32プロセッサを100MHzで動作させようとしたが、クリティカルパスが10ns 以上の遅延時間だったので、断念してDDR SDRAMコントローラだけ100MHzで動作させることにした。
そこで、DDR SDRAMコントローラに非同期FIFOを実装して、上記の動作周波数でインプリメントすることができた。
soc-lm32_6_081012.png
しかし、シミュレーションは大丈夫そうだったが、DDRにRAMSIZEをすべてWriteしてから、Readしているので、シミュレーションではDDRのWriteのみしか確認することができない。
実際にSpartan3E Starter Kitにコンフィグして、動作させて見ると、書き込みは終わっているようだが、Readが途中で終わってしまっているようだ。
シミュレーションで確かめたいが、ソフトウェアを変更しないとシミュレーションもReadの部分が見られない。(シミュレーション時間的に。。。)

この際、lm32のソフトウェア開発環境を整備することにした。”Mico32でもう一度やってみた”でCygwinを入れて、soc-lm32のページにあるlm32-src-patched.tar.bz2を解凍して、makeしてみたのだが、Errorで止まってしまっていた。
とりあえず、Design Wave Magazine 2007年10月号"オープン・ソースのCPUコアの実力を試す 32ビットRISCプロセッサ「LatticeMico32」レビュー”の記事のコンパイル済みのGCCツールが、おまけのCD-ROMに入っていたので、今回はこれを使用することにした。
cygwin から tar で展開し、コンパイルしてみたら問題なくコンパイルできた。これでMakefileを書き換えて bootloader を書き変えてシミュレーションすることができる。良かった。。。ポルトガルの山際氏、ありがとう。
Makefileに書いてあるパスを書き直して、lm32をコンパイルした結果がこれ。
soc-lm32_7_081012.png
これで、ソフトウェアも大丈夫。。。
これでDDRに4つWriteしてから、4つReadするようにCプログラムを書き換えて、シミュレーションしてみよう!
  1. 2008年10月12日 20:09 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

第27回 IBARAKI ウォークフェスティバル

今日は雨の中、うちの奥さんと夫婦で第27回 IBARAKI ウォークフェスティバルで筑波山のふもとを歩いてきました。
9時30分につくば市の筑波庁舎を出発して、りんりんロードを歩いて筑波山口へ。ここでトイレタイム。その後、つくば道を歩いて、普門寺へ。ここでお茶とアンドーナツをいただく。疲れているのでアンドーナツがおいしかった。
walk_rally_1_081011.jpg

その後、平沢官衙へ歩いていき、雨が降っていたので筑波総合体育館で昼食。その後、筑波庁舎へ帰ってきた。全部で12km 歩いた。疲れました。特に左足が疲れた。
最後に記念品(エコバックとお茶)と完歩証を受け取った。左足が痛くなった。普段の運動不足が効いているな。。。ちなみに参加費は無料です。
walk_rally_2_081011.jpg

その後、筑波大学に行って、研究室のデモとロボットコンテストをチラッとだが見てきた。学園祭をやっているのであった。
  1. 2008年10月11日 20:38 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後1

soc-lm32は自分のDDR SDRAMコントローラを接続して、soc-lm32全体を100MHz動作にして動かしてみることにした。最初シミュレーションをしてみたが、どうもコマンドを送っても動いてくれない?どうもおかしいが、とりあえず全体が100MHzで動くかどうか確かめるためにISEでインプリメントしてみることにした。
その結果はMico32プロセッサのmultiplierがクリティカルパスになって、タイミングがミートしてくれない。
soc-lm32_5_081011.png
だめそうだ。。。
やはり、動作周波数を50MHzに戻して、非同期FIFOでDDR SDRAMコントローラをつなぐことにする。

しかし、どうもISEのプロジェクト・ナビゲータのSourceペインの階層構築機能はおかしい気がする。ちゃんとicacheをdefineしているのに、icacheがinstruction_unitの下に入らないで論理合成をするとエラーが出てしまったりする。
そういう時は無理やりinstruction_unitなどに `define CFG_ICACHE_ENABLED を書くと階層に入るので、入ったらdefineを削除すれば大丈夫のようだ。もしかしてincludeファイルでdefineされたのは、うまく処理できていないのかもしれない。
  1. 2008年10月11日 05:14 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

DigilentのJTAG USBプログラミングケーブル

DigilentのJTAG USBプログラミングケーブルが届いたので、Spartan3 Starter Kitをコンフィグしてみた。
このケーブルは、ISEのプロジェクト・マネージャーからiMPACTで直接コンフィグすることができない。 Digilent Adept Suiteというソフトウェアを Digilent社からダウンロードして、インストールして使用する。
DigilnetのAdeptの中のExPortというソフトウェアを起動してコンフィグする。

Digilent_ExPort_1_081010.png

上図がExPort。Spartan3 Starter KitにJTAG USBプログラミングケーブルを接続して、Initialize Chain ボタンをクリックすると上図のようにJTAGにつながっているデバイスが見える。
Browse...をクリックして、FPGAにコンフィグするビットファイルを選択し、コンフィグROMにチェックを入れてバイパスする。

Digilent_ExPort_081010.png

Program Chain ボタンをクリックするとコンフィグが出来て、FPGAが動作する。

Digilent_ExPort_2_081010.png

コンフィグROMを書くときには、ISEのGenerate Programming File の下の Generate PROM, ACE, or JTAG File で mcsなどのファイルを作っておいて、Browse...をクリックして選択し、同様にProgram Chain ボタンをクリックするとコンフィグが出来る。これでMODEを変更すれば、電源ONでFPGAが動作する。
DigilentのJTAG USBプログラミングケーブルは、Chipscopeが使用できなかったり、ISEのiMPACTからコンフィグできないのが難点だが、Xilinx純正の USBコンフィグケーブルよりも安価で、すっきりしていて収納が楽だ。
  1. 2008年10月10日 17:45 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:3

ET2008へ行く予定

昨日、Embedded Technology 2008に申し込んだ。
いろいろ見所がありそうかな?面白そうなものがあると良いなと思っている。
行く日は、11月20日(木)に行こうと思っている。この日は、終わりに軽く飲み会があるんですよね? どこかにブースでご馳走になろうと思っているのだが、どうもシャイでだめだ。どこかの方よろしければ誘ってください。
カンファレンスはFPGAの無料セッションだけ受けようと思う。一応、下が登録したセッション。ただし、時間の関係で受けない場合もある。シリアルトランシーバと高速メモリインターフェースはぜひ聞いてみたいと思っている。

11月20日 11:30-12:15 FP-2 FPGAによる組込みシステムのアドバンテージ
11月20日 14:00-14:45 FP-4 FPGAによるシリアルトランシーバ接続による利点と課題
11月20日 15:00-15:45 FP-5 FPGAと高速メモリインターフェイス ソリューション
11月20日 16:00-16:45 FP-6 組込みLinuxとCPUを搭載したFPGAによる組込みシステムの超速開発

  1. 2008年10月10日 05:06 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

トラ技9月号の付属テスタ基板完成

トラ技9月号の付属テスタ基板がやっと完成した。いや、基板は前から完成していたのだが、今日、ソフトウエアを入れてテスタにしてみた。
マイコンにはトラ技BIOSが書き込まれていて、テスタ用のプログラムをフラッシュに書き込むのが簡単だった。
トラ技8月号付属マイコン基板をUSBに挿して、ドライバを組み込んで、TeraTermからflashコマンドを入れて、hexファイルをドラックアンドドロップ7回だけで、テスタ用のプログラムが書き込めた。開発ツールはインストールしていない。
早速、テスタにするべく、トラ技8月号付属マイコン基板をUSBコネクタから外して、テスタ基板に取り付けたが、液晶に表示しない。なぜ~?
トラ技8月号をよく読むと、101ページの図7にJ2をショートすると、ユーザープログラムが起動というのを見つけてショートした。
よし、これでOK!と電源を入れたら、まだ液晶に表示が出ない。もしやと思って、液晶の濃さを調整する半固定ボリュームを回したら表示が出てきた。やったー!
とりあえず、クロックを出してみた。最初は4000KHzになっていた。
tester_1_091009.jpg

ちゃんと4MHz出ている。
tester_2_091009.jpg

だが、周波数を変えても波形は変わらない。やっと2600KHzでその周波数になった。
tester_3_091009.jpg
tester_4_091009.jpg

はは~ん。なるほど、これは16MHzのクロックを分周しているのではないだろうか?4分周が4MHz、6分周が2.6MHzということになっているじゃないかな?
実際、説明書には120KHz以下しか表示に出力周波数が合わないと書いてある。分周比がある程度大きくないと、精度がでないわけか?考えてみれば当たり前。
次にファンクションジェネレータを試してみると。最初は620Hzからスタート、正弦波、矩形波、鋸波が選択できる。
tester_5_091009.jpg
tester_6_091009.jpg

正弦波を見てみると、階段状になっている。
tester_7_091009.jpg

そうか、これはD/Aコンバータの出力だ。。。ソフトで波形を計算しているから、620Hzくらいしか出力できないのか。。。
マイコンでできることのサンプルには使えそう。。。
しかし、もしかして液晶の向きが反対なのでは?手前側から見た時の方が液晶が良く見える。。。
そういえばIC7の3端子レギュレータが熱いです。大丈夫だろと思うけど。。。
  1. 2008年10月09日 20:46 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:0

お手軽なTortoiseSVNの使い方1

TortoiseSVNの使い方を知っていたはずなのに忘れてしまったのでメモ。
まずは、”TortoiseSVNのインストールと設定”のサイトを見ながら、ダウンロード、インストール、日本語設定を行う。
日本語のマニュアルはここを参照
ちなみにインストールしたら再起動となる。

1.まずは、リポジトリを作ろう。リポジトリを作るために、フォルダを新規作成して名前をつける。私はsoc-lm32 とつけた。そのフォルダ上で右クリックし、メニューの中からTortoiseSVN -> ”ここにリポジトリを作成”を選択する。
TortoiseSVN_1_081007.png

2.”リポジトリの作成に成功しました。”とダイアログが出る。
TortoiseSVN_2_081007.png

3.VerilogファイルやISEプロジェクトなどが入っているsoc-lm32フォルダを選択して、右クリック。右クリックメニューから TortoiseSVN -> ”インポート” を選ぶ。
TortoiseSVN_3_081007.png

4.インポートダイアログが出てくるので、先ほど作成したリポジトリの位置を”リボジトリのURL:”に入力し、OKボタンをクリック。
TortoiseSVN_4_081007.png

5.下のようなダイアログが出て、リビジョン1でリポジトリへのインポートが終了した。OKボタンをクリックする。
TortoiseSVN_5_081007.png

6.VerilogファイルやISEプロジェクトなどが入っているsoc-lm32フォルダをどこかに移動して、このフォルダにチェックアウトしてみよう。エクスプローラの何もないところで右クリック。メニューから SVNチェックアウトを選択。
TortoiseSVN_6_081007.png

7.チェックアウト ダイアログが開く。作成したリポジトリの位置を”リボジトリのURL:”に入力するかプルダウンメニューから選択し、チェックアウトディレクトリを確認してOKボタンをクリック。
TortoiseSVN_7_081007.png

8.フォルダがないので作りますか?というダイアログが出るのでOKボタンをクリック。
TortoiseSVN_8_081007.png

9.リビジョン1のチェックアウトが終了。soc-lm32のフォルダができて、緑のチェックマークがついている。OKボタンをクリックしよう。ちなみにフォルダの中のファイルを編集すると赤の!マークになる。
TortoiseSVN_9_081007.png

これでSVNでファイルが管理できることになった。わかっていたはずなのに忘れないようにメモしておく。
  1. 2008年10月07日 20:47 |
  2. SVN, TRAC
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のDDR SDRAMコントローラ

”soc-lm32をシミュレーション”でsoc-lm32のシミュレーションをしてみた。その際にUARTを使用してmコマンドを入れて、memtestを走らせ、DDR SDRAMの動作具合を見たが、その追加。

soc-lm32に付属しているDDR SDRAMコントローラ (wb_ddr.v) は下の信号入出力を持っていて、gpioでクロックのフェーズをシフトできるようになっているようだ。

output ps_ready,
input ps_up,
input ps_down,


私はDDR SDRAMのmemtestをした時にエラーばかりだったが、プログラムでgpioを操作してクロックをフェーズシフトして、うまく受けられるようにすれば良いのかも知れない。
しかし、それにもましてなぞなのはシミュレーションするとWishBoneバスでWriteしているのに、なかなかDDR SDRAMへのWriteが始まらないことだ。
soc-lm32_sim_2_081007.png
上の図で緑のM1カーソルでDDRの初期化が終わっているのに、黒のカーソルのところでWishBoneバスでDDRコントローラにWriteが来ているのに、実際にDDRにWriteが起きるのが赤のカーソルの位置となっている。その差は約144us 。なぜこんなにDDRへのWriteが遅いのだろう?なぞである。
  1. 2008年10月07日 04:48 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32をシミュレーション

現在、soc-lm32をシミュレーションして動作を確認中。
テストベンチが入っていたので、Veritakでシミュレーションをしている。UARTを使用してmコマンドを入れて、memtestを走らせ、DDR SDRAMの動作具合を見ている。
DDR SDRAMのモードレジスタの設定値は
At time 406954.927 ns LMR : Burst Length = 8
At time 406954.927 ns LMR : CAS Latency = 2.5
だそうだ。動作周波数は133MHz。
soc-lm32_sim_1_081005.png
上の図はバンクをプリチャージしてリフレッシュし、もう一度バンクをアクティブ、そしてWriteしたところ。
次にWISHBONEバスがどのように動作するのかをシミュレーションで確認している。自分のDDR SDRAMコントローラをつける際には、WISHBONEインターフェースをつけないといけないので。。。
  1. 2008年10月05日 07:57 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

NOODLYBOX プロジェクト

moleのあなぼこの管理人のmolelordさんに、私のブログでサイトのことを書きましたとメールした。そうしたら、返事が来てNOODLYBOX プロジェクトについて紹介があった。
NOODLYBOXは、”マイコンに繋がれて動作するFPGAの検証を行うための、プロセッサもどき”だそうだ。
私もPowerPCをモデル化できて、MPXバスでFPGAに接続できるのであれば、ぜひ使ってみたい。そこまで自分でやるのは大変だろうな?今のところ、FPGAソフトコアCPUなので。。。
ネットでプロジェクトを配布するために便利なツールについての紹介もしていただいた。
私もtclをやりたいと思っているが、どうもほかのものに目移りしてしまって、落ち着いて勉強することができない。昔はtcl/tkのころ、本を買ってやっていたのだが、もう忘れてしまった。
ISEやmodelsimで便利に使えるようなのでやってみたいのだが。。。今後の課題としたい。
  1. 2008年10月05日 06:17 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

20世紀少年を見てきた

昨日は、先週のリベンジで20世紀少年を見てきた。
映画の中の中学校の放送室で無理やり放送した、Tレックスの20センチュリー・ボーイのレコードが懐かしかった。思えば、中学校?の友達のうちに遊びに行ったときに、あの赤いシングルレコードを聞かせてもらったっけ。。。ステレオセットがうらやましかった。。。なつかし~い。変わった色のレコードだったので覚えている。
内容はさておき、シネプレックスつくばは夫婦の片方が50歳以上ならば、1人1000円になるという割引がある。私が今年で50歳になったので、これではいることができた。しかも、ネットからもこれでチケットを購入できたので、ラッキーだった。映画館に行く前にチケットが購入できていたので、今回は安心してみることができた。
年を取るのはいやだけど、メリットもあるんだ。。。
昼食は、映画館の近くの京都ラーメン屋で思ったが、行ってみたら王将に変わっていた。しょうがないので入って、鳥ねぎラーメンを食べたら、おいしかった。スープもほとんど飲んだが、なんか味が舌に残っているような感じが。。。後味が余りよくない。化学調味料が多いのだろうか?

そういえば、最近目やにが出ていたが、昨日、左目が真っ赤になってしまった。一応、近所の医者に行って薬はもらってきたが、目やにでかすみ気味。あまり、パソコンを見ていないほうがよさそう。直らなければ、眼科に行ってこよう。
  1. 2008年10月05日 06:15 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

soc-lm32をSpartan3E Stater Kitにコンフィギュレーション

”Mico32でもう一度やってみた”でインプリメントできたsoc-lm32を実際にSpartan3E Starter Kitにコンフィギュレーションしてみた。
その前に、Spartan3E Starter KitでuCLinuxを試しているホームページが見つかった。それはmoleのあなぼこさんの下のページだ。
・Spartan3E Starter KitでuCLinux
Spartan3E Starter KitでuCLinux 2
とてもよく解説されていて、助かっています。
ここではVMware PlayerとDebianを使用しているが、私はできればCygwinでやっていこうと思っている。
さて、コンフィギュレーションしてみると、LD0~LD7のLEDに何か表示される。これはsoc-lm32/xilinx-s3eskのページによると、SW1がオフの時にはWISHBONEバスの{clk, reset, uart_txd, uart_rxd, lm32i_stb, lm32i_ack, lm32d_stb, lm32d_ack} を表示しているそうだ。道理でうすく点いているLEDがある。
さて、”Spartan3E Starter KitでuCLinux”によると、SW0をオンするとRS-232Cでやり取りができるとのことなので、シリアルケーブルをSpartan3E Starter Kitに接続して、Teratermを立ち上げ、115200bpsに設定したところ、"**soc-lm32/bootloader** >"のプロンプトが表示された。
すごい、もう動作している。。。非常にうれしい。といっても当たり前なのか?
soc-lm32_3_081003.png
これで、コマンドを入れてみたが、”Spartan3E Starter KitでuCLinux”に書いてあるようにmコマンド(Memory Test)や、vコマンド(View Memory)に何も反応しない。dとgを押すと、行ったきりになって反応しなくなる。なんかおかしい。
そういえば、このソフトウェアどうやって入れているんだろうか?wb_bram.vのコードもRAMBプリミティブをインスタンシエーションしているわけでなく、Verilog記述から推定するようになっているし、どこで入れているんだろうか?
そういえば気になる記述が1つあったな?initial文を使っている。これってシミュレーションのみでなかったか?下にその部分のソースを転載します。

initial 
begin
    if (mem_file_name != "none")
    begin
        $readmemh(mem_file_name, ram);
    end
end


もしかしてこの$readmemh でソフトウェアを読み込んでいるのでは?そう思って、一番上の system.v をみると、こう書いてあった。
parameter bootram_file = "../../firmware/boot0-serial/image.ram",

このbootram_file が bramのmem_file_name として入力されている。どうやらこうやってBRAMにソフトウェアを書き込んでいるようだ。ためしにISE10.1iSP3のXSTガイドのマニュアルを見てみると、246ページに”ブロックRAMの初期化 (外部デー タ フ ァ イル)の Verilog コード例”として書かれていた。ひとつ利口になった気がします。
やはり、moleさんとは入っているソフトウェアが違っていたみたい。bootloaderにしないと同じにならないようだ。そこでsystem.v のparameterをした記述に変更してみた。
parameter bootram_file = "../../firmware/bootloader/image.ram",

そうするとmを押すとメモリテストができるようになった。
soc-lm32_4_081003.png
やはり、MEMTEST ERRORがいっぱい出ている。
”Spartan3E Starter KitでuCLinux”に書いてあるようにrtl/wb_ddr/ddr_wpath.vの146行目の(moleさんのところには143行目と書いてあったが、私がダウンロードしたファイルでは146行目だった)

read_shr <= { 8'b00011000 };



read_shr <= { 8'b00110000 };


に修正したが、やはりMEMTEST ERRORが出てしまった。おかしい?
これはシフトレジスタを使ってDDR のリードのタイミングをとっているのだと思う。タイミングを変更するのに良い。私も自分のDDRコントローラにアイデアをいただくこととする。
その後、8'b01100000 ~ 8'b00001100 まで変えてやってみたが、やはりMEMTEST ERRORが出てしまう。
今日は、この辺で終了とする。

なかなか面白くなってきた。もう少しいじってみてDDRコントローラがだめそうだったら、自分のDDRコントローラをつけてみようと思う。
  1. 2008年10月03日 06:02 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

Mico32でもう一度やってみた

この前、Plasmaでマイコンを作ると決めたが、その後、たっくさんから良い情報を教えてもらい、もう一度Mico32をやってみることにした。
それはsoc-lm32のページで、ファイルをダウンロードしてみると、すでにSpartan3EスタータキットでのトップファイルとUCFファイルがあった。
とりあえず、ISE10.1iでプロジェクトを作って、論理合成、インプリメントしてみたところ、正常にインプリメントできた。
soc-lm32_1_081001.png
結構、BRAMも余っているので、DキャッシュもONにしようとしたのだが、どうもモジュールがないといわれてしまう。実際はプロジェクトの中に入っているのだが、includeされているファイルでdefineしてもifdefの中のモジュールが入らないようだ。階層ビルダがうまくないのか?
コマンドラインからやればいけるかもしれないが、とりあえずコンパイルできたので、これでやってみることにする。
次にツールをコンパイルしようと、Cygwinを入れて、soc-lm32のページにあるlm32-src-patched.tar.bz2を解凍して、makeしてみたのだが、Errorで止まってしまった。
soc-lm32_2_081001.png
DWMなどのMico32の記事などを見て、ツールのコンパイルについて勉強しようと思う。

#しかし、Cygwinでコンパイルしているせいなのか?パソコンのメモリ占有が4GBを超えてしまった。Cygwinやめぼしいソフトを落としても3GB超えているし、どこかでメモリリークしているか?
  1. 2008年10月01日 05:58 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:4