Open Design Computer Project

オリジナルCPUから作る本格的自作コンピューター

ユーザ用ツール

サイト用ツール


hardware:gci

GCI : General Device Connection Interface

仕様と特徴

基本的な高速IOデバイスを接続するためのIOインターフェイスです。GCIの特徴として以下の特徴を持ちます。

  • 最大31の高速デバイスを接続可能
  • 31デバイス全てに固有の割り込み番号を持つ
  • 接続されるデバイスに連続的なIO空間を提供
  • ホスト(CPU等)から接続されたそれぞれのデバイスの使用空間や機能・デバイスの詳細を取得可能
  • リセット後に自動的にデバイスが使用する空間を取得して動的にIO空間のマッピング

GCIはメインモジュールとノードモジュールに分かれています。すべての接続されるデバイスはGCIバス内部に持っているGCI-Nodeに接続され、すべてのGCI-NodeはGCI-Hubに接続されています。

  • GCI-Hub
    • プロセッサとGCI Nodeとのプライオリティコントロールを行い、各デバイスの占有アドレス空間などを保持します。割り込みコントロールもこのモジュールが担当します。GCI-HubモジュールはプロセッサのIOポート(メモリマップド)に必ず1つだけ接続される必要があります。
  • GCI-Node
    • 各標準デバイスに対して必ず1つのGCI Nodeモジュールが接続されます。GCI NodeはGCI Hubに1対1で接続されます。汎用デバイスと接続するための共通ポートの役割をします。

GCI1.1では最大4つのGCI Node(標準デバイス)をサポートします。

リセット後の挙動

GCI Hubは、GCI-Nodeから占有メモリ領域などの必要情報をロードします。その処理が完了するまで、プロセッサ、またはほかのバスマスタからIOデバイスのへのアクセスは一切禁じられます(BUS_BUSYになります)。 GCI-NodeからGCI-Hubに対する必要情報のロードは、リセット直土に開始されますが、512GCI-Cycle以内に応答がない場合、そのデバイスは未接続として扱われます。

GCI-Nodeから必要情報のロードが完了するか、512GCI-Cycle以内に反応がなかった時、GCI-Hubは接続されるホスト(MIST32 CPU)のIOコントローラ(PIC)に専有アドレス空間サイズを返します。

GCI Devices

GCI Address Map

GCI IO空間全体

GCI のアドレス空間は以下のように配置されます。

以下、単位はByteとします。

0~1023GCI Hub 空間
1024~GCI Node 空間
1024~2047GCI Node 情報 1
2048〜n1(可変長)GCI Device 空間 1
2048+n1〜3071+n1GCI Node 情報 2
3072+n1〜n2(可変長)GCI Device 空間 2
3072+n1+n2〜4095+n1+n2GCI Node 情報 3
4096+n1+n2〜n3(可変長)GCI Device 空間 3
GCI Node 情報 4
GCI Device 空間 4

GCI Hub空間

開始アドレス: IOSR + 0x200, 使用領域: 1024 (0x400) byte

以下、単位はByteとします。

0~3GCI総デバイス数
4~7GCI全占有アドレス空間サイズ(Byte単位)
8~FF予約
100~103GCI-Node1メモリ占有空間量(32bit)
104~107GCI-Node1アクセスプライオリティ(8bit)
108~11F予約
120~123GCI-Node2メモリ占有空間量(32bit)
124~127GCI-Node2アクセスプライオリティ(8bit)
128~13F予約
140~143GCI-Node3メモリ占有空間量(32bit)
144~147GCI-Node3アクセスプライオリティ(8bit)
148~15F予約
160~163GCI-Node4メモリ占有空間量(32bit)
164~167GCI-Node4アクセスプライオリティ(8bit)
168~3FF予約

GCI Node空間

開始アドレス: IOSR + 0x600, 使用領域: 1024 + (可変長)

各 GCI Node は以下の領域を持ちます。

以下、単位はByteとします。

0~1023GCI-Node情報
1024~nGCI-Device空間

GCI Node情報

使用領域: 1024 byte

この領域はGCI HubやCPUによって制御されたり、標準デバイスがプロセッサに知らせるべき設定などの情報が格納されます。

以下、単位はByteとします。

0~3GCIND_DUSDevice Use Size 使用アドレス空間量(Byte)
4~6Reserved
7GCIND_IPF割り込み時の優先度フラグ
[31:8]Reserved
[7:0]Priority
8~BGCIND_IRF割り込みフラグ
[31:30]0:Device 1:GCI-Bus Master 2,3:Reserved
[29:0]Interrupt Infomation Code
C~FGCIND_DSFDevice Support Flags
10~13GCIND_BMDABus Master : Device Address
14~17GCIND_GNBMMABus Master : Memory Address
18~1BGCIND_GBMSTTBus Master : Bus Master Start
[31]Direction 0:Dev→Mem 1:Mem:Dev
[30]0:Ended Interrupt 1:Interrupt disable
[29:0]Data Length(Word Address)
1C~1FBus Master : Reserved
20~23Bus Master : Reserved
24~2FReserved(将来の拡張領域)
30~33GCI???[31:16]GCI Node Product ID
[15:0]GCI Node Device Vendor ID
34~37GCI???Device Crass[31:0]
38~3FFReserved(将来の拡張領域)

GCI-Device

GCI-Device 空間は最低でも4Byteアドレス空間を必要とします。

Word(32bit) 境界でデバイスがマッピングされます。

Bus Master

Bus Master : Start Conditionレジスタへの書き込みでDMA動作が開始されます。このレジスタに書き込みの際に転送終了後に割り込みを起こさないようにするには(転送完了をポーリングで見る場合は)1を書き込む必要があります。このレジスタにライトを行う前に、GCI Node空間の10~1Bのアドレスにマップされたレジスタへのライトが必要です。

転送が終了すると、Start Conditionレジスタに0を書き込んだ場合はデバイスからの割り込みを起こします。この際の割り込み番号はGCI-Nodeの割り込み番号がそのまま適用されるため、プログラム側で、まず割り込み要因フラグ(GCI Node空間8~B)を見て、割り込みが確認できない場合、バスマスタの割り込みと判断して20~23のバスマスタフラグレジスタを参照することで、バスマスタの動作が完了したか確認可能で、このレジスタが1の時にリードする事によって一連のバスマスタ動作を完了します。

Start Conditionに1を書き込んだ場合は、割り込みが発生しないので常に20~23のバスマスタフラグレジスタを参照しなくてはなりません。このレジスタが1の時にリードする事によって一連のバスマスタ動作を完了します。

GCI1.0(製作中)

GCI1.0の各種インターフェイス詳細

GCI1.0では、最大4つのデバイスを接続可能です。なお、接続は連番である必要があります。

ポートリスト規則

例1 リセット端子

input		inRESET,
inRESET
このモジュールへの入力であることを示すネガティブエッジであることを示す実際の信号名

例1 IO端子

inout		ioMEM_DATA,
ioMEM_DATA
このモジュールはIO端子であることを示す実際の信号名

GCI-デバイス間ポートリスト

//Valid
input			iDEV_VALID,
//Input
input			iDEV_REQ,			
output			oDEV_BUSY,
input	[31:0]		iDEV_DATA,
//Output
output			oDEV_REQ,			
input			iDEV_BUSY,
output			oDEV_DD,
output	[31:0]		oDEV_ADDR,
output	[31:0]		oDEV_DATA,
//IRQ
input			iDEV_IRQ_REQ,			
output			oDEV_IRQ_BUSY,
input	[23:0]		iDEV_IRQ_DATA,

上記ポートリストは、GCIモジュール側の状態なためデバイス側は入出力が反転します。

Valid

iDEV_VALIDリセット時該当のデバイスが使用されるか・されていないかを示す。デバイスを接続せず、GCIから出ているデバイスIFを無効にするにはこのピンを0にする

Input

iDEV_REQ同期アクティブになると、下記Input側のデータを受け取る。デバイス側はCPUまたはほかのマスタデバイスからの要求に対して何らかのレスポンスを送る際にこのラインをアクティブにする
oDEV_BUSY-GCIは、GCI側が何らかの理由でBusyになるとこのラインをアクティブにする。このラインがアクティブの際、iDEV_REQをアクティブにしてはならない(アクティブにした場合無視される)
iDEV_DATA-リードの際、レスポンスとしてデータが返る。ライトの場合、0のデータがレスポンスとして出力される。GCIは、これらレスポンスをiDEV_REQがアクティブの際に取得する

Output

oDEV_REQ同期GCIからデバイスに対してリード・ライトの要求を行うとき、このラインがアクティブになる。ただし、oDEV_REQアクティブと同時にデバイス側がiDEV_BUSYをアクティブにした場合、復帰するまですべての動作は停止する
iDEV_BUSY-デバイス側がこのラインをアクティブにした場合、GCIはすべての動作を停止する
oDEV_DD-DataDirectionの略で、GCIがデバイスに対してリード・ライトどちらを要求しているかを示ライン。デバイスに対してアクティブの場合リード、ネガティブの場合ライトとなる
oDEV_ADDR-GCI側でメモリマップドIOから、IOの実アドレスへの返還が行われ、デバイスの実アドレス空間を示す。
oDEV_DATA-デバイスに対して書き込みの場合、書き込むべきデータが示される。リードの場合、常に0となる。(デバイス側は0でリードされない場合割り込みを発生させる)

IRQ

iDEV_IRQ_REQ同期デバイスがGCIに対して割り込みを要求した際、このラインがアクティブとなる。デバイスははoDEV_IRQ_BUSYがアクティブのとき、アクティブにしていても無視される
oDEV_IRQ_BUSY同期GCIが割り込み要求を受けたとき、このラインをアクティブにする。なお、このラインがアクティブになるのは、実際にCPUに割り込みが送られた時ではなく、GCIの割り込みQueueに登録された時となる。
iDEV_IRQ_DATA-デバイスが割り込みを発生した際、24ビットの情報をCPUに対して送信することができる。この情報は割り込みがCPUに転送され、割り込みベクタに入る最にシステムレジスタ???????????に自動的に格納される。なお上位8bitは割り込みを起こしたデバイスIDが自動的GCIにて追加される

GCI-CPU間ポートリスト

//Input
input			iCPU_REQ,	
output			oCPU_BUSY,
input			iCPU_DD,
input	[31:0]		iCPU_ADDR,
input	[31:0]		iCPU_DATA,
//Output
output			oCPU_REQ,	
input			iCPU_BUSY,
output	[31:0]		oCPU_DATA,
//IRQ
output			oCPU_IRQ_REQ,
input			iCPU_IRQ_BUSY,
output	[31:0]		oCPU_IRQ_DATA,

上記ポートリストは、GCIモジュール側の状態なためCPU側は入出力が反転します。

Input

iCPU_REQ同期CPUからデバイスへの要求を受けるときアクティブになる。GCIはoCPU_BUSYがアクティブな時この要求は無視される
oCPU_BUSY-現在何らかのIO処理を行っていて、そのレスポンスを待っている状態にある。またはリセット直後でありイニシャライズをしている。これらの状態のとき、CPUからのリクエストは無視される
iCPU_DD-CPUからの要求が、デバイスに対してリードか、ライトかを示すラインである。アクティブな時、デバイスに対してリードを要求し、ネガティブのときはライトを要求している。
iCPU_ADDR-メモリ空間のうち、0から始まるIOにマッピングされたアドレスラインである。GCI内部で、このアドレスから宛先ノード・アドレスに変換する。
iCPU_DATA-要求が書き込みの場合、下記尾まれるべきデータが乗る。読み込みの場合、常にこのラインは0となる(0以外は物理的にないという判断をする。0以外が来ても例外を起こさず、問題なく動作を保証する)

Output

oCPU_REQ同期アクティブになったとき、CPUから要求された要求を完了したことを知らせる。リードの際、oCPU_DATAに読み込んだデータが乗る。CPU側がiCPU_BUSYをアクティブにした場合この要求は無視されるためすべての処理を待機する
iCPU_BUSY-CPU側が、レスポンスの受け取りを一時的に拒否する際にアクティブにする。
oCPU_DATA-リードの場合、デバイスからリードされたデータが乗る。ライトの場合、このラインは常に0になる

IRQ

oCPU_IRQ_REQ同期GCIに接続されたデバイスのうちいずれかが割り込みを起こした際にアクティブになる。なお、iCPU_IRQ_BUSYがアクティブの場合、iCPU_IRQ_BUSYがネガティブになるまで常にアクティブであり続ける
iCPU_IRQ_BUSY-CPU側が一時的に割り込みを拒否している。
oCPU_IRQ_DATA-割り込みを起こしたノード番号が上位8byte残り3Byteはデバイス側から割り込み要因をCPUに伝えるための目的で使用する。このデータは割り込みベクタに入る最にシステムレジスタ???????????に自動的に格納される。

GCI1.1(計画中)

GCI1.0の各種インターフェイス詳細

GCI1.1では、デバイス接続数に制限はありません。しかし、接続されるデバイスは連番である必要があります。

GCI1.1ではDMAに対応します。DMAに対応するため、リセット時に対応フラグを見る必要があります。

hardware/gci.txt · 最終更新: 2013/10/02 22:21 by takahiro