FPGAの部屋FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。PCIモジュール1私の作ったPCIモジュールについて説明しようと思う。読みたくないかもしれないけど、そういう人は飛ばしてほしい。最初に電源ONからのコンフィギュレーションの方法。昔のISAバスではIOアドレスはDIPスイッチなどで設定していた。これはとても不便だった。複数枚ボードが入っていると、ボードを抜いて、どんなアドレスを設定している確認しなければならなかった。PCIバスはそんな不便さを解消するために規格化されたのだろう。PCIバスはコンフィギュレーションレジスタを持っている。電源ON後のイニシャライズでコンフィギュレーションレジスタを設定するようになっている。最初には、自分が指定されているかが、アドレスを持っていないのでわからない。そのため、IDSELという信号が各PCIバスコネクタにポイント2ポイントでつながっている。/FRAMEが最初にLOWになった時に、IDSELがHIGHになっていれば、コンフィギュレーションアクセスとして、自分が選択されていることになる。下にコンフィギュレーションレジスタのマップを示す。自分のボードでアドレスマップしてもらいたいデバイスの領域をベースアドレスレジスタのRead/Writeビットで示す。上の図だったらSDRAMをベースアドレスレジスタの0でマップしている。SDRAMは64MBあるので、これは2の26乗の値だ。よって26ビットのアドレスで表せる。この場合ベースアドレスレジスタは31ビット目から26ビット目までRead/Write出来るようにフリップフロップ(FF)を実装する。25ビット目から0ビット目までは0固定にする。ホストパソコンの起動時にBIOSがPCIデバイスのコンフィギュレーションをする。その際に、私のPCIボードをコンフィギュレーションして、ベースアドレスレジスタ0(10h)にオール1を書き込む。0000"(2進数)が読み出せる。これでBIOSはアドレス設定が出来るのが、31ビット目から26ビット目までということを認識する。このPCIボードの最初のデバイスが64MBの領域をアドレスマップしようとしていることを認識し、アドレスを決定する。BIOSはマップしたアドレスを31ビット目から26ビット目までに書き込む。PCIボードの最初のデバイス(SDRAM)は、これ以降PCIアクセスのこのアドレス領域にリスポンスする責任が生じる。このアドレス領域のアクセスにリスポンスしないとパソコンがデッドロックする。(パソコンが何も反応しなくなる。0000"(2進数)とアドレスマップしたとすると、パソコンの0xF8000000から0xFBFFFFFFまでは私のPCIボードのSDRAMにマップされている。C言語などでプログラムを作り、0xF8000000に値を書き込むとPCIバスを通して、私のPCIボードのSDRAMに書き込まれる。XPなどのOSでは普通のユーザープログラムで0xF8000000に値を書き込むと書いてもだめ。論理アドレスなので、物理アドレスをマップして、論理アドレスに変換するか物理アドレスに直接書けるライブラリを使うかしないとだめである。)次にBIOSは次のベースアドレスレジスタの処理を行う。オール1を書いてもオール0が読めたベースアドレスレジスタで終わりとなるのだろう。(この辺は良くわからない)かくして、PCIボードの全てのデバイスはメモリかI/Oにマップされる。マップされたら、先ほど言ったようにそのアドレス領域にリスポンスする責任が生じる。死ぬといっても、誰も応答してくれないのでリトライを繰り返すのだが。いうようにパソコンはPCIボードを初期化するのである。ちなみにデバイスドライバはデバイスID、クラスID、サブシステムID、サブシステムベンダIDなどを読んで、自分のボードがどこかを認識できるのだと思う。この辺はデバイスドライバを書いたことが無いので良くわからない。この辺のレジスタは自分のデバイスIDなどをROMとして書き込んであるのだ。---------------どうだろうか。URLhttps://marsee101.blog.fc2.com/tb.php/84-2bc8bbe8この記事にトラックバックする(FC2ブログユーザー)プロフィールAuthor:marseeFPGAの部屋へようこそ!FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。WEBブログデザイナ。