
組み込み入門第7弾では、システムバスについて説明していきます。CPUやメモリの解説でも少し登場していましたが、詳細は伏せていましたが、詳しく見ていきましょう。
どんな構成で、どんな論理で動いているのかという疑問を解決できればと思います。
システムバスとは

システムバスとは「CPU/メモリ/周辺装置の間の伝送経路」です。では、これらの機器の間はどのように接続され、制御されているのでしょうか?

バスの線がどうなっているか詳しく見ていきましょう。
細かく見てみると、バスと呼ぶ中には4種類の信号線が含まれています。それぞれ
- クロック:各要素のタイミングを合わせるパルス列を伝達する
- 制御信号:読み込み/書き込みなどの制御モードやそのタイミングを伝達する
- アドレスバス:読み込み/書き込み時の対象とする物理アドレスを伝達する
- データバス:読み込むデータ/書き込むデータを伝達する
基本構成

では、複数の機器がつながるシステムでどのように制御を行っているのでしょうか?
基本は、マスタースレーブ方式が採用されます。
バスマスタであるCPUがメモリや入出力装置に命令を出し、バススレーブであるメモリや周辺装置は命令が来たときのみ処理をして返します。コール&レスポンスなどとも言いますね。
例を図示してみました。CPUがメモリに林檎の画像頂戴というと(実際には、アドレスを指定し、読み込み信号を立てます)メモリはデータを読み出しCPUに返します(実際には、データ線に指定アドレスのデータを載せます)。
その後、CPUは、入出力装置に林檎を表示してと伝達し、入出力装置が完了を返します。(実際には、CPUは書き込み信号を立て、入出力装置がREADY状態になった後、データ線にデータを載せます)

では、バスマスタが複数ある場合はどうなるでしょうか?例えば、CPUが複数存在するようなケースを考えてみましょう。2つのCPUが同時にメモリにアクセスしたらなんだか不味そうですよね。このような場合、バスアービタと呼ばれる機器が制御権の調停を行います。はい、CPU1は使っていいけど、CPU2は待ってね。といったイメージです。

バスアービタの機能をCPUが持ち、CPU間で通信し、バス使用権の調停を行う方法もあります。
CPU1がCPU2に今、使うね!いいよ!と返すようなイメージです。
プログラムとデータの配置

メモリの取り扱いに伴いバスの構成が変わります。
- プリンストンアーキテクチャ
- ハーバードアーキテクチャ
です。
プリンストンアーキテクチャでは、プログラムとデータが同一メモリバス上に配置されます。すなわち、プログラムとデータが同じバスで伝送されます。汎用PCにも使われる一般的な構成です。
ハーバードアーキテクチャでは、プログラムとデータが別のメモリバス上に配置されます。伝送されまるバスが異なるため、高速な処理が可能となります。一方で、回路が複雑になることから高価になりやすいです。DSP(Digital Signal Processor)など速度が重視される専門機器に利用されます。
制御方法

データアクセス時の細かな制御も見ていきましょう。
前提として、CPU、メモリ、入出力装置では、処理速度が全く異なります。
そのため、速い側が遅い側に速度を合わせてアクセスする必要があります。
例えば、CPUがメモリに対し、読み込み(書き込み)信号を送ってから直ちにデータを操作しても正しいデータは得られません(書き込ません)。そのためメモリ側が準備ができるまで待ってから操作する必要があります。
この問題を解決する機能として「ウェイト機能」と「レディ機能」があります。
また、ウェイト機能は2パターンの実装があり、
- Type1:読み込み/書き込み信号を立ててから、一定クロック待ちデータ操作を行う方法(このとき待ちクロック数はレジスタに設定してある)
- Type2:WAIT信号をCPUに入力し、その間はデータ操作しないようにする
一方で、レディ機能はウェイト機能Type2の逆論理で、
- READY信号をCPUに入力し、その間のみデータ操作をする
Direct Memory Access技術

最期に、DMA(Direct Memory Access)機能を紹介します。これは、CPUが処理することなくメモリと周辺機器がデータの送受信を行う機能です。平たく言えば、データ操作のみするCPUのようなものです。これをDMAコントローラと呼びます。
先程例に上げた、林檎の画像をやり取りする例をDMAコントローラが行ってくれるイメージですね。そのおかげで、CPUは算術/論理演算などに専念できます。また、DMAコントローラはバスマスタに該当するため、CPUが複数存在する例と同様にバスアービタによる調停が必要です。
まとめ
今回は、バスについてまとめてきました。過去に投稿したCPUやメモリの解説と合わせると、コンピュータシステムの動作のディテールが大分つかめてきたのではないでしょうか。
次回は、入出力デバイスのインターフェイス周りの解説をしていこうと思います。