FC2カウンター FPGAの部屋 Virtex4のFIFO(FWFTモード)
FC2ブログ

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

FPGAの部屋

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

Virtex4のFIFO(FWFTモード)

今度はVirtex4のFIFOのFWFT(First Word Fall Through)モードについて考察してみたい。
FWFTモードはemptyが0になった時にdo(data out)に最初のデータが出ているモードだ。バーストする場合はこのモードのほうが私は作りやすいのでVirtex2などの時もなるべくFWFTモードのFIFOを自作して使っていた。DDR SDRAMのFIFOもすべて分散RAMプリミティブを使ってFWFTモードのFIFOを構成している。特にアドレスFIFOはバーストできるかどうかを判定するために次のアドレスがわかるようになっている。
Virtex4ではFIFOプリミティブにFWFTモードを設定できるので便利だ。
FWFTモードのFIFOプリミティブをインスタンスしてModelSimで見てみよう。
最初にVerilog2001で作ってみたがうまく行かなかった。どこが悪いのかわからないが、わかる方教えてください。

module FIFO16_test(almostempty, almostfull, do, dop, empty, full, rdcount, rderr, wrcount, wrerr, di, dip, rdclk, rden, rst, wrclk, wren);

output wire almostempty, almostfull;
output wire [31:0] do;
output wire [3:0] dop;
output wire empty;
output wire full;
output wire [11:0] rdcount, wrcount;
output wire rderr, wrerr;
input wire [31:0] di;
input wire [3:0] dip;
input wire rdclk, rden;
input wire rst;
input wire wrclk, wren;

FIFO16 #(
    .ALMOST_FULL_OFFSET(12'h000),
    .ALMOST_EMPTY_OFFSET(12'h000),
    .DATA_WIDTH(36),
    .FIRST_WORD_FALL_THROUGH("TRUE")
) FIFO16_inst (
    .ALMOSTEMPTY(almostempty),
    .ALMOSTFULL(almostfull),
    .DO(do),
    .DOP(dop),
    .EMPTY(empty),
    .FULL(full),
    .RDCOUNT(rdcount),
    .RDERR(rderr),
    .WRCOUNT(wrcount),
    .WRERR(wrerr),
    .DI(di),
    .DIP(dip),
    .RDCLK(rdclk),
    .RDEN(rden),
    .RST(rst),
    .WRCLK(wrclk),
    .WREN(wren)
);
endmodule


やはり慣れているVHDLでやるとうまく行く。でもなぜだか?ALMOST_FULL_OFFSETとALMOST_EMPTY_OFFSETをコメントアウトしないとうまく行かなかった。

library ieee;
use ieee.std_logic_1164.all;

Library UNISIM;
use UNISIM.vcomponents.all;
-- <--Cut code below this line and paste into the architecture body-->
-- FIFO16: Virtex-4 Block RAM Asynchrnous FIFO
-- Virtex-4 User Guide
entity FIFO16_test is
    port(
        ALMOSTEMPTY : out std_logic; -- 1-bit almost empty output flag
        ALMOSTFULL : out std_logic; -- 1-bit almost full output flag
        DO : out std_logic_vector(31 downto 0); -- 32-bit data output
        DOP : out std_logic_vector(3 downto 0); -- 4-bit parity data output
        EMPTY : out std_logic; -- 1-bit empty output flag
        FULL : out std_logic; -- 1-bit full output flag
        RDCOUNT : out std_logic_vector(11 downto 0); -- 12-bit read count output
        RDERR : out std_logic; -- 1-bit read error output
        WRCOUNT : out std_logic_vector(11 downto 0); -- 12-bit write count output
        WRERR : out std_logic; -- 1-bit write error
        DI : in std_logic_vector(31 downto 0); -- 32-bit data input
        DIP : in std_logic_vector(3 downto 0); -- 4-bit partity input
        RDCLK : in std_logic; -- 1-bit read clock input
        RDEN : in std_logic; -- 1-bit read enable input
        RST : in std_logic; -- 1-bit reset input
        WRCLK : in std_logic; -- 1-bit write clock input
        WREN : in std_logic -- 1-bit write enable input
    );
end FIFO16_test;

architecture RTL of FIFO16_test is
begin
    FIFO16_inst : FIFO16
    generic map (
--        ALMOST_FULL_OFFSET => X"000", -- Sets almost full threshold
--        ALMOST_EMPTY_OFFSET => X"000", -- Sets the almost empty threshold
        DATA_WIDTH => 36, -- Sets data width to 4, 9, 18, or 36
        FIRST_WORD_FALL_THROUGH => TRUE) -- Sets the FIFO FWFT to TRUE or FALSE
    port map (
        ALMOSTEMPTY => ALMOSTEMPTY, -- 1-bit almost empty output flag
        ALMOSTFULL => ALMOSTFULL, -- 1-bit almost full output flag
        DO => DO, -- 32-bit data output
        DOP => DOP, -- 4-bit parity data output
        EMPTY => EMPTY, -- 1-bit empty output flag
        FULL => FULL, -- 1-bit full output flag
        RDCOUNT => RDCOUNT, -- 12-bit read count output
        RDERR => RDERR, -- 1-bit read error output
        WRCOUNT => WRCOUNT, -- 12-bit write count output
        WRERR => WRERR, -- 1-bit write error
        DI => DI, -- 32-bit data input
        DIP => DIP, -- 4-bit partity input
        RDCLK => RDCLK, -- 1-bit read clock input
        RDEN => RDEN, -- 1-bit read enable input
        RST => RST, -- 1-bit reset input
        WRCLK => WRCLK, -- 1-bit write clock input
        WREN => WREN -- 1-bit write enable input
    );
end RTL;


最初にISEでインプリメントしてFPGA Editorで見てみた。そうするとFIFO16というプリミティブが1個インスタンスされていた。FIFO16というモジュールがVirtex4には入っているようだ。(下の図)
FIFO16_1_060708.png

さらにModelSimで動作を見てみるとemptyが0になった時にdo(データ出力)に最初のデータが出ているので、間違いなくFWFTモードになっているようだ。次にレイシテンシだが、wrenを1にしてFIFOに書き込んでからちょうど4クロックでデータが出てきている。完全にパイプライン化されているようである。
FIFO16_2_060708.png

最後のコアジェネレータのFIFOジェネレータでもFWFTモードを指定できるようになっているようだ。(下図参照、ピンクで囲んだ部分がFWFTモードを指定できるFIFO、Virtex4の場合) Spartan3でもやってみたが、BlockRAMと分散RAMのFWFTモードのFIFOをジェネレートできるようだ。これでVirtex4でなくてもFWFTモードのFIFOを使えるようになるのでとてもうれしい。
FIFO16_3_060708.png

  1. 2006年07月08日 18:36 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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