PCIバスってすごい

PCIバスの後に出来たバスでPCI ExpressやUSBは、もちろん優れたバスですが、PCIバスが出来た当時の事を想像すると、PCIバスと言うのは、その前にあったISAバスで発見された問題を解消してくれていました。

 

例えばNiosIIのバスを見てみると、まず、アドレスバスがあり、書き込みのデータ信号と書き込みの指示信号、読み出しのデータ信号と読み出しの指示信号があります。

ちょっと雑に言うと、アドレスバスが32ビット、データバスが32ビットの場合、96ビット+αが必要になります。

 

NiosIIの中は豊富なLEで構築されていますので、それで良いですが、物理配置が必要なバスは、ビット幅が増えれば増えるだけ、面積が広くなっていきます。

かと言って、ビット幅を減らすとその分帯域が遅くなります。

 

そこで考えられるのが、まずデータバスの共有化です 

つまり、書き込みのデータバスと、読み出しのデータバスはInputにもOutputにも出来る様に共通バスになり64bitだったバスが32bitに省略できます。

これはISAバスでも同じ様です

 

さて、問題はアドレスバスです。

ISAバスではデータバスが16bitに対して、アドレスバスは24bitの様でした。

ISAは作った事が無いので、エッジのピン配置からの予想ですが、何故アドレスバスの方が太いのかは分かります

データはバス幅が2倍になった場合、取り扱えるデータ量は2倍になりますが、アドレスは、1ビット増えた場合、データ量が2倍になります。

つまりメモリ空間をより広く使おうとした場合、アドレスビットが多い方が重要になります。

 

PCIバスでは、アドレスバスもデータバスと共通になっていました。これで96bitだったバスは32ビットに縮小出来ました。

でも、アドレスバスとデータバスが同じバスを使うなら、データを送る時にアドレスはどの様に指定するのでしょうか?

それは、まず最初にアドレスを指定し、続けてデータを送る事で、データの格納場所を一意に決められるようになっています。

「そんな事をしたら、帯域が半分になっちゃうじゃない?」と言う疑問も一瞬は頭をかすめましたが、そこも考慮されていて、一度アドレスを指定してDMA(DirectMemoryAccess)を行えば、続けて送られるデータ群は、自然とインクリメントしたアドレスに対して指定されるようになっています。

例えばアドレスを指定するクロックが1回だとして、データを指定するクロックが1024回続けば、アドレス指定が帯域を遅くする割合は0.1%なので、ほとんど影響しない事になります。ハラショー!

 

最後に、バスの共有です

PCIバスは、データ(アドレス)バスを他のスロットと共有します。

これにより、複数のPCIスロットが同じバスを共有します

4スロットあれば、32bit x 4 =128bitが32bitに収まります

各スロットは、自分のスロットに届いたイネーブル信号が無ければ

データバスの内容を無視します。

 

f:id:info-akiron-com:20201010142053g:plain

PCI slot

PCI以前のバスは、詳しく知らないのですが

いかに基板の面積の膨張を抑えるか、考え抜いたこの仕様を眺めながら

人類ってすげーって思っていました。