コード(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 ▲