FC2カウンター FPGAの部屋 FWFTモードのBlock RAM使用した非同期FIFOのrd_data_countについて
FC2ブログ

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

FPGAの部屋

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

FWFTモードのBlock RAM使用した非同期FIFOのrd_data_countについて

Block RAMを使用した非同期FIFOのrd_data_countについては、信用しないほうが良いようです。基本的には、emptyとalmost_emptyを使用するか、もしくは、rd_data_countとempty, almost_emptyを組み合わせたほうが良いと感じました。

非同期FIFOは、FIFO Generator 8.1で生成されていて、Write Width:32, Write Depth:71, Read Width:128, Write Depth:17の幅の違うFIFOです。RD_DATA_COUNT、empty, almost_emptyを出力させています。
FWFT_AFIFO_1_110715.png

Verilogファイルでのインスタンスを下に示します。

    assign cam_rgb_data = {{8{1'b0}}, cam_red, cam_green, cam_blue};
    // MIGとの接続用非同期FIFO
    cam2mig_fifo cam2mig_afifo_inst (
        .wr_clk(clk_cam),    // input wr_clk
        .wr_rst(reset_cam | ~frame_valid_1d),     // input wr_rst
        .rd_clk(clk_ddr2),     // input rd_clk
        .rd_rst(reset_ddr2 | ~frame_v_1d_ddr2_2),     // input rd_rst
        .din(cam_rgb_data),            // input [31 : 0] din
        .wr_en(cam_data_ena & capt_ena),         // input wr_en
        .rd_en(data_enable),         // input rd_en
        .dout(data_out),         // output [127 : 0] dout
        .full(cmfifo_full),         // output full
        .almost_full(cmfifo_almost_full), // output almost_full
        .overflow(cmfifo_overflow), // output overflow
        .empty(cmfifo_empty),         // output empty
        .almost_empty(cmfifo_almost_empty), // output almost_empty
        .underflow(cmfifo_underflow), // output underflow
        .rd_data_count(cmfifo_rd_data_count) // output [3 : 0] rd_data_count
    );


cmfifo_rd_data_countが2以上だったらcam2mig_fifo から2個ずつデータを読んでいます。
全体で1回分、つまり2このデータが少ないようなのです。なぜなんだろう?と思って調べていましたが、原因がわかりました。
下がcam2mig_fifoのシミュレーション波形です。
FWFT_AFIFO_2_110715.png

黄色の点線のカーソルのところで、cmfifo_rd_data_countが1になって、すぐに黄色の実線のカーソルで0に戻っています。黄色の実線で、cmfifo_emptyが0に落ちています。つまり、rd_data_countは、FWFTモードFIFO内部のFIFOモジュールのrd_data_countで、FIFO全体のrd_data_countと思って使用するのは危険なんじゃないかな?と思います。
次に、上のシミュレーション波形の次を下に示します。
FWFT_AFIFO_3_110715.png

cmfifo_almost_emptyでも同様の動作になって、その次の時にrd_data_countが1になりました。これでは、rd_data_countの値を見て制御していると、2個データが残ってしまうことになります。

emptyとalmost_emptyを見て制御するように変更しようと思います。
これからは、少なくともFWFTモードのBlock RAM使用した非同期FIFOのrd_data_countは、必ずしも正しくないと考えて制御回路を作る必要がありそうです。

(2011/07/19追記)
コメントでieee1394さんに教えていただいたのですが、非同期FIFOでFWFTモードの場合は、Use Extra Logic For More Accurate Data Countsのチェックボックスにチェックを入れる必要があるそうです。
FWFT_AFIFO_4_110719.png

これで、FIFOのIPを再生成して、シミュレーションしてみました。
FWFT_AFIFO_5_110719.png

確かに、emptyやalmost_emptyに関連して変化するようになったのですが、振動しているところがあります。黄色の点線のカーソルの辺りをズームしてみました。
FWFT_AFIFO_6_110719.png

emptyやalmost_emptyから1クロック遅延していることがわかりました。やはり、emptyやalmost_emptyで制御したほうが良さそうです。
  1. 2011年07月15日 17:32 |
  2. Core Generator
  3. | トラックバック:0
  4. | コメント:2

コメント

はじめまして.いつも非常に参考にしております.
私も1ヶ月ほど前、同じ問題で悩んだのですが、FWFTで非同期の場合、Use Extra Logic For More Accurate Data Countsを有効にする必要があるようです.
UG175 FIFO Generator v8.1を参考にしました.
ご参考になればさいわいです.
  1. 2011/07/15(金) 23:51:03 |
  2. URL |
  3. ieee1394 #-
  4. [ 編集 ]

ieee1394さん、初めまして。
情報ありがとうございました。火曜日にやってみて、結果を追加します。
  1. 2011/07/17(日) 03:59:59 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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