Spartan-6内蔵EndPointBlockのフローコントロール
Spartan-6のPCI Express内蔵EndPoint Block(以下、ハードマクロ)を使って作るデザインで、メモリライト時のフローコントロールの機能を作っています。
ハードマクロは受信したデータがあるとtrn_rsof_nをLにアサートして最初のDWを出力します。これに対してラッパがtrn_rsof_nをLにすれば続きのデータが出力されてくるのですが、ハードマクロのtrn_rdst_nという信号をHにするとWAITをかけることができます。
こうすると、ハードマクロ(とセットになったBlockRAM)の中に受信パケットがどんどんたまっていくようになるので、ユーザ回路に対する出力をWAITすることができます。なお、PCI Expressの仕様上のフローコントロールはハードマクロでやってくれているので、ラッパがWAITをかけた場合でも実際には受信は行われていると思われます。そして、BlockRAMがいっぱいになると、PCIeの仕様上のフローコントロールが効いて、データの送出がとまるのでしょう。
実際にやってみました。
まずは、通常時のWAITなしの波形です。

SOF→EOF・・SOF→EOFの繰り返しが見えています。
パケットの継ぎ目を拡大するとこのようになっています。
フローコントロールを効かせた場合はこうなります。
SOFがアサートされたフレームが伸びるのがややこしいですが、最初の1DWだけ出て後続のDWの出力が待たされています。

trn_rdst_rdy_nというのは、ハードマクロから見たユーザ回路(つまりラッパ)の準備ができていないことを示す信号です。これがあがっていると、ハードマクロは次のデータを送ってこれなくなります。
このようにtrn_rdst_rdy_nを制御するのですが、trn_rdst_rdy_nの遷移するタイミングはハードマクロの動作する62.5MHzに同期していなければなりません。また、パケットを受信している期間を避けなければなりません。パケットの受信期間中にtrn_rdst_rdy_nをアサートすると、いろいろあってブルー画面に至り、危険です。
書き込みに時間がかかるメモリへのインタフェースなどができるようになります。
| 固定リンク




コメント