FC2カウンター FPGAの部屋 2011年08月25日
FC2ブログ

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

FPGAの部屋

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

Spartan-3A Starter KitでEDKを使ってカメラ表示6(PLBV46 Master Burstのバースト転送)

Spartan-3A Starter KitでEDKを使ってカメラ表示5(PLBV46 Master Burstのシングル転送)”の続き。

前回はシングル転送だったが、今回はバースト転送について見ていきたい。

Fixed Length Burst Read Operation
PLBV46 Master Burst(v1.01a) のFigure 7: Fixed Length Burst Read Timingから引用させていただいた。
Spa3A_SKit_OV7670_50_110825.png

()内はどちらの回路がドライブするかを示す。

1.IP2Bus_Mst_Typeを1(バースト転送)、IP2Bus_MstRd_Reqを1(Read)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_Lengthに転送長(バイト単位)を出力、IP2Bus_MstRd_Reqを1にする。IP2Bus_Mst_BEのバイト・イネーブルは何でも良い。(ユーザー回路)

2.Bus2IP_Mst_CmdAckが1になると、IPICコマンド転送終了。(IPIC) ユーザー回路はコマンド信号をディアサートする。(ユーザー回路)

3.最初の有効なReadデータの最初でBus2IP_MstRd_sof_nが0にアサートされている。その時、Bus2IP_MstRd_REMはオール0の様だ。多分4バイト境界のアドレスからReadしていると思われる。
同時にBus2IP_MstRd_dにReadデータが出力され、Bus2IP_MstRd_src_dsc_nが0になり、Readデータが有効なことを示す。(IPIC)

4.ユーザー回路で、IP2Bus_MstRd_dst_rdy_nが0にすでにアサートされているので、Bus2IP_MstRd_src_dsc_nが0になった最初のクロックで、Bus2IP_MstRd_dのReadデータがユーザー回路に読み込まれる。

5.次のクロックから、次のReadデータがBus2IP_MstRd_dに出力される。Bus2IP_MstRd_src_dsc_nが0でかつIP2Bus_MstRd_dst_rdy_nが0の時に、ユーザー回路に読み込まれる。どちらか1つでも1だと、Bus2IP_MstRd_dに出力されたReadデータは次のクロックまで保持される。

6.この場合は、IP2Bus_Mst_Lengthが020だったので、32バイトの転送だった、バス幅が32ビットなので、1回の転送に4バイト送れるので、転送長は8バーストになる。最後のReadデータの時に、Bus2IP_MstRd_eof_nが0にアサートされる。同時に、Bus2IP_MstRd_REMにも有効な値が出力される。(IPIC)

7.最後のReadデータ転送の次のクロックで、Bus2IP_Mst_Cmpltが1にアサートされて転送終了が宣言される。(IPIC)



Fixed Length Burst Write Operation
PLBV46 Master Burst(v1.01a) のFigure 8: Fixed Length Burst Write Timinから引用させたいただいた。
Spa3A_SKit_OV7670_51_110825.png

()内はどちらの回路がドライブするかを示す。

1.IP2Bus_Mst_Typeを1(バースト転送)、IP2Bus_MstWr_Reqを1(Write)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_BEにバイト・イネーブルを出力して、IP2Bus_MstRd_Reqを1にする。(ユーザー回路)

2.1.と同時に(でなくても良いと思うが)IP2Bus_MstWr_dにWriteデータを出力し、IP2Bus_MstWr_REMはマスク(1でマスク、0で有効なデータ)を出力する。IP2Bus_MstWr_sof_n、IP2Bus_MstWr_src_rdy_nを0にアサートする。(ユーザー回路)

3.IPICがBus2IP_MstWr_dst_rdy_nを0にアサートするまで、最初のWriteデータ(IP2Bus_MstWr_d)と、IP2Bus_MstWr_sof_nのアサートを継続する。

4.IPICがBus2IP_MstWr_dst_rdy_nを0にアサートしたら、次のWriteデータ(IP2Bus_MstWr_d)を次のクロックで出力する。IP2Bus_MstWr_src_rdy_nとBus2IP_MstWr_dst_rdy_nが同時にアサートされたときにWriteデータ転送が有効になる。同時にアサートされない場合は、次のクロックも同じWriteデータを出力する。(ユーザー回路)

5.コマンド転送終了時に、IPICがBus2IP_Mst_CmdAckが1にアサートするので、そうしたらユーザー回路はコマンド信号をディアサートする。

5.最後のWriteデータ転送、この場合は8バースト目でIP2Bus_MstWr_eof_nをユーザー回路が0にアサートする。これのWriteデータ転送が有効になったら、バーストWrite転送は終了となる。

6.バーストWrite転送が終了した次のクロックで、IPICによってBus2IP_Mst_Cmpltが1にアサートされて、バーストWrite転送が完了する。


次は、これを元に今までのCamera Controller、Display Controller とのラッパー回路を作成する。
どちらも、シングル転送はなしで、バースト転送のみで処理を行うようにしようと思う。バースト転送は2から16バーストだ。
640*480/2/16 = 9600で割り切れるので、16バースト転送のみにしようと思う。16個32ビットデータが溜まったら、バースト転送コマンドを発行してバースト転送を行う。(/2はピクセル・データが16ビットなので、32ビットの半分だから、/16は16バースト転送)
連続アドレスになるはずなので、MPMCが効率的にデータを処理することができると思う。

  1. 2011年08月25日 05:33 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0