FC2カウンター FPGAの部屋 OV9655でSXGAを表示1(FIFO容量の再検討)
FC2ブログ

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

FPGAの部屋

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

OV9655でSXGAを表示1(FIFO容量の再検討)

OV9655を使ってみる4(VGAの表示)”でOV9655でVGAを表示できたので、今度はSXGAを表示してみたい。

前回、”OV9655を使ってみる3(回路の書き換え)”で、Camera_Controller の動作クロックとVGA_Display_Controller のクロックを分離した。SXGAでは、Camera_Controller の動作クロック、つまり、OV9655のPCLKは48MHzで15fps、VGA_Display_Controller のクロックは108MHzとなる(VESA Signal 1280 x 1024 @ 60 Hz timingを参考にした)。
VGA_Display_Controller の動作クロックがVGAの25MHzから4倍にあがったので、DDR2 SDRAMコントローラの帯域がきつくなることが考えられる。それと、相対的なレイテンシも増加するので、VGA_Display_Controller やCamera_Controller のFIFO容量の考察が必要となる。

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路2(レイテンシの測定)”を参考に、現在のDDR2 SDRAMの動作クロック125MHzにおけるレイテンシを計算してみた。このレイテンシは、CMOSカメラのデータをSXGAに表示するだけではなく、この表示回路にCPUなどの付加回路を付けたときにでも、ディスプレイの表示が破綻しないことを目指す。
まずは、DDR2 SDRAMの動作クロックが125MHzの時の、DDR2 SDRAMコントローラにコマンドが入っていない状態(初期状態)でのWriteアクセスのレイテンシは、

87nsec * 150MHz / 125MHz = 104 nsec


となる。初期状態でのReadアクセスのレイテンシは、

147nsec * 150MHz / 125MHz = 176 nsec


となる。

リフレッシュによるレイテンシについて検証する。次のバーストのためにプリチャージしてACTコマンドを入れたときにリフレッシュが起きて、また同じACTコマンドを入れ直している場合は、150MHzの時に、180nsec のレイテンシが増加しているので、125MHzでは、

180nsec * 150MHz / 125MHz = 216nsec


となる。以前の150MHzの例を下図に示す。
BitMaped_VGA_Controller_6_090109.gif

ROWアドレスやバンクが異なる(つまりプリチャージ、ACTコマンドを入れなければならない)Write, ReadコマンドがFIFOに詰まっている場合のレイテンシについて検討してみる。下図に150MHzの場合を示す。
BitMaped_VGA_Controller_7_090110.gif

上図は、DDR2 SDRAMコントローラへのWrite, Read要求用のFIFOがFULLになったところのRead要求を入力してから、Readされた値がoutput_data に出てくるまでの時間を測定している。測定した時間は1340nsec だった。これを125MHzに変換すると、

1340nsec * 150MHz / 125MHz = 1608nsec


となる。以前は考慮しなかったが、最悪の場合として、リフレッシュによる増加分216nsec を加えると、1824nsec となる。これをVGA_Display_Controller の動作周波数108MHzの周期9.26nsec で割ると、197クロックになる。
非同期FIFOが半分の容量になったときに、VGA_Display_Controller はArbiterに表示データの要求を出すので、非同期FIFOの容量は197の倍の394深度となる。ということは、データ幅が16ビットのVGA_Display_Controller側(RGB444)では、512深度のFIFOを実装することにする。DDR2 SDRAMコントローラのデータ幅は32ビットなので、256深度だ。

次に、Camera_Controller のFIFOの容量を計算する。Camera_Controller は優先順位が最低なので、VGA_Display_Controller のバースト転送もレイテンシとして計算する。
Readアクセスのレイテンシ+128Readバーストの時間を計算する。VGA_Display_Controller のFIFOは半分の容量になったときに、半分の容量分のReadリクエストをDDR2 SDRAMコントローラに出す。それは、256バイトのRead要求なので、16ビット幅のDDR2 SDRAMでは、128ワードのReadアクセスとなるからである。128Readバースト時間は、

128 * 1/(250MHz) = 512 nsec


なので、これにリフレッシュによる増加分を加えて、728nsec となる。これに、DRR2 SDRAMコントローラのFIFOが最悪の条件でFULLになっている時のレイテンシ1608nsec を加えると、2336nsec となる。2336nsec をCamera_Controller の動作周波数48MHzの周期20.8nsecで割ると、112クロックとなる。よって、Camera_Controller のFIFOは8ビットデータ幅で128深度のFIFOとする。

DDR2 SDRAMのメモリ帯域をどのくらい占有するか計算してみると、DDR2-250なので、250MHz * 2バイト = 500MB/sec、VGA_Display_Controller では、108MHz * 1バイト = 108MB/sec、Camera_Controller では、48MHz * 1バイト = 48MB/sec なので、

((108MB/sec + 48MB/sec) / 500MB/sec) * 100 = 31.2%


の帯域を使用している。後の70%は、まだ帯域が残っている。VGA_Display_Controller もCamera_Controller もブランク期間があるので、もう少し帯域は抑えられるはずなので、まだCPUなどを付加する余裕があると思われる。
  1. 2011年01月25日 05:47 |
  2. OV9655
  3. | トラックバック:0
  4. | コメント:2

コメント

DDR メモリのバス帯域は、100%利用できない筈なので、注意してくださいね
コマンドのシーケンスの関係で、どうしても空きが発生すると思います
昔検討はしたことあるんだけど、地味な作業でしんどいですよ
  1. 2011/01/25(火) 22:18:44 |
  2. URL |
  3. アプロ #-
  4. [ 編集 ]

了解しました。
最後の70%も割合の話で、プロトコルによるロスは考慮のうちです。(だと思います)
上の計算しているレイテンシの値にはプロトコルによるロスも入っています。
  1. 2011/01/25(火) 22:31:40 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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