論理回路デザイン |
|
/* **************************** 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 ▲