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