コンピュータアーキテクチャII講義ノート 入出力装置とインタフェース 1

2016.4.1
コンピュータアーキテクチャII 講義ノート
入出力装置とインタフェース
1
はじめに
制御装置を含む演算装置と主記憶およびキャッシュメモリをコンピュータの本体とすれば,ここ
で述べる装置は,コンピュータ本体にデータを供給したり,計算結果を表示したり,計算結果を保
存する装置である.このような装置を入出力装置あるいは周辺装置という.特に,入力機能のみ持
つものを入力装置,出力機能のみ持つものを出力装置という.キーボードは典型的な入力装置であ
り,ディスプレイは典型的な出力装置である.また,ハードディスクに代表される外部記憶装置は
典型的な入出力装置である.ネットワークも重要な入出力装置である.
入出力装置は,それ自身が独立した装置である.すなわち,コンピュータ本体と入出力装置はそ
れぞれのクロックに同期して動作しているが,両者の間では,一般に同期がとられていない.した
がって,データの受け渡しをする場合は,同期の取れていない装置間で不都合が起きないような受
け渡し法を確立しておく必要がある.これを行うのが入出力インタフェース(入出力コントロー
ラ)である.
以下では,入出力装置を概観し,入出力インタフェースについて述べる.
2
入出力装置の接続
これまでに多種多様な入出力装置が開発されてきた.その時代の技術により今では廃れたものも
数多くある.今,手元にあるコンピュータを眺めてみれば,次のようなものが目に付くであろう.
入力装置:キーボード,マウス,スキャナ,タッチパネル,
(マイクロフォン),など
出力装置:ディスプレイ,プリンタ,スピーカ,など
入出力装置:ハードディスク,CD 装置1 ,DVD 装置2 ,LAN3 ,無線 LAN,など
ここでは,これらの装置の構造には触れず,これらの装置とコンピュータの接続に焦点を当て
る.その典型的な接続は,図 1 のようになっている.この図は,コンピュータ装置内部の(マザー
ボードと呼ばれる)基板上のバスを示している.マザーボードと外部装置を接続するバス(図 1 の
SATA や USB)については次の講義ノートで述べる.
バスはプロセッサやメインメモリ,入出力装置の間でデータの授受を行うために使用する線路で
ある.図 1 に示すように,プロセッサとメインメモリの間のデータ授受やプロセッサと入出力装
置,メインメモリと入出力装置との間のデータ授受で使われる.バスは,排他的に使わなければな
らない.その意味は,一時には一組の装置間でのデータ授受しかできないということである.図 1
の入出力コントローラは,小さなプロセッサだと考えてほしい.バスは,構成が簡単であるという
特徴から多くのシステムで利用されている.
1 Compact Disk の頭字. CD-ROM (ROM は Read Only Memory の意), CD-R (R は Recordable の意), CD-RW
(RW は ReWritable の意) などの装置がある.
2 Digital Versatile Disk の頭字.CD 装置と同様,ROM, R, RW などの種類がある.
3 Local Area Network の頭字
1
プロセッサ
+
キャッシュ
メインメモリ
バス
入出力
コントローラ
(SATA)
入出力
コントローラ
(USB)
・・・
・・・
入出力
コントローラ
(Display)
入出力
コントローラ
(network)
ネットワーク
キーボード
ディスク装置
調停
回路
マウス
ディスプレイ
図 1: プロセッサと入出力装置の接続
2.1
バスの動作
バスは,データ線と制御線から構成される.一般に,バスに繋がる装置間のデータ授受(図 1 に
おけるプロセッサとメインメモリ間,プロセッサと入出力コントローラ間など)では,一方の装置
が制御主体となる.その装置をバスマスタと呼ぶ.他方の装置はバススレーブである.プロセッサ
は,典型的なバスマスタであり,メインメモリは典型的なバススレーブである.入出力コントロー
ラは,バスマスタにもバススレーブにもなるように構成されることが多い.このことは,制御主体
となる装置が複数あることを意味する.一方で,バスは排他制御されなければならない.したがっ
て,バスを使用したい装置は,バスの使用権を獲得し,その後にデータの転送を行う.そのために,
調停回路(アービター,arbiter)が設けられる.具体的には,制御線の中にバスリクエスト (Bus
request) 線と呼ばれる制御線が複数本用意される.バスマスタになりうる装置は,いずれか 1 つの
バスリクエスト線を使用する.また,各バスリクエスト線と対になるバスグラント (Bus grant) 線
が用意される.バスグラント線は使用許可を示す制御線である.バスを使用したい装置は,バスリ
クエスト線をアサート4 する.調停回路は,優先順位など決められた手順によって,使用を許可す
るバスグラント線をアサートする.使用許可を受けた装置は,データ転送を行う.
データ転送の手順を述べる前に,各装置をどのように識別すればよいかについて考えよう.た
とえば,入出力コントローラには,いくつかのレジスタがあり,そのレジスタを使って,装置間の
データ転送を行う.したがって,そのレジスタを識別する方法が求められる.その方法に二通り
ある.一つは,レジスタをメモリ(アドレス)空間に割り付ける方法,もう一つは,メモリ空間
とは別の IO 空間を用意し,そこに割り付ける方法である.前者はメモリマップド IO と呼ばれる.
MIPS はメモリマップド IO を採用し,インテル系のプロセッサは IO 空間方式を採用している.メ
モリマップド方式の場合,通常,メモリ空間は十分大きいので,すべてのメモリ空間を物理メモリ
で埋め尽くすことはない.空いているところを利用する.システム設計時に予め決めておくのが普
通である.この場合は,メモリアクセスと同じようにレジスタのアクセスができる.IO 空間方式
4 アサートは制御線をアクティブ(オン)の状態にすることである.
2
の場合は,IO 命令を用意し,それを実行することでレジスタをアクセスする.
簡単のため,バスはデータ線とアドレス線を持つものとする.バスにはデータ転送を行うための制
御線が用意されている.メモリリードとメモリライトの各制御線および ACK 制御線 (Acknowledge)
である.バスマスタ側から見て,相手にデータを送る場合は書込み,相手からデータをもらう場合
は読出しである.
読出し手順は以下のようになる(図 2(a) 参照).
1. バスマスタは,アドレスをバス上に出力する.また,メモリリード制御線をアサートする.
2. バスに繋がる各装置は,アドレスを見て,それが自分に割り当てられたアドレスかどうかを
判定する5 .自分に割り当てられていた場合,データをバス上に出力する.具体的には,メモ
リ装置なら,メモリを読み出して,それをバスに出力する.入出力コントローラなら,指定
されたレジスタのデータをバスに出力する.そして,ACK 制御線をアサートする.バスマ
スタに有効なデータがバス上にあることを知らせるためである.
3. バスマスタは,ACK 制御線がアサートされたことを確認して,バス上のデータを取り込む.
そして,メモリリード制御線をネゲート6 し,アドレス線を開放する.また,バスリクエスト
線をネゲートする.
(その結果バスグラント線がネゲートされ,次のバス要求を受けることが
可能となる.
)バススレーブ側は,メモリリード制御線がネゲートされたことを見て,ACK
制御線をネゲートし,データ線を開放する.たとえば,lw 命令の実行の場合なら,バスマス
タはプロセッサであり,メモリから読み出したデータを命令が指定するレジスタに格納する.
(ここでは,キャッシュはないものとする.
)
また,書込み手順は以下のようになる(図 2(b) 参照).
1. バスマスタは,アドレスとデータをバス上に出力する.また,メモリライト制御線をアサー
トする.
2. バスに繋がる各装置は,アドレスを見て,それが自分に割り当てられたアドレスかどうかを
判定する.自分に割り当てられていた場合,データを取り込む.具体的には,メモリ装置な
ら,メモリに書込む.入出力コントローラなら,指定されたレジスタに書込む.そして,ACK
制御線をアサートする.バスマスタに書込みの終了を知らせるためである.
3. バスマスタは,ACK 制御信号線がアサートされたことを確認して,メモリライト制御線をネ
ゲートする.また,データ線,アドレス線を開放する.さらに,バスリクエスト線をネゲー
トする.バススレーブ側は,メモリライト制御線がネゲートされたことを見て,ACK 制御
線をネゲートする.
このように構成されるバスをパラレルバスという.また,応答信号(上例では ACK 制御信号)
を確認してデータ転送を行う方式をハンドシェイク方式という.
メモリ空間と IO 空間が分かれている場合は,メモリリード,メモリライトの制御線に加えて,
IO リードと IO ライトの制御線を用意しておく.メモリ空間のアクセスに関しては,上記と同様の
制御を行い,IO 空間のアクセスに関してはメモリリードとライトの代わりに IO リードと IO ライ
トの各制御線を使って,上記と同様の制御を行う.
5 比較回路を利用すれば簡単にできる.
6 ネゲートは制御線をインアクティブ(オフ)の状態にすることである.
3
アドレス
アドレス
メモリライト
メモリリード
データ
データ
ACK
ACK
(a) メモリ読み出し手順
(b) メモリ書込み手順
図 2: バスアクセス手順:制御線はロウアクティブ (low active) としている.アドレス,データは
複数の信号線から構成されるので上下に幅を持たせて記述している.×の部分で値が変化し,他の
ところは安定していることを示す.
ACK 制御線を用いることにより,装置の応答速度の違いを吸収できることに注意されたい.ま
た,この手順自体は,非同期的な記述になっているが,実際の回路では,クロックに同期して動作
するように構成される場合がほとんどである.
バスマスタの数がバスリクエスト線の数より多い場合は,1 つのバスリクエスト線を複数のバス
マスタで共有する.この場合は,デイジーチェインという方法で接続する.これは,図 3 に示すよ
うに,バスリクエスト線は共有し,バスグラント線は調停回路から直列に接続する方式である.調
停回路からのバスグラント信号は,基本的には下流の装置に送るように構成されるが,自身がバス
リクエストを出している場合は,下流の装置に送らないように構成しておく.この結果,バスリク
エストを出している装置で,もっとも上流にある装置がバスの使用権を獲得することになる.した
がって,バスリクエスト線を共有する装置は上流から下流に向かってバス使用に関する優先順位が
つくことになる.
バスリクエスト
バスグラント
調停
回路
・・・
装置
n
装置
2
装置
n-1
装置
1
図 3: デイジーチェイン
2.2
入出力の手順:ポーリングと割り込み
図 1 の構成で,入出力コントローラに外部装置からデータが届いたとき,それをプロセッサはど
のように知ることができるであろうか.2通りの方法が考えられる.一つは,ポーリング (polling),
他は割り込みである.
まず,ポーリングについて説明する.ポール (poll) という言葉は,世論調査を意味しており,コ
ンピュータ用語としては,プロセッサ側から,入出力コントローラにデータがあるかどうかを問い
合わせる方法である.具体的には,以下のような手順を踏む.通常,入出力コントローラには,3
種類のレジスタが用意されている.コントロールレジスタ,ステータスレジスタ,データレジスタ
である.コントロールレジスタは,入出力装置の動作を指定するために使用する.ステータスレジ
スタは,装置の状態を示している.データレジスタは,入力データや出力するデータを格納してい
4
割り込み機構
プロセッサ
入出力装置
入出力要求
外部バス
図 4: 割り込み
る.データの入力を考えよう.ステータスレジスタには,入力データが(入力)レジスタにあるか
どうかを示す入力フラグ(1ビットの情報)がある.ポーリングでは,プロセッサは,ステータス
レジスタを読み,入力フラグがオンか否かを調べる.
(そのようにプログラムを組む.
)そして,オ
ンであれば入力レジスタを読みデータを取り込む.そして,入力フラグをオフにする.オフの場
合は,プログラムの組み方によるが,もっとも簡単な方法として,ステータスレジスタを繰り返
し読む方法がある.これをスピンループという.これは効率が悪いから,通常は,実行中のプログ
ラム(タスク)を中断し,他のプログラム(タスク)を実行する方法がとられる7 .プロセッサ側
から入出力コントローラ側にデータを送る場合は,以下のようにする.ステータスレジスタには,
出力用のデータレジスタに有効なデータが入っているか否かを示す出力フラグが用意されている.
プロセッサ側からステータスレジスタを読み,出力フラグがオフであれば,出力レジスタにデータ
を書き込む.オンであればオフになるまで待つ.待ち方は,入力の場合と同じである.入出力コン
トローラは,外部装置にデータを出力し,出力フラグをオフにする.
割り込みによる方法は,
「マルチサイクル」の講義ノートの 3 節で述べた機構を利用する方法で
ある.バスの信号線の中には,割り込み信号線が用意されている.図 4 の入出力要求はこの割り
込み信号線を利用する.まず,データの入力について考えよう.入出力コントローラにデータが入
力されると,入力要求がでるように構成する.具体的には,上述の入力フラグのビットを割り込み
信号線に接続しておく.そして,プロセッサ側では,割り込み信号線はプロセッサの割り込み機構
に接続しておく.割り込みが発生すると,割り込み処理プログラムが起動される.割り込み処理プ
ログラムは,どこからの割り込みかを調べ,対応する装置からデータを読み込むように記述してお
割り込みレベル
外部装置からの割り込み要求
高
低
割り込みマスク
0
1
1 0
1
0
1
1 1
0
1
0
・・・
0
0
0 0
・・・
・・・
・・・
割り込み
図 5: 割り込みマスク:割り込みマスクが 1 のところは,割り込みがかかる.
7 詳細についてはオペレーティングシステムの教科書を参照されたい.
5
く.もちろん,入力フラグをオフにするなど,適切な処理を記述しておく必要がある.割り込みを
使えば,即時にデータを取り込むことができる.出力の場合は,出力フラグがオフの時に割り込み
が発生するように構成しておく.出力処理の方法は多数あるが,以下に一例を示す.出力データを
プールするバッファをメモリ上に用意しておく.また,バッファが空の時に割り込みがかからない
ように,該当する出力フラグが接続される割り込み入力と対をなす割り込みマスクを 0 にしてお
く(図 5 参照).図 5 は 8 個の割り込み入力があるが,そのうちの一つがこの出力フラグに接続さ
れているものとする.データを出力したいプログラムは,このバッファにデータを書き込む.そし
て,該当する割り込みマスクを 1 にする.その結果,出力フラグがオフであれば,割り込みが発生
する.割り込み処理プログラムでは,バッファの先頭のデータを当該入出力コントローラの出力レ
ジスタに書き込む.
(その結果,出力フラグがオンとなる.
)さらに,バッファが空であれば割り込
みマスクを 0 にする.入出力コントローラが,外部装置にデータを出力し終わると,出力フラグが
オフとなり,再び割り込みがかかる状態になる.このとき,割り込みマスクが 0 ならば割り込みは
一時停止され,1 なら割り込みがかかる.このようにして,出力データが効率よく出力される.
2.3
高速化への対応
近年のプロセッサの高速化技術の進展は著しく,バスの動作速度もそれに見合ったものが要求さ
れる.電気の伝搬速度は有限(光速)であり,1 ナノ秒で伝搬する距離は約 30 センチメートルで
ある.バス上のデータのやり取りは,データをバス上に出力し,その値がバス上で安定したのちに
データの取り込みを行う,という手順をとる.したがって,バス上の値が安定するまでになにがし
かの時間がかかる.マザーボード上に構成されるバスは,線路として構成され,その長さは数十
cm に達する.線路は電気的にはコンデンサの要素を持つので,静電容量がある8 .すなわち,線路
は CR 回路となり,バス上の値が安定するまでにさらに時間を要することになる.また,データ線
間でのばらつきがある(これをスキューという)から,もっとも時間のかかるデータ線に合わせな
ければならない.図 2 のデータ信号の×のところは,安定するまでに時間がかかることを示して
いる(これを遷移区間と呼び,×と×の間を安定区間と呼ぶことにする).したがって,並列デー
タ転送は,一見効率の良い転送方法に見えるが,必ずしもそうではないのである.たとえば,代
表的なバスである PCI バス9 は,当初 133MB/s の転送能力 (33MHz 動作,32 ビットバス幅,1992
年)のパラレルバスであった.その後,仕様の変更・改良により,532MB/s まで能力が高まった
(66MHz 動作,64 ビットバス幅,2004 年).動作周波数を高くすると,遷移区間の時間は変わら
ないから,安定区間が少なくなり,ついには安定区間が無くなってしまう.それが限界の動作周波
数である.もちろん安定区間は一定時間必要だから,動作周波数の上限はもっと低い.バスの動作
速度に関する仕様は,このようなことを考慮して定められるのである.
ディスク装置の転送速度向上,高速ネットワーク,高精細グラフィックスの登場により,バス速
度への要求は益々高まってきた.しかしながら,上記の理由により,バス幅の増加や,動作周波数
の向上は,パラレルバス方式では限界に達している.これに対して,シリアルバスと呼ばれる方式
が用いられるようになってきた.シリアルバスは,基本的には,1 対のデータ線を用いて逐次的に
(ビット毎に)データを送る.また,シリアルバスは,二つの装置間でのデータ転送を基本とする.
複数の装置間でのデータ線の共有というバスの本来の機能が消失するように見えるが,これについ
ては,スイッチを利用して複数の装置の接続を実現する方法で代替する.代表的なシリアルバスと
8 マザーボードなどのプリント基板は配線面を何枚も重ねて作られる.これを多層基板という.表と裏は配線の様子がわ
かるが,中間層は目には見えない.接地面と電源面は中間層に構成される.バスの線路と接地面の間で静電容量が生じる.
9 Periperal Component Interconnect の頭字.インテル社が提案した.
6
して,マザーボード上に構成される PCI Express バス,マザーボードと外部入出力装置を接続す
る SATA バスや USB バスがある.前者の転送速度は,8Gbps (PCI Express 3.0) に達し10 ,後者
は,6 Gbps (SATA 3.0),5Gbps (USB 3.0) に達する.
受信側
送信側
V0
Vin
Vout+
V0/2
Vout-
- V0/2
V0
Vout
図 6: 差動伝送
このような高速転送速度を達成するために,差動伝送 (differential signaling) という方式が用い
られる11 .差動伝送は,図 6 のように記述される回路である.図では省略しているが,プロセッサ
内部ではパラレルバスが用いられるから,パラレルデータをビット列に変換する回路が送信側の手
前に入り,その逆を行う回路が受信側の後に入る.以下では,差動伝送が,高速転送を実現できる
理由を述べる12 .
まず,図 6 の送信側の回路は,入力信号 vin を正負が逆になる信号 vout+ と vout− に変換して
出力する(vout+ = −vout− ).受信側の回路は,入力信号 vout+ と vout− の差を出力する(vout =
vout+ − vout− ).これら一対の信号線を差動信号線と呼ぶことにする.図 6 では,簡単のため,差
動信号線上の振幅を ±v0 /2 としているが,実際にはもっと小さな値でよい13 .その理由は,差動
信号線は雑音の影響を受けにくいからである.具体的には,外部雑音など伝送に悪影響を与える雑
音は,主としてグランド線と信号線の間に加わるからである.すなわち,2つの差動信号線に同じ
雑音が加わる(vout+ + vnoise , vout− + vnoise ).これを同相雑音という.差動伝送の利点は,同相
雑音を除去できることであり((vout+ + vnoise ) − (vout− + vnoise ) = vout+ − vout− ),これにより
小振幅の信号で雑音に頑健な伝送をすることができるのである.振幅が小さければ,信号の立上
り/立下り時間を短くすることができる.信号の振幅は,雑音によって誤受信が起きないような範
囲であればよい14 .
パラレルバスでは,ハンドシェーク,スキューおよび静電容量が転送速度を制限する主な要因で
あった.それに対して,シリアルバスでは,信号線を1対(2本)の差動信号線にし,また,1対
1の装置間のデータ転送にすることにより,スキューと静電容量の問題を改善した.また,ハンド
シェークは行わず,後述のように,ソフトウェア的に伝送データのエラーチェックを行う.Gbps を
超えるような転送では,送信側と受信側でシステムのクロックを利用して同期を確保することは困
難なので,同期情報をデータに埋め込むことによるセルフ・クロック方式を用いる.基本的な考え
方は,送信側は 0101... と変化する一定量の同期用データとそれに引き続く本来のデータを自己の
クロックで送信する.受信側は,同期用データを用いて,データを送る送信側クロックに合わせた
クロックを生成する.その回路を PLL(Phase Lock Loop) 回路という.このクロックを利用して本
来のデータを受信する.送信側のクロックは,電子回路の性質上,時間的な揺らぎがあるので,同
期用データでクロックを生成しても,時間の経過とともにクロックのずれが生じて,正しいデータ
が受け取れなくなることがある.そのため,一回に送ることができるデータの大きさ(ビット数)
10 Gbps
は Giga bit per second の意味.また,将来は 16Gbps の速度が計画されている.
11 従来のバスの信号伝送は,シングルエンド方式と呼ばれる.
12 詳細については電子回路の教科書を参照してほしい.
13 受信側で必要なレベルまで増幅すればよい.
14 厳密に言えば,誤受信の確率が一定値以下になるような範囲であればよい.
7
装置側
トランズアクションパケットの各階層での構成
トランズアクション層
データリンク層
物理層
Frame
Header
Data
ECRC
Seq#
Header
Data
ECRC
LCRC
Seq#
Header
Data
ECRC
LCRC
Frame
PCI Express
bus側
図 7: トランズアクションの 3 階層とトランズアクションパケットの構成
は制限される.大量のデータは,同期用データと本来のデータの組を繰り返し送ることで回路レベ
ルでの伝送を実現する.最近の高速転送では,後述する 8bit/10bit 符号化法(8b/10b encoding)
法が用いられることが多い.これは,データの中にクロック情報を埋め込む方式である.
A, B 1 組の装置間で双方向データ転送 (duplex) を行うには,1 対の信号線を交互に使う方法と,
2 対の信号線を用意して一方を A → B,他方を B → A の転送に使用する方法がある.前者を半二
重方式 (half duplex),後者を全二重方式 (full duplex) という15 .ただし,差動信号線を用いた全二
重方式は,dual simplex という用語が用いられる16 .次に述べる PCI Express は全二重方式 (dual
simplex),次のノートで述べる USB2.0 は半二重方式を採用している.
シリアルバスは,1 対 1 の装置間の伝送が基本であるため,多対多の装置間の伝送は,
(電子的
な)スイッチを導入し,それを切り替えることで実現する.
シリアルバス上のデータのやり取りをトランズアクションという.トランズアクションとは,売
買の行為という意味で,コンピュータ用語としては,端末装置とコンピュータ館で一つの入力メッ
セージを送ること,あるいは一つの出力メッセージを送ること,というように装置間での通信の単
位として用いられてきた.トランズアクションの実体はパケットである.パケットは,ヘッダと呼
ばれる制御情報と本体と呼ばれるデータの集まりである.以下,PCI Express バスを例に見てみ
よう.
PCI Express では,分割トランズアクションを採用している.これは,リクエスタと呼ばれる要
求トランズアクションとコンプリータと呼ばれる応答トランズアクションから一連の処理が組み立
てられることを意味する17 .たとえば,CPU からメモリへの(読出し)要求トランズアクションに
対して,メモリから CPU への応答トランズアクションで読出しデータを返す,という具合である.
4 つのタイプのトランズアクションがある.メモリ,入出力,コンフィグレーション,メッセー
ジの各トランズアクションである.各タイプは,要求と応答のトランズアクションから構成される.
コンフィグレーションは,装置のセットアップに使用され,メッセージは,主として例外処理で用
いられる.
トランズアクションを具現化するために,PCI Express では,3 つの階層が定義されている.ト
ランズアクション層,データリンク層,物理層である(図 7 の左参照).図の下向きの矢印は,送
り出し側の処理手順,上向きの矢印は,受け入れ側の処理手順である.バスに接続される 2 つの装
置は,それぞれが図の機能を持つ.データは,一方の装置の送信側を下って送り出され,バスを経
15 もともとは電話など電気通信の世界で使われている用語.
16 Simplex
は,単方向データ転送の意味.
17 応答トランズアクションは不要の場合もある.
8
由して他方の装置の受信側を上って受け取りが行われる.それぞれの階層の処理は以下のとおりで
ある.
1. トランズアクション層:3 階層の最上位層.送り出しの場合,要求/応答データをパケットに
仕立てる(図 7 の右参照).受け取りの場合は,パケットからデータを抽出する.ヘッダ情
報としては,トランズアクションタイプ,データサイズ,アドレス情報,装置番号などトラ
ンズアクションに必要な情報が含まれる.また,エラーチェック用の情報が含まれる.
2. データリンク層:データリンク層の主な目的は,エラー検出と訂正である.送り出しの場合は
シーケンス番号とエラーチェックコードを付加して物理層に送る.受け取りの場合は,シーケ
ンス番号をチェックしてパケットが順番通りに来ているかどうかを確認する.また,エラー検
出コードの確認を行う.これらに不具合があった場合,再送処理を行う.再送処理は,データ
リンク層間で行われる.そのためのパケット(データリンク層パケット)が用意されている.
3. 物理層:パケットの送信および受信を実際に行う最下位層.パケットの先頭と終端を示すフ
レーム文字を付加して(図 7 右参照),バス上を流れるトランズアクションパケットに仕立
てる.また,送受信回路の制御を行い,8b/10b 符号化やパラレル・シリアル変換などの操作
を行う.
物理層のパケットの大きさは,データ部分が 0∼4096 バイトであり,その他の部分が 24∼28 バ
イトである.また,8b/10b 符号化により 1 バイトが 10 ビットのデータに変換されるので,転送
4096
効率は,4096 バイトのデータを送る場合, 4096+28
×
8
10
= 79.5% となる.ヘッダによる効率低下
は 0.5%程度である.PCI Express 3.0 は,8Gbps の速度であるから,795MB/s の転送能力となる.
また,PCI Express バスは,1 本のシリアルバスが基本(これをレーンと呼ぶ)であるが,4 本を
一組にする構成(束ねたものをリンクと呼ぶ.転送能力は n 本で n 倍になる)や 8 本を一組にする
構成など多様な構成(最大 32 本一組)が可能になっており,より強力なデータ転送が可能となっ
ている.
2.4
8b/10b 符号化
8b/10b 符号化は,1 バイト (8 ビット)のデータを 10 ビットのデータに変換する方法である.そ
の変換方法は,種々存在する.以下では,クロック埋め込み式のシリアル伝送に適した方法を紹介
する.この方法は,1980 年代に IBM から提案されたものである.
IBM の 8b/10b 符号化は,次の条件を満たすように,8 ビットのデータを 10 ビットのデータに
変換する.
1. 8 ビットごとにデータの順番に変換する.
(ライン符号化)
2. 変換後のビット列 (10 ビット) において,1 の数と 0 の数の差が ±2 以内になる.
3. 変換後の連続するビット列 (10 の倍数で 20 ビット以上) において,1 の数と 0 の数の差が ±2
以内になる.
4. 変換後の連続するビット列において,連続する 1 の並びまたは 0 の並びが 5 以下になる.
これらの条件は,伝送路の電気的特性から直流成分を 0 にしたいこと(これを DC バランスとい
う),および,変換後のビット列における十分な回数の値変化を利用して伝送元のクロック信号を
9
表 1: 5 ビットデータの変換表
入力
RD=−1
RD= 1
入力
RD=−1
RD=1
00000
100111
011000
10000
011011
100100
00001
011101
100010
10001
100011
00010
101101
010010
10010
010011
10011
110010
10100
001011
00011
00100
110001
110101
001010
00101
101001
10101
101010
00110
011001
10110
011010
00111
111000
000111
10111
111010
000101
01000
111001
000110
11000
110011
001100
01001
100101
11001
100110
01010
010101
11010
010110
01011
110100
11011
01100
001101
11100
01101
101100
11101
101110
010001
01110
011100
11110
011110
100001
11111
101011
010100
01111
010111
101000
110110
001001
001110
再生したいこと,から来ている.また,上記の 2. の条件が必要な理由は以下のとおりである.8
ビットのビット列の組合せは 256 通りあり,10 ビットでは 1024 通りである.後者の組合せのうち,
1 の数と 0 の数が半々になる組合せは 252 通り (10 C5 ) であるから18 ,1(0) の数が 6 個と 0(1) の数
が 4 個の組合せも利用する必要がある.
IBM 方式は,実際には,8 ビットのデータを上位 3 ビットと下位 5 ビットに分け,それぞれを 4
ビット,6 ビットのデータに変換し,それらを 6 ビットデータ,4 ビットデータの順に連接して 10
ビットのデータにする.これらの変換においては,上記の条件 2 を満たさなければならない.その
ために,ランニングディスパリティ(Running disparity,積算均衡値と呼ぶことにする)RD を導
入する.RD は,−1,1 の値をとり,それまでの変換列の 1 の数と 0 の数の差が負(0 の数が多い)
のとき −1,正のとき 1 となる.差が 0 のときは変わらない(直前の値が継続する).初期値は −1
とする.
データ変換はまず下位 5 ビットに対して行い,ついで上位 3 ビットに対して行う.変換表は,表
1 および表 2 で与えられる.これらの表は,たとえば,入力が 00000 で現在の RD の値が −1 だっ
たら,変換値は 100111 となる,というように読む.また,表の RD=−1 の列の変換結果は 1 の数
が 0 の数より 2 多いか等しく,RD=1 の列は 1 の数が 0 の数より 2 少ないか等しくなっている.つ
まり,今まで 1 の数が少なかったら (RD=−1),今度は 1 の数が多い変換値を出力し,1 の数と 0
の数を均衡させようという考え方である.
変換後に RD の値を更新する.更新の仕方は,図 8 に示すように行われる.図 8 の右は,基本的
な更新規則を示し,左は,変換が 5b → 3b → 5b →... の順に行われることを状態遷移図で表してい
る.図の右は,たとえば,現在 RD=−1 で入力を変換した結果,d=2 だったら,RD は 1 になる
18 条件
4. を考慮すると,実際に使える組合せはもっと少なくなる.
10
表 2: 3 ビットデータの変換表
入力
RD=−1
RD= 1
入力
RD=−1
RD=1
000
1011
0100
100
1101
0010
001
1001
101
1010
010
0101
110
0110
011
1100
0011
111(*)
1110
0001
111(*)
0111
(*) 前後関係によってどちらかが選ばれる.
1000
d=2
5b
RD= -1
d=-2
3b
RD=1
-1
-1
2
1
d
RD更新値
1
0
1
-2
d=1の数- 0の数
d=-2
d=0
0
d=0
d=0
3b
RD= -1
現RD値
-1
d=2
5b
RD=1
1
-1
d=0
図 8: 制御状態遷移図と積算均衡値の更新規則
と読む.
(RD=−1 のとき,d=−2 になることはないし,RD=1 のとき,d=2 になることはない.
)
また,図の左は,たとえば,左上の状態は,現在 RD=−1 で 5 ビット入力の変換を行うことを表
し,変換の結果 d=2 ならば,次は RD=1 で 3 ビット入力の変換を行う,d=0 なら,次は RD=−1
で 3 ビット入力の変換を行う,というように読む.
例:入力データが 10010111 で RD=−1 とする.表 1 から 10111 → 111010 となり,図 8 右から
RD=1 となる.次いで,表 2 から 100 → 0010 で RD=−1 となる.その結果,111010 0010 が得ら
れる.
変換後のデータはビットシリアルに図 6 の回路を通して伝送される.
[注記] 実際の IBM 方式では,このほかに制御用のデータも定義されるが,ここでは,簡単のた
めその記述は省略した.
11
2.5
USB
USB は Universal Serial Bus の頭文字であることからわかるようにシリアルバスである.第二
世代の USB2.0 では,USB1.1 の 1.5Mbps,12Mbps に加えて,480Mbps のデータ転送速度を実現
した.USB3.0 では,5Gbps の速度をサポートし,USB3.1 になると 10Gbps の速度をサポートす
る.USB3.0/1 は USB2.0 の機能もサポートする.実際の構成は,USB2.0 のシリアルバスと新た
に加わった 5/10Gbps の双方向通信ができる超高速シリアルバスが混在したものである.超高速シ
リアルバスの構成は,論理的には USB2.0 の考え方を踏襲し,通信方式は PCI Express と同様に,
2 対の差動信号線を用いた全二重方式,3 階層の通信階層を採用している.したがって,超高速シ
リアルバスの通信方式は,PCI Express を参考にしていただくとして,本節では,USB2.0 に関し
て構成概要を述べることとする.
Host
Root hub
Tier 1
Tier 2
Hub
Func
Func
Hub
Func
Tier 3
Hub
Tier 6
Func
Tier 7
図 9: USB バスの接続形態
USB はコンピュータ((USB) ホストと呼ばれる)と周辺装置((USB) 装置と呼ばれる)を接続
するケーブルバスである.ホストは,システム内に 1 つだけが許され,ホストをルートノードと
して,樹状に USB 装置を接続できる(図 9 参照).中間ノードにはハブ (hub) と呼ばれる中継装
置が接続され,葉ノードには,USB 接続可能なキーボードやメモリなどの装置が接続される.
(木
の)深さが同じレベルのことを層 (tier) という.タイミングの制約から,木の深さは 7 層までであ
る.第 1 層(ルートノード)には,ホストとルートハブがセットで置かれる.第 7 層にハブを置く
ことはできない.また,識別子情報が 7 ビットのため,識別できる装置の数は 127 に制限されてい
る.装置は,後述する USB プロトコルに従って動作するように構成されている.
USB2.0 では 3 種類の通信速度(ハイスピード (480Mbps),フルスピード (12Mbps),ロースピー
ド (1.5Mbps))をサポートしている.低速側の 2 つは,USB1.1 の仕様を引き継いだものである.
USB2.0 では,1 対の差動信号線を用いてデータの送受信を行う.したがって,半二重方式の通信
が行われる.クロックはセルフクロック方式である.USB2.0 はポーリングに基づくバスである.
ホストが主導権を持ち,すべてのデータ通信を取り仕切る.
USB ホストと USB 装置間の通信は,図 10 に示すように 3 階層 (layer) で構成される.上位か
ら,機能 (function) 層,USB 装置層,USB バスインタフェース層である.
• 機能層では,ホスト側は,サービスを要求するクライアントであり,装置側はデータの読出
しや書込みのサービスを提供する機能である.クライアントはバッファを介して要求を出し,
12
ホスト側
装置側
クライアントSW
機能(Function)
機能層
USBシステムSW
USB論理装置
USB装置層
USBバスインタフェース
USBホストコントローラ
USBバスインタフェース層
USBバス
SW:software
図 10: USB の通信階層
機能はエンドポイントと呼ばれるポートを介してサービスを提供する.クライアントと機能
は,それぞれ,複数のバッファとエンドポイントを持ち,バッファとエンドポイントが対と
なってパイプとよぶ(論理的な)通信路を構成する(図 11).もちろん,図 11 は概念図で
あって,実際には図 10 の矢印の経路で通信が行われる.また,パイプは USB バスを時分割
で共有する.1 つのパイプは,単方向の通信を行い,双方向の通信には 2 つのパイプが必要
となる.
クライアントSW
機能
パイプ
エンドポイント
バッファ
パイプ
エンドポイント
バッファ
パイプ
・・・
バッファ
エンドポイント
図 11: パイプ
• USB 装置層では,ホスト側の主導のもとに,USB の基本操作を行う.具体例は後述する.ま
た,この層には,デフォールトパイプとよばれる(論理的な)通信路が置かれ,USB システ
ムソフトと USB 論理装置間での通信が行われる.このパイプは,装置の初期化などのため
に用いられる.このパイプは双方向の通信(半二重通信)ができる.
• USB バスインタフェース層は,物理的な通信を行う.通信はセルフクロック方式であるため,
ビット詰込み (bit stuffing) とよぶ処理 — 1 が 6 個続いたら,0 を一つ埋め込む処理 — を行
い,NRZI とよぶ信号変換方式19 で,クロック情報の埋め込みを実現する.
USB2.0 は半二重通信のバスである.ホストと装置の間で通信方向を必要に応じて変えながらひ
とまとまりの処理を行う.この処理をトランズアクションという.トランズアクションはパケット
を構成単位とする.パケットは,一方向の通信の単位である.主なパケットの構成を図 12 に示し,
以下に各パケットの意味を示す.
1. トークン:トランズアクションの始まりを示す.パケット識別子,装置のアドレス,エンド
ポイントの番号,CRC(誤り訂正コード) から構成される.ホストから装置への送信.
2. データ:送信するデータ.パケット識別子,データ本体 (0∼1024 バイト),CRC から構成さ
れる.トークンの識別子によって,送信方向が異なる.
19 Non
Return to Zero Invert の頭字.入力ビットが 0 の時は信号を反転し,1 のときは反転しない変換方式.
13
Packet
Token
PID
ADDR ENDP
Data
PID
DATA(0-1024B)
Handshake
PID
SOF token
PID
CRC5
CRC16
3 byte
3 - 1027 byte
1 byte
Frame number CRC5
3 byte
図 12: パケットのフィールド構成
表 3: 主なパケット識別子
パケット種別
パケット識別子
意味
トークン
OUT
ホストから装置への出力
IN
SOF
SETUP
装置からホストへの入力
DATA0
DATA1
偶数回目のデータパケット
ACK
送信成功
NAK
送信失敗
データ
ハンドシェーク
フレームの開始
パラメータなどの設定
奇数回目のデータパケット
3. ハンドシェーク:正しく受け取れたか否かを知らせる.パケット識別子から構成される.トー
クンの識別子によって,送信方向が異なる.
4. SOF トークン:フレームの始まりを示す.パケット識別子,フレーム番号,CRC から構成
される.ホストから装置への送信.
パケット識別子 (PID) の具体例を表 3 に示す.
トランズアクションは,トークン,データ,ハンドシェークの 3 つのパケットの集まりとして構
成される20 .図 13 にトランズアクションの例を示す.SETUP は,装置の初期化などのためのトラ
ンズアクションである.INx はデータ入力のためのトランズアクションである.x は 0 または 1 で
ある.大量のデータを入力する場合,このトランズアクションを繰り返すが,その際,IN0,IN1,
IN0,... という順に送り,トランズアクションが順番通りに行われているかチェックする.OUTx
も同様である.
USB2.0 では,フレームとよぶ単位で時間を区切り,フレームの頭で識別用のトランズアクショ
ンを送信する.基準時間は 1ms である.480Mbps の高速動作時は,さらにフレームを 8 個に分割
し,マイクロフレームとよぶ単位で識別用のトランズアクションを送信する.そのために用いられ
るのが SOF トランズアクションである.
トランズアクションが組み合わされて,機能層におけるデータ転送が実現される.データ転送の
種別は次の 4 種類である.
20 トランズアクションによっては,データパケットとハンドシェークパケットがない場合がある.
14
Transaction
SETUP
Token pkt
Data pkt
Handshake pkt
SETUP
DATA0
ACK
IN
DATAx
ACK
OUT(x)
OUT
DATAx
ACK
SOF
SOF
IN(x)
注)白地はホストから装置への送信,灰地は装置からホストへの送信
xは0または1
図 13: 主なトランズアクション
Transfer
Control
Write
Setup stage
Data stage
Data stage
SETUP TA
OUT(1) TA
・・・
OUT(x) TA
Bulk Read
IN(0) TA
IN(1) TA
・・・
IN(x) TA
Bulk Write
OUT(0) TA
OUT(1) TA
・・・
OUT(x) TA
Status stage
IN(1) TA
注)TA:トランズアクション
x:0または1
図 14: 転送の例
1. コントロール転送 (Control Transfer):装置の制御パラメータの設定などの転送.転送の信
頼性を保証.
2. アイソクロナス転送 (isochronous Transfer,ストリーム転送ともいう):実時間性を重視する
転送.転送中に誤りが発生しても手当てしない.
3. 割込転送 (Interrupt Transfer):頻発はしないが一定時間内に応答が必要な転送.ポーリング
ベースなので定期的に割込転送を行う.転送の信頼性を保証.
4. バルク転送 (Bulk Transfer):ファイルなどのまとまったデータの転送.転送の信頼性を保証.
転送の例を図 14 に示す.コントロール転送は,通常 3 つのステージからなる(セットアップ,
データ,ステイタスの各ステージ.データステージはない場合がある.
).図にはコントロール書込
みの例が示してある.セットアップトランズアクションでは,図 13 からわかるように,セットアッ
プに必要なデータを送ることができる.さらにデータが必要な場合にデータステージを利用する.
そして,セットアップの結果をチェックするステイタスステージが続く.バルク転送は,読出しと
書込みの例が示してある.読出し/書込みトランズアクションが必要回数繰り返される.
複数のパイプが同時動作をしている場合,すなわち,複数の転送が同時に実行されている場合,
ホストコントローラが,トランズアクション単位で転送順序のコントロールをする.たとえば,2
つの転送が同時動作している場合,各(マイクロ)フレーム内で,それぞれの転送のトランズアク
ションを一つづつ実行するようにする.フレーム内でどちらのトランズアクションを先に行うかに
15
ついては,ホストコントローラの裁量範囲である.この結果,あたかも 2 つの転送が同時実行され
ているように見える.
ここで述べた例は,転送が成功した場合の例である.転送が失敗した場合の動作が本当は重要で
あるが,紙面の都合で記述することができない.興味ある読者は,USB の仕様書などを参照され
たい.
16