[Suzaku:01166] Re: SUZAKU-VでPLBペリフェラルの作り方(レジスタの使い方)

kawaoka email@hidden
2008年 5月 13日 (火) 09:55:52 JST


川岡です。

もしかすると、BBootではcharでアクセスしていて、Linuxではlongでアクセスしているのではと思われます。
そしてsz410-92-add_slotは8bitレジスタで、新しく作られたコアは32bitのレジスタなのかと思われます。

とっても、ややこしい話なのですが。。。
・ビックエンディアン
・ipifのレジスタビット幅
のからこのようなことが起きると思っています。

まずは、ビックエンディアンについてです。
32bitレジスタの場合、アドレスとバイトレーンの関係は下記のようになります。
            | reg(0 to 7) | reg(8 to 15)| reg(16 to 23)| reg(24 to 31)
------------+-------------+-------------+--------------+--------------
charの場合  |  BASE_ADDR+0| BASE_ADDR+1 |  BASE_ADDR+2 | BASE_ADDR+3
------------+---------------------------+-----------------------------
shortの場合 |  BASE_ADDR+0              |  BASE_ADDR+2
------------+---------------------------------------------------------
longの場合  |  BASE_ADDR+0
よって、charとlongでアクセスした場合のレジスタの操作できるbit位置が変わります。
たとえば
  (*(volatile char *)(BASE_ADDR) = (0x1))
とするとreg(7)のbitが「1」になり
  (*(volatile long *)(BASE_ADDR) = (0x1))
とするとreg(31)のbitが「1」になります。

次にipifレジスタビット幅についてです。
8bitレジスタとしてコアを自動生成すると、
そもそも8bitしかないので、charでもshortでもlongでも常にBASE_ADDR+0でreg(0 to 7)がアクセスできるように
ipifがバスを切り替えてくれているではと思われます。
よって、
  (*(volatile char *)(BASE_ADDR) = (0x1))
  (*(volatile long *)(BASE_ADDR) = (0x1))
もreg(7)が操作されるではと思っています。


Hiroki Takahashi さんは書きました:
> 高橋です。
> 
> 川岡様、勝村様ご指摘ありがとうございます。
> 遅くなりましたが一応解決(?)いたいしましたのでご報告いたします。
> 
> もう一度何がやりたかったかを申しますと、自作のコアをSUZAKUのデフォルトに追加し、PLBバスを通じてコア
> に4ビットの信号を送ることでLEDを光らせるということでした。
> 
> LEDが光らなかった原因はやはりレジスタの読み込み部分にあり、user_logic.vhdで4ビットとしてslv_reg0(4
> to7)を読み込んでいたのをslv_reg0(28 to 31)と変更することでLEDにアクセスできるようになりました。
> ただし、この場合もEDKで作ったアプリケーションから直接書き込もうとすると反応せず、一旦BBootからLinux
> を起動して、デバイスノードを通じて書き込むと光るという状況です。
> 
> どちらにしても、ベースアドレスに書き込んだ時にPLBバスのどのビットから埋まっていくのかを正しく理解し
> ていないのが問題なのだと思います。
> 
> そもそも、最初にslv_reg0(4 to 7)から読み込もうとしていたのは、スターターキットにもあるスロットマシン
> (sz410-92-add_slot-20080327)のソースを参考にしたためなのですが、再度見返してみてもやはりベースアドレ
> スへの書き込みはslv_reg0(4 to 7)から取ってきているようように見えます。
> というのも、slv_reg0(4 to 7)は7セグメントLED1用の信号seg_in1につながっており、
> 7セグメントLEDへの書き込みはslot.cで、
> 
> #define WRITE_SEG7(no,v) (*(volatile u8 *)(SLOT_BASE_ADDR + (no)) = (v))
> 
> とマクロ定義されているように読めるからなのですが。。
> 
> もともと、LinuxからFPGAを制御することを考えていたので、とりあえず書き込みはできるようになって、いま
> の状況でも結果オーライなのですが、仕組みの理解という面では腑に落ちない部分が残ります。。
> 
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/mailman/listinfo/suzaku
> 



suzaku メーリングリストの案内