FC2カウンター FPGAの部屋 PCIモジュール3
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

PCIモジュール3

今度はPCIマスタモジュールだ。
PCIマスタのアクセスはPCIモジュール2で大体説明してあるが、PCIマスタ書き込みの場合、マスタ(パソコンのCPU)が/REQをアサートする。アービタが/GNTをアサートするとマスタはバスを使えるので、/FRAMEと/IRDYが両方デアサートされるのを待って(バスが空くのを待って)、/FRAMEをアサートしながらアドレスを出力する。マスタは/FRAMEをアサートした後にデータの準備が出来たら/IRDYをアサートする。ターゲット(PCIボード)は/FRAMEがアサートされるときのアドレスを確認して、自分のアドレスだったら/DEVSELをアサートする。その後データを受け取る準備が出来たら/TRDYをアサートする。
/IRDYと/TRDYの両方がアサートされたときがデータが書き込まれたタイミングである。
私のPCIマスタはバーストアクセスができるので、PCIマスタのFIFOにデータがある限り最後のデータ転送の1つ前まで/FRAMEをアサートし続ける。当然/IRDYはアサートし続ける。/IRDYを制御しないほうがロジックが少なくなるし、他のPCIアクセスを阻害しなくなるので、転送効率的に有利になる。
バーストアクセスを続けて行える条件は/GNTがずっとアサートされているか、もしくはレイテンシタイマがタイムアウトするまでだ。パソコンの起動時にBIOSがこちらのコンフィギュレーションスペースのレジスタの値を元にレイテンシタイマの値をセットする。PCIマスタモジュールは最初にPCIデータアクセスを始める時にレイテンシタイマの値をカウンタにコピーする。PCIマスタモジュールは1データ転送するごとにレイテンシタイマのコピーを-1する。そして0になったらタイムアウトする。タイムアウトした状態で/GNTがデアサートされているとPCIマスタはPCIデータ転送を止めなければならない。
PCIマスタアクセスのメインステートマシンはPCI2.2仕様書のステートマシンに大体同じなので書かないことにする。興味のある方はPCI Local Bus Specification Revision 2.2の245ページを見てほしい。
PCIのデータの出力はクロックからの出力時間が厳しいこともあり、なるべくならばIOB内のフリップフロップから出力したい。ので、データ出力用FIFOの後にIOBのFF、その後パッドに出力する。だがそうするとPCIターゲットがデータ転送なしに/STOPをアサートして終了(データ転送なしのディスコネクトでした)した時などにIOBのFFにデータが残ってしまう。その後に他のPCIマスタアクセスがあると最初のアドレスが狂ってしまう。そのためデータ出力用FIFOにはリワインドを設けてある。
IOB付近のデータパスを下に示す。
PCI_module_block_060110.png

今見ても、結構複雑だ。
ちなみにこれは最初のブロック図ですのでバグがあるかもしれません。ご了承ください。基本的なコンセプトは一緒ですが。。。
  1. 2006年01月10日 21:20 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:5

コメント

このブロック図って、そのままパクって使えちゃいそうですね。
納品向けのドキュメントですか?
  1. 2006/01/11(水) 00:25:30 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

うちは企業でないので納品はありません。詳細な内部使用というか、自分の回路を忘れないための資料があってその一部です。
ちなみにこれだけではPCIマスタ回路できないですし、これを見て作れれば最初からPCIマスタを作れる人だと思います。あくまで他人の作ったPCIの回路はこうなっているんだ、私のほうが賢いというふうに見てください。
PCI-X作ったI倉氏の記事がDWMに載ってましたが、もっとパイプライン化してたと思います。PCI-X133MHzはもっと徹底的にやらないとできないですね。
  1. 2006/01/11(水) 06:15:52 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

納品用でないとなると、なおさらスゴイですよ。
自分用にここまでしっかりしたブロック図は僕には恥ずかしながらなかなか書けません。
結局HDLで回路が記述できるとは言っても、全体のつながりはこんな感じの絵を描かないとなかなか分かりづらいですね。
  1. 2006/01/11(水) 21:58:08 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

回路はブロック図を描いてから作ってます。HDL書き始めてしまうと、わけがわからなくなってしまうので、大体文章が先です。書いていると頭の中も整理されるように感じます。結局、書いたほうが時間がかからないのではないかと思います。
  1. 2006/01/11(水) 22:25:44 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

>書いたほうが時間がかからないのではないかと思います。
賛成です。並列動作やパイプラインは何らかの図を書かないとムリですね。
僕はソースにテキストで波形をガリガリ書くようにしてます。
最低限のドキュメント…
  1. 2006/01/12(木) 00:19:34 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/123-e1f3dc72
この記事にトラックバックする(FC2ブログユーザー)