論理回路デザイン
ArchiTek home page
Threshold対応FIFO

コード(RTL)

/* **************************** MODULE PREAMBLE ********************************

        Copyright (c) 2011, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
*/

// ***************************** MODULE HEADER *********************************

module fifo (
        iVld,
        iStall,
        iData,

        oVld,
        oStall,
        oData,

        thresh,                 // Threshold, Trigger信号はいずれの側にも使用可能
        trig,                   // 複数必要な場合はセットで追加する

        reset,
        clk

        );

// ************************ PARAMETER DECLARATIONS *****************************

        parameter               W       = 32;           // Data Length
        parameter               DR      = 2;            // Depth Radix

        parameter               D       = 1<<DR;

// *************************** I/O DECLARATIONS ********************************

        input                   iVld;
        output                  iStall;
        input   [W-1:0]         iData;

        output                  oVld;
        input                   oStall;
        output  [W-1:0]         oData;

        input   [DR-1:0]        thresh;
        output                  trig;

        input                   reset;
        input                   clk;

// ************************** LOCAL DECLARATIONS *******************************

        reg                     iStall;
        wire                    iStallD;

        reg                     oVld;
        wire                    oVldD;

        reg     [DR:0]          iPtr;
        wire    [DR:0]          iPtrD;

        reg     [DR:0]          oPtr;
        wire    [DR:0]          oPtrD;

        reg     [W-1:0]         oData;

        wire    [DR:0]          diffD;
        wire                    trigD;
        reg                     trig;

        wire                    iAlloc          = iVld & !iStall;
        wire                    oAlloc          = oVld & !oStall;

        reg     [W-1:0]         mem[0:D-1];

// ****************************** MODULE BODY **********************************

// -----------------------------------------------------------------------------
// Data FIFO
always @(posedge clk)
        if (iAlloc & (iPtr[DR-1:0] == oPtrD[DR-1:0]))
                oData           <= #1 iData;
        else if (!oStall)
                oData           <= #1 mem[oPtrD[DR-1:0]];

always @(posedge clk)
        if (iAlloc)
                mem[iPtr[DR-1:0]]
                                <= #1 iData;

// -----------------------------------------------------------------------------
// Data FIFO Pointer
always @(posedge clk)
        if (reset) begin
                iStall          <= #1 1'b0;
                oVld            <= #1 1'b0;
        end
        else begin
                iStall          <= #1 iStallD;
                oVld            <= #1 oVldD;
        end

always @(posedge clk)
        if (reset) begin
                iPtr            <= #1 {DR+1{1'b0}};
                oPtr            <= #1 {DR+1{1'b0}};
        end
        else begin
                iPtr            <= #1 iPtrD;
                oPtr            <= #1 oPtrD;
        end

assign iStallD          = (iPtrD[DR] != oPtrD[DR])
                        & (iPtrD[DR-1:0] == oPtrD[DR-1:0]);

assign oVldD            = (iPtrD != oPtrD);

assign iPtrD            = iPtr + iAlloc;
assign oPtrD            = oPtr + oAlloc;

// -----------------------------------------------------------------------------
// Threshold Control
always @(posedge clk)
        if (reset)
                trig            <= #1 1'b0;
        else
                trig            <= #1 trigD;

// 入出力ポインタの差分を計算、周期を示すMSBも保存
assign diffD            = (iPtrD - oPtrD);

// ポインタの差分がThresholdを超えるとTrigger信号を出すようにする
// 説明分と整合させると、Triggerが'0'でSDRAMの連続アクセス
// Thresholdを動的に変化させる場合、Triggerは次のタイミングで反映することに注意
assign trigD            = (diffD > {1'b0, thresh});

// ************************** FUNCTIONS and TASKS ******************************

endmodule

// *****************************************************************************
        

回路デザイン > 設計例 [FIFO] > Threshold対応FIFO    次のページ(SRAMを使用したFIFO)   このページのTOP ▲

[1]
一般的に、ハンドシェーク不可なデバイスに対するSDRAMの最悪時のレイテンシは定まらないと大変です。それを回避するシステム設計をすべきだと考えます。

次にデバイスの優先制御の方式と、SDRAMの最悪レイテンシが連続してもFIFOが枯渇しないパラメータを決めます。

優先デバイスがN個ある場合、単純に言うとN倍の最悪レイテンシを想定します。
[2]
従来のFIFOを縦続しても同じような機能が得られます。このような構成はバーストバッファ、デバイスバッファに分けて考えればイメージしやすいと思います。
[3]
定期的ではなくランダムなタイミングでデータアクセスを行う場合、FIFO付きRead/Write制御を選択する方が賢明です。

Thresholdを見てSDRAMに連続アクセスする場合、データアクセスに同期した制御になります。この制御のギャップ(アドレスフェーズとデータフェーズの差)により、SDRAMへの先行アクセスが抑制され性能に影響しかねないからです。