筑波大学技術報告
28:17-24,2008

FPGA による PCI バス・インターフェース回路の実装
小野ᴾ 雅晃ᵏ筑波大学システム情報工学等支援室（装置開発班）〒305-8573 茨城県つくば市天王台 1-1-1の PCI カード・エッジコネクタから FPGA にプリント配線され、FPGA 中に実装された PCI バス・イン
ターフェース回路に接続されている。PCI バス・イ
ンターフェース回路は、NI とホスト PC の間で PCI
バスを通してデータ転送を行う。データ転送は 2 種類あり、1 つが PCI ターゲット転送、もう 1 つが PCI
マスタ転送である。PCI ターゲット転送は、ホスト
PC が要求元となるデータ転送である。PCI マスタ転
送は、NI が要求元となるデータ転送である。
PCI バス・インターフェース回路の PCI ターゲッ
ト転送は単一転送に制限されるが、PCI マスタ転送
はバースト転送に対応している。PCI バスの動作周
波数は 66 MHz、データ幅は 64 ビットである。

概要
クラスタ型コンピュータ向けネットワーク・イン
ターフェース MaestroNI 用に PCI バス・インターフ
ェース回路を開発した。PCI (Peripheral Component
Interconnect) バス・インターフェース回路は FPGA
(Field Programmable Gate Array) 内に実装され、PCI
ターゲット転送、PCI マスタ転送を処理することができる。PCI バス・インターフェース回路の PCI タ
ーゲット転送は単一転送に制限されるが、PCI マス
タ転送はバースト転送に対応している。PCI バスの動作周波数は 66 MHz、データ幅は 64 ビットであり、理論上のスループットの最大値は 528 Mbytes/sec である。PCI バス・インターフェース回路は、市販のIP (Intellectual Property) を使用せず、PCI の規格を基に全て独自に設計・開発した。現在、Maestro2 および Maestro3 ネットワーク・インターフェース基板のFPGA に実装されて、NI 基板とホスト・パーソナル・
コンピュータ（ホスト PC）を結ぶインターフェースとして使用されている。

２．PCI バスの概要
2.1 PCI バスの特徴

キーワード：FPGA、PCI バス、Maestro

１．はじめにPCI バスは、パーソナル・コンピュータ(PC)の拡
張スロットとして親しまれているバス規格である。2枚目のグラフィックカードや、イーサネットカード、
A/D コンバータカード、キャプチャカード、いろい
ろな用途の拡張基板用のバスとして使用されている。
PCI バスは PCI SIG(Peripheral Component Interconnect
Special Interest Group) により 1992 年に PCI 仕様書第1 版が出版され、スタートを切った。その後、1999
年に第 2 世代として、データ転送速度を向上させた
PCI-X バスが発表された。PCI-X バスは主にサーバー機器用の拡張ボード規格として使用された。2002
年には第 3 世代として、高速シリアル通信を採用した PCI-Express が発表された。PCI-Express が主な拡
張ボード・インターフェース規格として採用された
現在でも、PCI バス・コネクタは、PC に必ず搭載されている。
第 4 回筑波大学技術職員技術発表会で発表したMaestro2 ネ ッ ト ワ ー ク ・ イ ン タ ー フ ェ ー ス(Maestro2NI) [1]と第 6 回筑波大学技術職員技術発表
会で発表した Maestro3 ネットワーク・インターフェース (Maestro3NI) [2]は、PCI バスに接続される拡張基板である。2 つのネットワーク・インターフェース(NI)は、ホスト PC のマザーボード上の 64 ビット
幅、3.3 V 電圧の PCI バス・コネクタに挿入されて使用される。PCI バス・インターフェース信号は、NI
1E-mail: ono@sie.tsukuba.ac.jp; Tel: 029-853-5195&,

PCI バスには次の特徴がある。
1. 64 ビットまたは 32 ビット・データ幅の同期バスである。
2. 割り込み信号とエラー信号以外のほとんどの制御信号にサステインド・トライステート方式を使用している。
3. メモリ空間、IO 空間、コンフィギュレーショ
ン空間を持っている。
4. プラグ・アンド・プレイに対応できる。
5. アドレスバスとデータバスが共用である。
6. データ転送を始める際に、マスタ・デバイス
が C/BE#にコマンドを出力するので、ターゲット・デバイスは転送の種類をあらかじめ知ることができる。
7. バイト・イネーブルを持っていて、バイトごとに書き込みができる。
8. 制御信号のほとんどがアクティブ・ロー信号である。
2.のサステインド・トライステート方式は、トラ
イステート方式の一種であり、アクティブ・ローの制御信号に使用されている。サステインド・トライ
ステート信号は、マザーボード側で抵抗によってプルアップされている。アクティブ・ローの信号は、デバイスによって 0 レベル（アサート）にドライブされてから、1 レベル（ディアサート）に戻される
動作を繰り返して、データ転送のやり取りを行う。
その際に、ドライバのドライブを 0 レベルの間にOFF し、プルアップ抵抗で浮遊容量を充電して 1 レ
ベルにすると、1 レベルに達するまでの時間が長くなる。その点を改良するために、サステインド・ト
ライステート方式は、1 レベルにドライブしてからドライブを OFF する。図 1 に通常のトライステート
バッファの波形とサステインド・トライステートバ
ッファの波形を示す。

ビット
31

1

16

通常のトライステート方式の波形
10

サステインド・トライステート方式の波形ドライブON

0

00ha)

ステータス

コマンド

04h

クラス・コード

リビジョンID

08h

ヘッダ・
タイプ

キャッシュ・ライン・サイズ

0Ch

レイテンシ・
タイマ

ベース・アドレス・レジスタ(SDRAM)

10h

ベース・アドレス・レジスタ（ネットワーク・バッファ）14h

ベース・アドレス・レジスタ(FLASH ROM)18h

ベース・アドレス・レジスタ（設定用レジスタ）1Ch

ベース・アドレス・レジスタ（未使用）20h

ベース・アドレス・レジスタ（未使用）24h

カードバスCISポインタ

28h

ドライブOFF

サブシステムID

サブシステムベンダID

新機能
ポインタ

予 約

PCI バスの空間にはメモリ空間、IO 空間、コンフィギュレーション空間の 3 つがある。
メモリ空間は、ホスト PC のプロセッサのメモリ空間にマップされる。通常は BIOS(Basic Input/Output
System)によって、PCI ボードで使用するメモリ領域をマップする。PCI バス・インターフェース回路では、Maestro2NI および Maestro3NI の SDRAM 領域、
ネットワーク・バッファ領域、FLASH ROM (Flash
Read Only Memory)、設定用レジスタの４つをマップしている。
IO 領域は、x86 プロセッサの IO と同様に、64 K
バイトの領域がある。IO 領域は PCI バス・インター
フェース回路ではサポートされていない。
コンフィギュレーション空間[3]は、PCI ボードのステータスの監視や設定を行う領域で、8 ビット長のアドレス空間を持っている。図 2 にコンフィギュ
レーション空間のアドレス・マップを示す。コンフィギュレーション空間のレジスタはコンフィギュレーション・レジスタと呼ばれる。
アドレス 00h（h は 16 進数を表す）のベンダ ID
は PCI ボード
（PCI バスに接続されている基板を PCI
ボードと呼ぶことにする）を作成したメーカーの固有コードである。ベンダ ID は PCI SIG によって、各メーカーに割り当てられる。
アドレス 02h のデバイス ID はメーカーのいわば型番となる。
アドレス 09ｈ〜0Bh のクラスコードは PCI ボードの種類を表す。たとえば、PCI バス・インターフェース回路では基本クラスがネットワーク・コントローラを示す 02h、サブクラスがその他のネットワー
ク・コントローラを示す 80h、プログラミング・イ
ンターフェースが 00h となる。
ホスト PC のデバイス・ドライバは、ベンダ ID、デバイス ID、クラスコードなどから自分の制御すべきボードがどれなのかを判定することができる。
アドレス 04h のコマンドは、一般的にコマンド・レジスタと呼ばれている。コマンド・レジスタは、

最小
グラント

PCIインタラ
プトピン

34h
38h

予 約
最大
レイテンシ

2Ch
30h

拡張ROMベースアドレス

図 1 通常のトライステート方式の波形とサステイ
ンド・トライステート方式の波形の比較

2.2 PCI バスの空間

アドレス

ベンダID

BIST

0

15

デバイスID

インタラプトライン

デバイス固有レジスタ領域(設定用レジスタ、Block RAM)

3Ch
4Ch
〜
FCh

a) 00hのhは hexadecimal(16進数）を表す

図 2 コンフィギュレーション空間のアドレス・マップ
PCI ボードのさまざまな機能を制御するためのレジスタである。アドレス 06h のステータスは、一般的にステータス・レジスタと呼ばれ、読み出しのみのレジスタである。ステータス・レジスタは、PCI ボ
ードの状態を表す。
アドレス 10h〜24h の領域は、ベース・アドレス・レジスタに割り当てられている。ベース・アドレス・レジスタは、32 ビット長で、PCI ボード上のメモリ、
IO (Input/Output) の領域の大きさとホスト PC でのアドレスを示す。このレジスタの 1 つ１つがメモリ
空間、IO 空間に対応する。ベース・アドレス・レジ
スタの示す空間が、どちらの空間かを表すためにビット 0 が使用される。ビット 0 が 0 のときはメモリ空間となり、1 のときは IO 空間となる。ホスト PCのコンフィギュレーション・アクセスが終了した時
点でのベース・アドレス・レジスタは、ホスト PCのアドレス・マップに対応するアドレスが入力されている。Maestro3NI では、10h に SDRAM、14h にネットワーク・バッファ、18h に FLASH ROM、1Chに設定用レジスタが割り当てられている。その他のベース・アドレス・レジスタ領域は未使用のため 0に固定されている。ベース・アドレス・レジスタの設定方法は第 5 章で述べる。

３．PCI バスの信号
PCI バスは 184 本の信号線を持っている。信号線
は、システム信号、アドレス・データ・属性信号、制御信号、アービトレーション信号、エラー関連信&-号、割り込み信号、キャッシュ・サポート信号、JTAG/
バウンダリ・スキャン信号に分けられる。
システム信号は CLK、RST#で構成される。アドレス・データ・属性信号は AD[63:00]、C/BE[7:0]、
PAR、PAR64 で構成される。制御信号は、FRAME#、
IRDY#、TRDY#、STOP#、LOCK#、IDSEL、DEVSEL#で構成される。アービトレーション信号は、REQ#、
GNT#、REQ64#、ACK64#で構成される。エラー関
連信号は、PERR#、SERR#で構成される。インタラ
プト信号は、INTA#、INTB#、INTC#、INTD#で構成される。キャッシュ・サポート信号は、SBO#、
SDONE#で構成される。最後の JTAG/バウンダリ・
スキャン・ピンは TCK、TDI、TDO、TMS、TRST#で構成される [3] 。

やコンフィギュレーションの書き込み、読み出しをコードでターゲット・デバイスに知らせる。取得したアドレスが自分のベース・アドレス・レジスタで示されるアドレスだったら、ターゲット・デバイス
は DEVSEL# を ア サ ー ト し て 応 答 を 開 始 す る 。
Meastro3NI の PCI バス・インターフェース回路では
DEVSEL#信号は、FRAME#がアサートされたクロッ
クの 1 クロック後にアサートを開始している（デコード・タイミングは中速）。
マスタ・デバイスは FRAME#の後のクロックで、
AD に書き込むデータ、C/BE#にバイト・イネーブルを出力し、IRDY#をアサートする。
ターゲット・デバイスは DEVSEL#と同じタイミ
ングで、書き込みデータを受け入れ可能なことを示すために TRDY#をアサートする。IRDY#と TRDY#が同時にアサートされたタイミングで、PCI データ転送が成立する。図 3 (Maestro3NI) の場合は、単一転送であるため、1 つデータ転送が終了した時点でPCI ターゲット転送を完了する。FRAME#、IRDY#、
DEVSE#、TRDY#、STOP#はサステインド・トライ
ステート信号なので、0 から 1 にドライブしてからハイ・インピーダンス状態となる。AD と C/BE#は通常のトライステート信号であるので、図 3 の斜線の部分でハイ・インピーダンス状態となる。

４．PCI バスの信号プロトコル
Maestro3NI の PCI ターゲット転送と PCI マスタ転送、コンフィギュレーション・サイクルを例にとって、PCI バスの信号プロトコルを説明する。

4.1 PCI ターゲット書き込み転送
CLK
AD

ADR

DATA

C/BE#

CMD

BE

4.2 PCI マスタ転送の読み出し
CLK

FRAME

REQ#

IRDY#

GNT#

DEVSELAD

ADR

DATA1 DATA2 DATA3

C/BE#

CMD

BE

TRDY#

REQ64#STOP#

FRAME#

ADR：アドレス
CMD：コマンドIRDY#

DATA：データ
BE：バイト・イネーブル

ACK64
DEVSEL#

図 3

PCI ターゲット・ライト

TRDY#
STOP#

図 3 はホスト PC から Maestro3NI への PCI ター
ゲット書き込み転送（PCI ターゲット・ライト）を表している。図 3 で、実線はドライブされている信号を示している。破線は、バスの信号線がプルアッ
プ抵抗でプルアップされているだけで、どこのドラ
イバからもドライブされていない状態を表している。
バスのハッチングは、バスがハイ・インピーダンス状態にあることを示している。なお、インタラプトなどの信号を除く大部分の信号は CLK の立ち上がりに同期して変化する。
C/BE#、FRAME#、IRDY#はマスタ・デバイス（この場合はホスト PC）が常時ドライブする信号である。
PCI ターゲット・ライトの場合は、AD もマスタ・デバイスが常時ドライブする。
ターゲット・デバイス（この場合は Maestro3NI）
は、FRAME#が 0 になってアサートされたときに動作を開始する。ターゲット・デバイスは FRAME#が0 になり、アサートされたときに、AD からアドレスを取得する。それと同じタイミングで、C/BE#にはコマンドが出力されている。コマンドはメモリや IO&.

ADR：アドレス
CMD：コマンドDATA1,DATA2,DATA3：データ
BE：バイト・イネーブル

図 4

PCI マスタ・リード

図 4 は Maestro3NI からホスト PC への PCI マスタ
転送の読み出し（PCI マスタ・リード）を表している。図 3 から追加された信号のうち、REQ#、GNT#
はホスト PC の PCI バス・アービトレーション回路
がドライブする。REQ64#はマスタ・デバイス（この場合は Maestro3NI）がドライブし、ACK64#はター
ゲット・デバイス（この場合はホスト PC）がドライブする。
図 4 の PCI マスタ転送は、Maestro3NI のプロセッサがホスト PC のメモリを読み出すために、PCI バ
ス・インターフェース回路に１ワード(32 bit)のリードを要求した場合である。PCI バス・インターフェース回路は、初めに、バスを要求するために REQ#
を 0 にアサートする。一般的にホスト PC のチップセットに内蔵されている PCI バス・アービトレーシ

それは、PCI スロットごとにユニークな IDSEL といョン回路は、PCI バス・インターフェース回路からう信号が PCI データ転送の始まりの時にアサート(1)
出されたバス要求を許可するために GNT#を 0 にア
されるかどうかを監視すれば、データ転送の始まり
サートする。これでバスの使用が許可されたが、他を認識できるからである。コンフィギュレーショ
のデバイスがまだ PCI バスを使用している可能性がン・ライトは、AD にアドレスが 8 ビットのみ出力あるため、マスタ・デバイスは FRAME#、IRDY#をされているなどの違いはあるが、その他はほとんど監視して、どちらも 1 にディアサートされたときにPCI ターゲット・ライトと同様である。
バスが使用されていないと認識する。バスが使用されていないときに、マスタ・デバイスは FRAME#と、CLK
もし 64 ビットアクセスをしたいときは REQ64#をアサートする。PCI バス・インターフェース回路のマ
IDSEL
スタ・アクセスはすべて 64 ビットで行われるので、
ADR
AD
DATA
図 4 では REQ64#がアサートされている。
図 3 の PCI ターゲット・ライトとの違いの１つは、
C/BE#
CMD
BE
FRAME#が連続してアサートされていることである。
FRAME#
図 4 のように、連続してアサートする場合は、連続的にデータを転送（バースト転送）できる。3 つのIRDY#
64 ビットデータをリードしているが、そのうちの 32
ビット分のデータのみ使用して、その他のデータは
DEVSEL#捨てている。これは、データパスのパイプライン化
TRDY#によって、バースト転送時のスループットを確保するために必要な措置である。さらに、ライトの場合
STOP#
は、マスタ・デバイスがトランザクションの間すべ
ADR：アドレス DATA：データて、AD バスをドライブしていたが、リードの場合
CMD：コマンド BE：バイト・イネーブル
はアドレスを出力した後でドライブを OFF し、ター
ゲット・デバイスが AD バス上にリード・データを
図 5 コンフィギュレーション・ライト
出力する。
PCI マスタ・リードの場合も PCI ターゲット・ラ
イトの時と同様に、双方の制御信号のやり取りで、
５．ホスト PC 起動時のコンフィギュレー
データ転送を行う。IRDY#と TRDY#が同時にアサートされた時が、データ転送が成功した場合である。
ション
マスタ・デバイスはデータ転送終了の 1 つ前に
ホスト PC を電源 ON すると起動する BIOS (BasicFRAME#を 1 にディアサートする。最後の 1 つの転Input/Output
System)が、PCI ボードにコンフィギュレ
送が終了したら、マスタ・デバイスは IRDY#をディーション・サイクルを発生させて、PCI
ボード上のアサートした次のクロックで、ドライバをハイ・イ
各コンフィギュレーション・レジスタを読み、ベー
ンピーダンス状態にする。
ス・アドレス・レジスタを操作して、PCI ボードのターゲット・デバイスの制御信号線は図 3 に比べコンフィギュレーションを行う。
て ACK64#が追加されている。ACK64#は REQ64#にベース・アドレス・レジスタは、メモリ領域また対する応答としてアサートされる。つまり、ターゲ
はIO 領域をホスト PC のメモリ空間または IO 空間
ット・デバイスが 64 ビット幅のデータ転送に対応しに確保するためのレジスタである。ベース・アドレている場合は、ACK64#をアサートする。ACK64#がス・レジスタには、メモリ空間では 4 ビット、IO 空
アサートされない場合、マスタ・デバイスは 64 ビッ間では 2 ビットの予約領域がある。この予約領域は
ト幅のデータ転送を中断して、32 ビット幅のデータ
最下位ビットから割り当てられており、割り当てら転送に変更する。ただし、Meastro3NI の PCI バス・れるメモリ領域の最小値は 16 バイト、IO 領域は 4インターフェース回路は、マスタ・アクセス時の 32
バイトとなる。予約領域の上のビットは、PCI ボー
ビット幅データ転送に未対応である。
ドの要求するメモリ領域、IO 領域の大きさによってその他の制御信号は、バースト転送として連続的0 に固定される。固定された以外の上位ビットには、にアサートされる以外は、特に変更はない。
アドレスを記憶する DFF (Delay Flip Flop) が実装される。例えば、Maestro3NI のベース・アドレス・レ
4.3 コンフィギュレーション・サイクル
ジスタ 0（コンフィギュレーション・アドレス 10h
図 5 はコンフィギュレーション・書き込みサイク〜13h）は SDR SDRAM のアドレスが入力される。
ル（コンフィギュレーション・ライト）を表してい
Maestro3NI の SDR SDRAM の容量は 128 M バイトなる。
ので、必要とするアドレスビットは 27 ビットであコンフィギュレーション・サイクルは、コンフィる。よって、ベース・アドレス・レジスタ 0 の 0 に
ギュレーション・レジスタにアクセスするために使固定されるビットはビット 4 からビット 26 までとな用される。ホスト PC が電源 ON で、ブートしたとる。後のビット 27 からビット 31 までは、ホスト PC
きには、コンフィギュレーション・レジスタのベーから割り当てられるアドレスを記憶するために、
ス・アドレス・レジスタは値が入力されていない。
DFF を実装した。
よって、この状態では、PCI ボードはアクセスに応
BIOS によるベース・アドレス・レジスタの設定手答できない。このような場合でも、コンフィギュレ
順は以下のとおりである。
ーション・サイクルには、応答することができる。

'%

1.
2.
3.

4.

ホスト PC は、コンフィギュレーション・ライトを発行して、PCI ボードのベース・アド
レス・レジスタにオール 1 を書き込む。
ホスト PC は、コンフィギュレーション・リードを発行して、PCI ボードの書き込んだベース・アドレス・レジスタを読み出す。
読み出したデータのビット列のどこまでが 0か（1 を書いたはずなのに）を調べて、そのベース・アドレス・レジスタで要求された領域の大きさを確認する。
要求された領域をホスト PC のアドレス・マ
ップ上に確保して、そのアドレスをコンフィ
ギュレーション・ライトで、もう一度 PCI ボ
ードのベース・アドレス・レジスタに書き込む。

路はコンフィギュレーション回路、PCI ターゲット
回路、PCI マスタ回路と IO バッファ回路で構成されている。

6.1 PCI ターゲット回路
PCI ターゲット回路は、単一転送のみをサポート
し、バースト転送はサポートしていない。ホスト PCのプロセッサからのアクセスは 32 ビット・アクセスなので、FPGA 内の 64 ビット・バスとのインターフ
ェースを図るため、ワードレーン変換機能を備えている。図 8 に PCI ターゲット回路のデータパス・ブ
ロック図を示す。
PCIバス（32ビット幅）

FPGA 内部
バス

D‑ FF

M
U
X

64ビット幅ワードレーン変換機能

このように、ベース・アドレス・レジスタの設定
を通して、PCI ボードのリソースがホスト PC のアド
レスにマップされ、ホスト PC のプロセッサからアクセスが可能となる。

PCI ターゲット・リード

M
U
X

PCIバス
（32ビット幅）

D‑ FF

FPGA 内部バス

64ビット幅

６．PCI バス・インターフェース回路

ワードレーン変換機能
DFF

PG

ParityError

XOR

Maestro3ネットワーク・インターフェース

PAR
PCI ターゲット・ライト

FPGA

プリント基板図 8 PCI ターゲット回路のデータパス・
ブロック図

その他の内部回路

PCIバス・インターフェース回路
PCIターゲット コンフィギュ
レーション PCIマスタ回路
回路
回路

@ELSE
RESET

IOバッファ回路

idle

frame_b andirdy_b@ELSE

frame_b = '0'
bus_busy

PCIバス・カードエッジ・コンタクト@ELSE

図 6 PCI バス・インターフェース回路のブロック図@ELSE

mydev and pci_r_w and!tgt_write_busy

Decode_checkmydev and!pci_r_w and!tgt_write_busy

mydev and
tgt_write_busy
read_init_wait

write_data@ELSE
tgt_time_out1!tgt_time_out1 anddev_readyframe_btgt_discon_retry
frame_b
read_data

@ELSE

@ELSE

turn_aroundframe_b

図 9 PCI ターゲット回路のメイン・ス
テート・マシン

図 7 Maestro3NI の PCI バス、FPGA 部分

PCI ターゲット・リードの場合は、FPGA 内部バスの上位 32 ビットと下位 32 ビットをマルチプレク
サによって切り替え、32 ビット分を下位の PCI バスに送る。PCI ターゲット・ライトの場合は、PCI バ
スからアドレスを取得して、FPGA 内部バスの上位
32 ビットに出力するか、下位 32 ビットに出力するかを決定する（図 8 参照）。

PCI バス・インターフェース回路は Maestro3 ネッ
トワークの一部として、主にホスト PC のメモリとMaestro3 ネットワークのデータのやり取りに使用されている。
PCI バス・インターフェース回路のブロック図を
図 6 に示す。Maestro3NI の PCI バス、FPGA 部分の写真を図 7 に示す。PCI バス・インターフェース回'&PAR は AD[31:0]と C/BE#[3:0]の偶数パリティを出力する。PCI マスタ・アクセスの場合と、PCI ター
ゲット・リードの場合に PCI バス・インターフェース回路からパリティを出力する。

PCI ターゲット回路のメイン・ステート・マシン
を図 9 に示す。
リセット後は、idle ステートからスタートする。
FRAME# (frame_b) が 0 にアサートされたときに、
Decode_check ステートに遷移し、自分のアドレス（ベース・アドレス・レジスタに設定してあるアドレス）にヒットしたかを調べる。自分のアドレスにヒットしていない場合は、bus_busy ステートに遷移し、その PCI バス・トランザクションが終了するまで、そのステートで待機する。自分のアドレスにヒットした場合は、ライトの場合とリードの場合に分かれる。
ライトの場合に、以前のトランザクションが終了
している場合は write_data ステートに遷移し、FPGA
内部バスに書き込みデータを送る。以前のトランザ
クションが終了していない場合は、tgt_discon_retry
ステートに遷移して、リトライ動作を行う。
リードの場合には、read_init_wait ステートに遷移
して、FPGA 内部バスからリード・データが到着するのを待つ。リード・データが到着したら、reda_data
ステートに遷移して、PCI バス上にリード・データを出力する。
ライトの場合も、リードの場合もデータ転送が終了したら、turn_around ステートに遷移する。ここでは、サステインド・トライステート状態にするために制御信号をディアサート (1) する。
tgt_discon_retry ステートは、リトライで終了する
場合に遷移するステートである。リトライで終了する場合には、ライト時に以前のトランザクションが終了していない場合や、read_init_wait ステートで処理を待っているときにタイムアウトで PCI バス・ト
ランザクションを終了する場合がある。
図 9 のステート・マシンを使用して、図 3 の PIC
ターゲット・ライトを実現している。

㪝㪧㪞㪘஥䊤䉟䊃
↪ォㅍᢙ䉦䉡
䊮䉺㪧㪚㪠஥䊤䉟䊃↪
ォㅍᢙ䉦䉡䊮䉺
㪧㪚㪠㩷䊙䉴䉺
䊤䉟䊃
䉝䊄䊧䉴
䉦䉡䊮䉺

㪄㪈

㪄㪈

㪝㪧㪞㪘

㪂㪈
㪮㫉㫀㫋㪼㩷
㪩㪼㪸㪻㫐㪧㪚㪠㩷䊙䉴䉺䊶
䊤䉟䊃↪
㪝㪠㪝㪦㪎㪉㪹㫀㫋᏷
㪌㪈㪉ᷓᐲ

㪤
㪬
㪯

㪠
㪦
㪙

㪘㪛

㪛㪸㫋㪸

㪸㪻㪶㫆㪼
㪫㪸㫉㪾㪼㫋㩷㪛㪸㫋㪸
㪛㪝㪝

㪧㪘㪩

㪤
㪬
㪯

㪤
㪬
㪯

㪠㪦㪙

㪛㪝㪝

㪧㪞

㪮㫉㫀㫋㪼㩷㪚㪤㪛㪛㪝㪝㪧㪞㪩㪼㪸㪻㩷㪚㪤㪛

㪛㪝㪝㪧㪞㪫㪸㫉㪾㪼㫋
㪧㪘㪩

PCIマスタ・リード
PCIターゲット・ライト用㪮㫉㫀㫋㪼㩷㪚㪤㪛
㪚㪆㪙㪜㩺

㪤
㪬
㪯

㪠㪦㪙

PCIマスタ・ライト
PCIターゲット・リード用㪩㪼㪸㪻㩷㪚㪤㪛㪙㪜㪠㪦㪙㩿䉮䊮䊃䊨䊷䊤䈎䉌ଏ⛎䇮㪩㪼㪸㪻↪㪀

㪤㪸㫊㫋㪼㫉㩷㪧㪘㪩㪝㪧㪞㪘஥䊥䊷䊄
↪ォㅍᢙ䉦䉡
䊮䉺㪧㪚㪠஥䊥䊷䊄↪
ォㅍᢙ䉦䉡䊮䉺

㪫㪸㫉㪾㪼㫋㩷㪧㪘㪩㪧㪚㪠㩷䊙䉴䉺
䊥䊷䊄
䉝䊄䊧䉴
䉦䉡䊮䉺

㪄㪈
㪠㪩㪛㪰㩺
㪫㪩㪛㪰㩺

㪛㪝㪝

㪘㪥㪛

㪄㪈

㪂㪈

㪘㪛

㪠
㪦
㪙
㪮㪩㪶㪜㪥

㪛㪝㪝

㪫㪩㪛㪰㩺

㪩㪼㪸㪻
㪩㪼㪸㪻㫐

㪧㪚㪠㩷䊙䉴䉺
䊥䊷䊄↪
㪝㪠㪝㪦㪎㪉㪹㫀㫋᏷㪌㪈㪉ᷓᐲ㪛㪸㫋㪸㪫㪸㫉㪾㪼㫋㪘㪛㪛㪝㪝㪧㪞㪧㪸㫉㫀㫋㫐
㪜㫉㫉㫆㫉

㪯㪦㪩

㪧㪘㪩

㪠㪦㪙

㪧㪞

㪫㪸㫉㪾㪼㫋
㪧㪘㪩䈖䉏䈲㪧㪸㫉㫀㫋㫐㩷㪞㪼㫅㪼㫉㪸㫋㫆㫉䉕␜䈜ὐ✢䈱ౝ஥䈏㪧㪚㪠㩷䊙䉴䉺

図 10 PCI マスタ回路入出力部分ブロック図

6.2 PCI マスタ回路

C/BE＃は PCI バス・アクセスの最初でコマンドを出力し、その後はバイト・イネーブルを出力する必要がある。そのため、マルチプレクサ(MUX)で入力を切り替えている。

PCI マスタ回路は、64 ビット幅のデータ転送のみをサポートしている。IO バッファ回路、PCI ターゲ
ット回路の一部を含めた入出力部分のブロック図を
図 10 に示す。
図 10 中の IOB (Input Output Block) は、FPGA のパッド近くに実装された入出力ブロックである。IOB
内には入力用、出力用、トライステート・イネーブ
ル用の DFF が内蔵されている。PG (Parity Generator)
は、偶数パリティを生成する回路である。
図 10 の上部が主に PCI マスタ・ライトおよび、
PCI ターゲット・リードが使用する回路である。図
10 の下部が主に PCI マスタ・リードおよび、PCI タ
ーゲット・ライトが使用する回路である。PCI マス
タ・リード、ライトともに 512 深度の FIFO (first-in
first-out) に転送データを蓄積している。PCI マス
タ・ライトの場合は、ライト用 FIFO から IOB を通して AD に出力し、PCI マスタ・リードの場合は IOB
を通してリード用 FIFO に入力している。どちらのAD も同じ FPGA の端子であり、図では便宜上、分けて書かれている。
PCI マスタ・ライトのリード、ライトともに、PCI側と FPGA 側にそれぞれ転送数カウンタを持っている。そのため、FIFO の入力、出力両側の転送数がわかるようになっている。

@ELSE
RESET
idle
!request and !gnt_b anddframe_b_in anddirdy_b_in

request and !gnt_b anddframe_b_in andgnt_b
request and !gnt_b

gnt_b

addr_cmd_as
gnt_b

@ELSE
drive_bus

stop_target!gnt_b!request and !gnt_b

request and !gnt_b

turn_around(frame_bb and !stop_b)or (frame_bb anddev_to)@ELSE

m_trans_data!frame_bb or (frame_bb and trdy_b
and stop_b and!dev_to)

図 11''

PCI マスタ回路のメイン・
ステート・マシン2.

図 11 に PCI マスタ回路のメイン・ステート・マ
シン[4]を示す。
リセット後は、idle ステートからスタートする。
REQ# (request) をアサートして、GNT# (gnt_b) がアサートされて、FRAME# (frame_b)と IRDY# (irdy_b)
がディアサートされたときに、addr_cmd_as ステー
トに遷移する。addr_cmd_as ステートで、AD にアドレス、C/BE#にコマンドを出力してデータ転送が始まる。addr_cmd_as ステートから無条件に遷移する
m_trans_data ステートでは、データ転送を行う。正
常に終了するときには、turn_around ステートに遷移
して、ドライブしている制御信号(FRAME#, IRDY#)
を 1 にディアサートする。ターゲット・デバイスから STOP#をアサートされたとき、または、ターゲッ
ト・デバイスから応答がなかった場合は、stop_target
ステートに遷移して、ディスコネクト処理を行う。
turn_around ステート、または、stop_target ステート
で GNT#がアサートされていたら、バス・パーキン
グを行う必要があるので drive_bus ステートに遷移する。バス・パーキングとは、PCI バス・トランザ
クションを行わずに AD と C/BE#をドライブすることである。turn_around ステート、または、stop_target
ステートで GNT#がディアサートされていたら、idle
ステートに戻る。
以上のような動作を行い、PCI マスタ転送を行っ
ている。

3.

4.

6.3 コンフィギュレーション回路
コンフィギュレーション回路は、図 2 に示したコ
ンフィギュレーション空間に割り当てられたコンフィギュレーション・レジスタを実装している。

PCI バス規格書には、64 ビット幅の PCI バス
も 32 ビット幅の PCI バスのトランザクショ
ンにも対応しなければならないとある。PCI
バス・インターフェース回路の PCI マスタ・
アクセスは 64 ビットのみ対応する。余計な回路に対応しないことによって、回路構成を簡単にし、FPGA のクリティカルパスの遅延を小さくすることができる。
PCI マスタ回路の出力用 FIFO は、データのクロックからの出力時間を確保するために、
出力信号は DFF を使用してラッチされている。そのため、PCI データ転送の終了時にデータ転送なしのディスコネクトをされると
IOB の DFF に残っているデータが消失する危険がある。この問題を回避するために PCI マ
スタ・ライト用 FIFO は、リワインド端子つ
きの FIFO を自作して使用した。
PCI バス・インターフェース回路の作成中に、ホスト PC のチップセットが変更になると、PCI バスの反応も異なり、PCI バス・インタ
ーフェース回路のバグが顕在化することが多かった。バグの発生する条件が限定的であるため、バグの原因を突き止めるのが困難であった。そのような場合は、シミュレーショ
ンで再現を試みた。それで再現しない場合は、検出回路を FPGA に内蔵し、FPGA 内蔵ロジ
ック・アナライザ (ChipScope) を使用してバグを特定した。このような場合は、バグの原因の特定が非常に難しい。

８．まとめ
本報告では、PCI バスの概要について述べた後、自作の PCI バス・インターフェース回路について述
べた。現在、PCI バス・インターフェース回路は、
Maestro2NI と Maestro3NI の PCI バス・インターフェースとして使用されている。PCI バス・インターフ
ェース回路のビット幅は 64 ビット、動作周波数は66 MHz である。理論上のスループットの最大値は528 Mbytes/sec である。

6.4 IO バッファ回路
IO バッファ回路は、PCI ターゲット回路および PCI
マスタ回路と FPGA チップのパッドの間にあるバッファ回路である。IOB 内の DFF を積極的に使用して、タイミング・バジェットを改善することもできる。

７．工夫および苦労した箇所について
PCI バス・インターフェース回路を実装する上で、工夫および苦労した箇所は以下の通りである。
1. PCI バス 66 MHz の仕様によると、入力信号のセットアップ時間は 3 nsec、出力信号のクロックからの出力時間は 6 nsec である。これは大変厳しい数値である。PCI バスの規格によると、入力信号を同じクロック内に判定する必要がある。この規格からすると、入力信号は必ず組み合わせ回路を通って DFF に入力する必要があるため、セットアップ時間を確保することが難しい。PCI バス・インター
フ ェ ー ス 回 路 で は 、 DCM (Digital ClockManager) を使用して、クロックの位相をシフ
トし、クロックからの出力時間の余裕をセッ
トアップ時間に割り振っている。それでもまだ、3 nsec の規格は満足しないが、動作には問題はない。

９．謝辞
Maestro2 および Maestro3 システムの開発に参加の機会を与えて頂いた、筑波大学システム情報工学研
究科コンピュータサイエンス専攻の和田耕一教授に深く感謝いたします。

参考文献[1] 小野雅晃, Maestro2 ネットワークインターフェースの開発, 筑波大学技術報告 25 (2005) 42-49.
[2] 小野雅晃, Maestro3 クラスタネットワーク用基板の設計, 筑波大学技術報告 27 (2007) 37-44.
[3] 滝誠一 他, PCI バスの詳細と応用へのステップ, CQ
出版社 OpenDesign No.7 (1995) 4-140.
[4] PCI SIG, PCI Local Bus Specification Revision 2.2, PCI
SIG (1998) 1-322.

'(

Implementation of PCI bus interface circuit by FPGA
Masaaki Ono
Academic Service Office for Systems and Information Engineering, University of Tsukuba,
1-1-1 Tennodai, Tsukuba, Ibaraki, 305-8573 Japan
A PCI (Peripheral Component Interconnect) bus interface circuit was developed for a network interface of a
dedicated cluster network called Maestro. The PCI bus interface circuit is implemented on FPGA (Field Programmable
Gate Array) and can handle PCI target transfer as well as PCI master transfer. Although the PCI target transfer of the
PCI bus interface circuit is limited for single transfer, the PCI master transfer supports burst transfer.
The operating frequency of the PCI bus is 66 MHz, the data widths are 64 bits, and the maximum theoreticalthroughput is 528 Mbytes/sec. The PCI bus interface circuit was designed and implemented without using commercial
IP (Intellectual Property). Currently, the PCI bus interface circuit is implemented on FPGA of the Maestro2 andMaestro3 network interface boards to connect the NI boards with the host personal computers.
Keywords: FPGA; PCI bus; Maestro')