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

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

FPGAの部屋

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

PCIモジュール1

私の作ったPCIモジュールについて説明しようと思う。読みたくないかもしれないけど、そういう人は飛ばしてほしい。
まずは最初に電源ONからのコンフィギュレーションの方法。
昔のISAバスではIOアドレスはDIPスイッチなどで設定していた。これはとても不便だった。複数枚ボードが入っていると、ボードを抜いて、どんなアドレスを設定している確認しなければならなかった。
PCIバスはそんな不便さを解消するために規格化されたのだろう。
PCIバスはコンフィギュレーションレジスタを持っている。電源ON後のイニシャライズでコンフィギュレーションレジスタを設定するようになっている。一番最初には、自分が指定されているかが、アドレスを持っていないのでわからない。そのため、IDSELという信号が各PCIバスコネクタにポイント2ポイントでつながっている。つまり/FRAMEが最初にLOWになった時に、IDSELがHIGHになっていれば、コンフィギュレーションアクセスとして、自分が選択されていることになる。下にコンフィギュレーションレジスタのマップを示す。
自分のボードでアドレスマップしてもらいたいデバイスの領域をベースアドレスレジスタのRead/Writeビットで示す。
PCI_config_registers_051210.png

上の図だったらSDRAMをベースアドレスレジスタの0でマップしている。SDRAMは64MBあるので、これは2の26乗の値だ。よって26ビットのアドレスで表せる。この場合ベースアドレスレジスタは31ビット目から26ビット目までRead/Write出来るようにフリップフロップ(FF)を実装する。25ビット目から0ビット目までは0固定にする。
ホストパソコンの起動時にBIOSがPCIデバイスのコンフィギュレーションをする。その際に、私のPCIボードをコンフィギュレーションして、ベースアドレスレジスタ0(10h)にオール1を書き込む。次にベースアドレスレジスタ0(10h)を読み出すと、"1111 1100 0000 0000 0000 0000 0000 0000"(2進数)が読み出せる。これでBIOSはアドレス設定が出来るのが、31ビット目から26ビット目までということを認識する。このPCIボードの最初のデバイスが64MBの領域をアドレスマップしようとしていることを認識し、アドレスを決定する。そして、BIOSはマップしたアドレスを31ビット目から26ビット目までに書き込む。
PCIボードの最初のデバイス(SDRAM)は、これ以降PCIアクセスのこのアドレス領域にリスポンスする責任が生じる。このアドレス領域のアクセスにリスポンスしないとパソコンがデッドロックする。(パソコンが何も反応しなくなる。死んじゃうということ)
例えば、BIOSがベースアドレスレジスタ0に"1111 1000 0000 0000 0000 0000 0000 0000"(2進数)とアドレスマップしたとすると、パソコンの0xF8000000から0xFBFFFFFFまでは私のPCIボードのSDRAMにマップされている。C言語などでプログラムを作り、0xF8000000に値を書き込むとPCIバスを通して、私のPCIボードのSDRAMに書き込まれる。(Windows XPなどのOSでは普通のユーザープログラムで0xF8000000に値を書き込むと書いてもだめ。論理アドレスなので、物理アドレスをマップして、論理アドレスに変換するか物理アドレスに直接書けるライブラリを使うかしないとだめである。)
次にBIOSは次のベースアドレスレジスタの処理を行う。オール1を書いてもオール0が読めたベースアドレスレジスタで終わりとなるのだろう。(この辺は良くわからない)
かくして、PCIボードの全てのデバイスはメモリかI/Oにマップされる。マップされたら、先ほど言ったようにそのアドレス領域にリスポンスする責任が生じる。さもなとパソコンが死ぬ。死ぬといっても、誰も応答してくれないのでリトライを繰り返すのだが。。。
というようにパソコンはPCIボードを初期化するのである。
ちなみにデバイスドライバはデバイスID、クラスID、サブシステムID、サブシステムベンダIDなどを読んで、自分のボードがどこかを認識できるのだと思う。この辺はデバイスドライバを書いたことが無いので良くわからない。この辺のレジスタは自分のデバイスIDなどをROMとして書き込んであるのだ。
---------------
どうだろうか。このくらいでPCIバスの初期化はわかるのだろうか?
A**Sの方どうでしょう?
  1. 2005年12月10日 07:01 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0