論理回路デザイン
ArchiTek home page
コード(sdcモジュールトップRTL)

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

        Copyright (c) 2012, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
        // DDRデバイスデータバス8bit→16bit変換対応のみ
        // モジュール本文変更なし
*/

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

module sdc (
        iReq, iGnt, iRxw, iAddr,
        iWrAck, iWrData, iWrMask,
        iRdAck, iRdData,

        pReq, pGnt, pAddr,

        cs_n, ras_n, cas_n, we_n, addr, ba,
        wdvld, wdvldd, wd, wdqm, rdvld, rd,

        reg_pCOM,
        reg_pACCW, reg_pACCR,
        reg_pFAW, reg_pRRD,
        reg_dTWR, reg_dTRW,
        reg_dWL, reg_dRL,

        clk, clk_n,
        reset_n

        );

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

        parameter       ROWS    = 5'h00;                // Row Address Start Bit

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

        // Normal Master
        input                   iReq;
        output                  iGnt;
        input                   iRxw;
        input   [31:0]          iAddr;
        output                  iWrAck;
        // MasterからのWrite Data入力16bit→32bit変更対応
        input   [31:0]          iWrData;
        // MasterからのWrite Mask入力2bit→4bit変更対応
        input   [3:0]           iWrMask;
        output                  iRdAck;
        // MasterへのRead Data出力16bit→32bit変更対応
        output  [31:0]          iRdData;

        // Interrupt Master
        input                   pReq;
        output                  pGnt;
        input   [31:0]          pAddr;

        // SDRAM Interface
        output                  cs_n;
        output                  ras_n;
        output                  cas_n;
        output                  we_n;
        output  [15:0]          addr;
        output  [2:0]           ba;
        output                  wdvld;
        output                  wdvldd;
        // PHYに接続するDDR Write Data出力16bit→32bit変更対応
        output  [31:0]          wd;
        // PHYに接続するDDR Write Mask出力2bit→4bit変更対応
        output  [3:0]           wdqm;
        output                  rdvld;
        // PHYからのDDR Read Data入力16bit→32bit変更対応
        input   [31:0]          rd;

        // Register Interface
        input   [7:0]           reg_pACCW;
        input   [7:0]           reg_pACCR;
        input   [7:0]           reg_pCOM;
        input   [4:0]           reg_pFAW;
        input   [4:0]           reg_pRRD;
        input   [4:0]           reg_dTWR;
        input   [4:0]           reg_dTRW;
        input   [4:0]           reg_dWL;
        input   [4:0]           reg_dRL;

        // Utility
        input                   clk;
        input                   clk_n;
        input                   reset_n;

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

        wire    [4:0]           rdWL, rdRL;
        wire                    cntlWrPush, cntlRdPush;

        wire                    wrdvld, rddvld;
        // sdcWr→sdcTerm間Write Data接続16bit→32bit変更対応
        wire    [31:0]          wrd;
        // sdcWr→sdcTerm間Write Mask接続2bit→4bit変更対応
        wire    [3:0]           wrdqm;

        // sdcTerm→sdcRd間Read Data接続16bit→32bit変更対応
        wire    [31:0]          rdd;

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

// -----------------------------------------------------------------------------
// Controller
sdcCntl #(ROWS) cntl_0 (
        .iReq                   (iReq),
        .iGnt                   (iGnt),
        .iRxw                   (iRxw),
        .iAddr                  (iAddr),
        .pReq                   (pReq),
        .pGnt                   (pGnt),
        .pAddr                  (pAddr),
        .wrPush                 (cntlWrPush),
        .rdPush                 (cntlRdPush),
        .cs_n                   (cs_n),
        .ras_n                  (ras_n),
        .cas_n                  (cas_n),
        .we_n                   (we_n),
        .addr                   (addr),
        .ba                     (ba),
        .reg_pACCW              (reg_pACCW),
        .reg_pACCR              (reg_pACCR),
        .reg_pCOM               (reg_pCOM),
        .reg_pFAW               (reg_pFAW),
        .reg_pRRD               (reg_pRRD),
        .reg_dTWR               (reg_dTWR),
        .reg_dTRW               (reg_dTRW),
        .reg_dWL                (reg_dWL),
        .reg_dRL                (reg_dRL),
        .rdWL                   (rdWL),
        .rdRL                   (rdRL),
        .clk                    (clk),
        .reset_n                (reset_n)
        );

// -----------------------------------------------------------------------------
// Write Path
sdcWr wr_0 (
        .iAck                   (iWrAck),
        .iData                  (iWrData),
        .iMask                  (iWrMask),
        .iPush                  (cntlWrPush),
        .vld                    (wrdvld),
        .data                   (wrd),
        .dqm                    (wrdqm),
        .rdWL                   (rdWL),
        .clk                    (clk),
        .reset_n                (reset_n)
        );

// -----------------------------------------------------------------------------
// Read Path
sdcRd rd_0 (
        .iAck                   (iRdAck),
        .iData                  (iRdData),
        .iPush                  (cntlRdPush),
        .vld                    (rddvld),
        .data                   (rdd),
        .rdRL                   (rdRL),
        .clk                    (clk),
        .reset_n                (reset_n)
        );

// -----------------------------------------------------------------------------
// Terminal
sdcTerm term_0 (
        .iwdvld                 (wrdvld),
        .iwd                    (wrd),
        .iwdqm                  (wrdqm),
        .irdvld                 (rddvld),
        .ird                    (rdd),
        .owdvld                 (wdvld),
        .owdvldd                (wdvldd),
        .owd                    (wd),
        .owdqm                  (wdqm),
        .ordvld                 (rdvld),
        .ord                    (rd),
        .clk                    (clk),
        .clk_n                  (clk_n),
        .reset_n                (reset_n)
        );

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

endmodule

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

コード(sdcRd RTL)

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

        Copyright (c) 2012, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
        // 入出力データバス16bit→32bit変換対応のみ
        // モジュール本文変更なし
*/

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

module sdcRd (
        iAck, iData, iPush,
        vld, data,
        rdRL,
        clk, reset_n
        );

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

        output                  iAck;
        // MasterへのRead Data出力16bit→32bit変更対応
        output  [31:0]          iData;
        input                   iPush;

        output                  vld;
        // sdcTermからのRead Data入力16bit→32bit変更対応
        input   [31:0]          data;

        input   [4:0]           rdRL;

        input                   clk;
        input                   reset_n;

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

        reg     [31:0]          delayChain;
        wire    [31:0]          delayChainD;

        reg                     burstInc;
        wire                    burstIncD;

        reg     [1:0]           burstCnt;
        wire    [1:0]           burstCntD;

        reg     [31:0]          insertCom;

        reg                     iAck, dvld;

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

// -----------------------------------------------------------------------------
// Delay Chain
always @(posedge clk or negedge reset_n)
        if (!reset_n)
                delayChain      <= #1 32'h00000000;
        else
                delayChain      <= #1 delayChainD;

always @(
        iPush or
        rdRL
        ) begin
        insertCom               = 32'h00000000;
        insertCom[rdRL]         = iPush;
end

assign delayChainD      = {1'b0, delayChain[31:1]} | insertCom;

// -----------------------------------------------------------------------------
// Burst Count
always @(posedge clk or negedge reset_n)
        if (!reset_n) begin
                burstInc        <= #1 1'b0;
                burstCnt        <= #1 2'h0;
        end
        else begin
                burstInc        <= #1 burstIncD;
                burstCnt        <= #1 burstCntD;
        end

assign burstIncD        = |burstCntD;

assign burstCntD        = delayChain[0]
                                ? 2'h1
                                : burstCnt + {1'b0, burstInc};

// -----------------------------------------------------------------------------
// Acknowledge
always @(posedge clk or negedge reset_n)
        if (!reset_n) begin
                dvld            <= #1 1'b0;
                iAck            <= #1 1'b0;
        end
        else begin
                dvld            <= #1 delayChain[0] | burstInc;
                iAck            <= #1 dvld;
        end

assign vld              = (|delayChainD[1:0])
                        | (|burstCntD);

// -----------------------------------------------------------------------------
// Through out
assign iData            = data;

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

endmodule

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

コード(sdcWr RTL)

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

        Copyright (c) 2012, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
        // 入出力データバス16bit→32bit変換、マスク2bit→4bit変換対応
        // モジュール本文変更なし
*/

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

module sdcWr (
        iAck, iData, iMask, iPush,
        vld, data, dqm, rdWL,
        clk, reset_n
        );

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

        output                  iAck;
        // MasterからのWrite Data入力16bit→32bit変更対応
        input   [31:0]          iData;
        // MasterからのWrite Mask入力2bit→4bit変更対応
        input   [3:0]           iMask;
        input                   iPush;

        output                  vld;
        // sdcTermへのWrite Data出力16bit→32bit変更対応
        output  [31:0]          data;
        // sdcTermへのWrite Mask出力2bit→4bit変更対応
        output  [3:0]           dqm;

        input   [4:0]           rdWL;

        input                   clk;
        input                   reset_n;

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

        reg     [31:0]          delayChain;
        wire    [31:0]          delayChainD;

        reg                     burstInc;
        wire                    burstIncD;

        reg     [1:0]           burstCnt;
        wire    [1:0]           burstCntD;

        reg     [31:0]          insertCom;

        reg                     iAck;

        // Write Data入力ラッチレジスタ16bit→32bit変更対応
        reg     [31:0]          data;
        // Write Mask入力ラッチレジスタ2bit→4bit変更対応
        reg     [3:0]           dqm;

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

// -----------------------------------------------------------------------------
// Delay Chain
always @(posedge clk or negedge reset_n)
        if (!reset_n)
                delayChain      <= #1 32'h00000000;
        else
                delayChain      <= #1 delayChainD;

always @(
        iPush or
        rdWL
        ) begin
        insertCom               = 32'h00000000;
        insertCom[rdWL]         = iPush;
end

assign delayChainD      = {1'b0, delayChain[31:1]} | insertCom;

// -----------------------------------------------------------------------------
// Burst Count
always @(posedge clk or negedge reset_n)
        if (!reset_n) begin
                burstInc        <= #1 1'b0;
                burstCnt        <= #1 2'h0;
        end
        else begin
                burstInc        <= #1 burstIncD;
                burstCnt        <= #1 burstCntD;
        end

assign burstIncD        = |burstCntD;

assign burstCntD        = delayChain[0]
                                ? 2'h1
                                : burstCnt + {1'b0, burstInc};

// -----------------------------------------------------------------------------
// Acknowledge
always @(posedge clk or negedge reset_n)
        if (!reset_n)
                iAck            <= #1 1'b0;
        else
                iAck            <= #1 delayChain[0] | burstInc;

assign vld              = iAck;

// -----------------------------------------------------------------------------
// Data Latch
always @(posedge clk)
        begin
                data            <= #1 iData;
                dqm             <= #1 iMask;
        end

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

endmodule

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

コード(sdcTerm RTL)

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

        Copyright (c) 2012, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
        // 入出力データバス16bit→32bit変換、マスク2bit→4bit変換対応
        // モジュール本文変更なし
*/

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

module sdcTerm (
        iwdvld, iwd, iwdqm,
        irdvld, ird,
        owdvld, owdvldd, owd, owdqm,
        ordvld, ord,
        clk, clk_n,
        reset_n
        );

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

        input                   iwdvld;
        // sdcWrからのWrite Data入力16bit→32bit変更対応
        input   [31:0]          iwd;
        // sdcWrからのWrite Mask入力2bit→4bit変更対応
        input   [3:0]           iwdqm;

        input                   irdvld;
        // sdcRdへのRead Data出力16bit→32bit変更対応
        output  [31:0]          ird;

        output                  owdvld;
        output                  owdvldd;
        // PHYに接続するDDR Write Data出力16bit→32bit変更対応
        output  [31:0]          owd;
        // PHYに接続するDDR Write Mask出力2bit→4bit変更対応
        output  [3:0]           owdqm;

        output                  ordvld;
        // PHYからのDDR Read Data入力16bit→32bit変更対応
        input   [31:0]          ord;

        input                   clk;
        input                   clk_n;
        input                   reset_n;

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

        reg                     owdvldd;
        reg                     ordvld;

        // Read Data入力ラッチレジスタ16bit→32bit変更対応
        reg     [31:0]          ird, trd;

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

// -----------------------------------------------------------------------------
// Write Data
assign owd              = iwd;
assign owdqm            = iwdqm;
assign owdvld           = iwdvld;

always @(posedge clk or negedge reset_n)
        if (!reset_n)
                owdvldd         <= #1 1'b0;
        else
                owdvldd         <= #1 iwdvld;

// -----------------------------------------------------------------------------
// Read Data
//always @(posedge clk_n)
//              trd             <= #1 ord;

// Read Data入力ラッチは最終的にクロックの立ち上がりのみでラッチ
// 詳細はタイミング調整の項目を参照して下さい
always @(posedge clk)
//              ird             <= #1 trd;
                ird             <= #1 ord;

always @(posedge clk_n or negedge reset_n)
        if (!reset_n)
                ordvld          <= #1 1'b0;
        else
                ordvld          <= #1 irdvld;

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

endmodule

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

回路デザイン > 設計例 [DDR制御(実装)] > コーディング2    次のページ(動作検証1)   このページのTOP ▲