⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cntl_ddr2.vhd

📁 xilinx ddr3最新VHDL代码,通过调试
💻 VHD
📖 第 1 页 / 共 4 页
字号:
        Bus2IP_WrReq        : in  std_logic;
        Bus2IP_Burst        : in  std_logic;
        Bus2IP_IBurst       : in  std_logic;
        Bus2IP_CS           : in  std_logic_vector(0 to C_NUM_BANKS_MEM-1);
        ECC_chk_bits_wr     : in  std_logic_vector (0 to NUM_ECC_BITS*2-1);
        ECC_chk_bits_rd     : out std_logic_vector (0 to NUM_ECC_BITS*2-1);

        -- IPIC outputs
        IP2Bus_Data         : out std_logic_vector(0 to C_IPIF_DWIDTH-1);
        IP2Bus_WrAddrAck    : out std_logic;
        IP2Bus_RdAddrAck    : out std_logic;
        IP2Bus_Busy         : out std_logic;
        IP2Bus_RdAck        : out std_logic;
        IP2Bus_WrAck        : out std_logic;
        IP2Bus_ErrAck       : out std_logic;
        IP2Bus_Retry        : out std_logic;
        IP2Bus_ToutSup      : out std_logic;

        -- DDR interface signals
        DDR_Clk             : out std_logic_vector(0 to C_NUM_CLK_PAIRS-1);
        DDR_Clkn            : out std_logic_vector(0 to C_NUM_CLK_PAIRS-1);
        DDR_CKE             : out std_logic_vector(0 to C_NUM_BANKS_MEM-1);
        DDR_CSn             : out std_logic_vector(0 to C_NUM_BANKS_MEM-1);
        DDR_RASn            : out std_logic;
        DDR_CASn            : out std_logic;
        DDR_WEn             : out std_logic;
        DDR_DM              : out std_logic_vector(0 to C_DDR_DWIDTH/8-1);
        DDR_BankAddr        : out std_logic_vector(0 to C_DDR_BANK_AWIDTH-1);
        DDR_Addr            : out std_logic_vector(0 to C_DDR_AWIDTH-1);
        DDR_DQ_o            : out std_logic_vector(0 to C_DDR_DWIDTH-1);
        DDR_DQ_i            : in  std_logic_vector(0 to C_DDR_DWIDTH-1);
        DDR_DQ_t            : out std_logic_vector(0 to C_DDR_DWIDTH-1);
        DDR_DQS_i           : in  std_logic_vector(0 to C_DDR_DWIDTH/8-1);
        DDR_DQS_o           : out std_logic_vector(0 to C_DDR_DWIDTH/8-1);
        DDR_DQS_t           : out std_logic_vector(0 to C_DDR_DWIDTH/8-1);
        
        -- DDR ECC interface signals
        DDR_DM_ECC          : out std_logic;
        DDR_DQ_ECC_o        : out std_logic_vector(0 to NUM_ECC_BITS-1);
        DDR_DQ_ECC_i        : in  std_logic_vector(0 to NUM_ECC_BITS-1);
        DDR_DQ_ECC_t        : out std_logic_vector(0 to NUM_ECC_BITS-1);
        DDR_DQS_ECC_i       : in  std_logic;
        DDR_DQS_ECC_o       : out std_logic;
        DDR_DQS_ECC_t       : out std_logic;

        -- Timer/Interrupt signals
        DDR_Init_done       : out std_logic;

        -- Clocks and reset
        Sys_Clk             : in  std_logic;
        Sys_Clk_n           : in  std_logic;
        Clk90_in            : in  std_logic;
        Clk90_in_n          : in  std_logic;
        DDR_Clk90_in        : in  std_logic;
        DDR_Clk90_in_n      : in  std_logic;
        Rst                 : in  std_logic
    );
end component;

-----------------------------------------------------------------------------
-- Function declarations
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Function: GET_ARD_ARRAY_SIZE
-- Purpose: Get array size for ARD_ID_ARRAY, ARD_DWIDTH_ARRAY, and 
--          ARD_NUM_CE_ARRAY.
-----------------------------------------------------------------------------
function GET_ARD_ARRAY_SIZE return INTEGER is
variable ARD_ARRAY_SIZE : INTEGER;
begin

    ARD_ARRAY_SIZE := C_NUM_BANKS_MEM;  
    return ARD_ARRAY_SIZE;
    
end function GET_ARD_ARRAY_SIZE;

-----------------------------------------------------------------------------
-- Function: GET_ARD_ADDR_ARRAY_SIZE
-- Purpose: Get array size for ARD_ADDR_RANGE_ARRAY.
-----------------------------------------------------------------------------
function GET_ARD_ADDR_ARRAY_SIZE return INTEGER is
variable ARD_ADDR_ARRAY_SIZE : INTEGER;
begin

    ARD_ADDR_ARRAY_SIZE := C_NUM_BANKS_MEM * 2;  
    return ARD_ADDR_ARRAY_SIZE;
    
end function GET_ARD_ADDR_ARRAY_SIZE;

-----------------------------------------------------------------------------
-- Function: GET_ARD_ID_ARRAY
-- Purpose: Fill ARD_ID_ARRAY based on input parameters
-----------------------------------------------------------------------------
function GET_ARD_ID_ARRAY return INTEGER_ARRAY_TYPE is
variable ARD_ID_ARRAY_V : INTEGER_ARRAY_TYPE (0 to GET_ARD_ARRAY_SIZE-1);
begin
    
    if (C_NUM_BANKS_MEM = 1) then
        ARD_ID_ARRAY_V(0) := USER_00;           
    elsif (C_NUM_BANKS_MEM = 2) then
        ARD_ID_ARRAY_V(0) := USER_00;    
        ARD_ID_ARRAY_V(1) := USER_01;    
    elsif (C_NUM_BANKS_MEM = 3) then
        ARD_ID_ARRAY_V(0) := USER_00;    
        ARD_ID_ARRAY_V(1) := USER_01;     
        ARD_ID_ARRAY_V(2) := USER_02;     
    elsif (C_NUM_BANKS_MEM = 4) then
        ARD_ID_ARRAY_V(0) := USER_00;    
        ARD_ID_ARRAY_V(1) := USER_01;     
        ARD_ID_ARRAY_V(2) := USER_02;     
        ARD_ID_ARRAY_V(3) := USER_03;  
    end if;    
    return ARD_ID_ARRAY_V;
    
end function GET_ARD_ID_ARRAY;

-----------------------------------------------------------------------------
-- Function: GET_ARD_ADDR_RANGE_ARRAY
-- Purpose: Fill ARD_ADDR_RANGE_ARRAY based on input parameters
-----------------------------------------------------------------------------
function GET_ARD_ADDR_RANGE_ARRAY return SLV64_ARRAY_TYPE is
variable ARD_ADDR_RANGE_ARRAY_V : SLV64_ARRAY_TYPE (0 to GET_ARD_ADDR_ARRAY_SIZE-1);
constant ZERO_ADDR_PAD  : std_logic_vector(0 to 64-C_OPB_AWIDTH-1) := (others => '0');

begin

    if (C_NUM_BANKS_MEM = 1) then
        ARD_ADDR_RANGE_ARRAY_V(0) := ZERO_ADDR_PAD&C_MEM0_BASEADDR;      -- OPB DDR base address MEM0
        ARD_ADDR_RANGE_ARRAY_V(1) := ZERO_ADDR_PAD&C_MEM0_HIGHADDR;      -- OPB DDR high address MEM0
    elsif (C_NUM_BANKS_MEM = 2) then
        ARD_ADDR_RANGE_ARRAY_V(0) := ZERO_ADDR_PAD&C_MEM0_BASEADDR;      -- OPB DDR base address MEM0
        ARD_ADDR_RANGE_ARRAY_V(1) := ZERO_ADDR_PAD&C_MEM0_HIGHADDR;      -- OPB DDR high address MEM0
        ARD_ADDR_RANGE_ARRAY_V(2) := ZERO_ADDR_PAD&C_MEM1_BASEADDR;      -- OPB DDR base address MEM1
        ARD_ADDR_RANGE_ARRAY_V(3) := ZERO_ADDR_PAD&C_MEM1_HIGHADDR;      -- OPB DDR high address MEM1
    elsif (C_NUM_BANKS_MEM = 3) then
        ARD_ADDR_RANGE_ARRAY_V(0) := ZERO_ADDR_PAD&C_MEM0_BASEADDR;      -- OPB DDR base address MEM0
        ARD_ADDR_RANGE_ARRAY_V(1) := ZERO_ADDR_PAD&C_MEM0_HIGHADDR;      -- OPB DDR high address MEM0
        ARD_ADDR_RANGE_ARRAY_V(2) := ZERO_ADDR_PAD&C_MEM1_BASEADDR;      -- OPB DDR base address MEM1
        ARD_ADDR_RANGE_ARRAY_V(3) := ZERO_ADDR_PAD&C_MEM1_HIGHADDR;      -- OPB DDR high address MEM1
        ARD_ADDR_RANGE_ARRAY_V(4) := ZERO_ADDR_PAD&C_MEM2_BASEADDR;      -- OPB DDR base address MEM2
        ARD_ADDR_RANGE_ARRAY_V(5) := ZERO_ADDR_PAD&C_MEM2_HIGHADDR;      -- OPB DDR high address MEM2
    elsif (C_NUM_BANKS_MEM = 4) then
        ARD_ADDR_RANGE_ARRAY_V(0) := ZERO_ADDR_PAD&C_MEM0_BASEADDR;      -- OPB DDR base address MEM0
        ARD_ADDR_RANGE_ARRAY_V(1) := ZERO_ADDR_PAD&C_MEM0_HIGHADDR;      -- OPB DDR high address MEM0
        ARD_ADDR_RANGE_ARRAY_V(2) := ZERO_ADDR_PAD&C_MEM1_BASEADDR;      -- OPB DDR base address MEM1
        ARD_ADDR_RANGE_ARRAY_V(3) := ZERO_ADDR_PAD&C_MEM1_HIGHADDR;      -- OPB DDR high address MEM1
        ARD_ADDR_RANGE_ARRAY_V(4) := ZERO_ADDR_PAD&C_MEM2_BASEADDR;      -- OPB DDR base address MEM2
        ARD_ADDR_RANGE_ARRAY_V(5) := ZERO_ADDR_PAD&C_MEM2_HIGHADDR;      -- OPB DDR high address MEM2
        ARD_ADDR_RANGE_ARRAY_V(6) := ZERO_ADDR_PAD&C_MEM3_BASEADDR;      -- OPB DDR base address MEM3
        ARD_ADDR_RANGE_ARRAY_V(7) := ZERO_ADDR_PAD&C_MEM3_HIGHADDR;      -- OPB DDR high address MEM3
    end if;      
    return ARD_ADDR_RANGE_ARRAY_V;
    
end function GET_ARD_ADDR_RANGE_ARRAY;

-----------------------------------------------------------------------------
-- Function: GET_ARD_DWIDTH_ARRAY
-- Purpose: Fill ARD_DWIDTH_ARRAY based on input parameters
-----------------------------------------------------------------------------
function GET_ARD_DWIDTH_ARRAY return INTEGER_ARRAY_TYPE is
variable ARD_DWIDTH_ARRAY_V : INTEGER_ARRAY_TYPE (0 to GET_ARD_ARRAY_SIZE-1);
begin
  
    if (C_NUM_BANKS_MEM = 1) then
        ARD_DWIDTH_ARRAY_V(0) := C_OPB_DWIDTH;      -- User0 data width (memory space)
    elsif (C_NUM_BANKS_MEM = 2) then
        ARD_DWIDTH_ARRAY_V(0) := C_OPB_DWIDTH;      -- User0 data width (memory space)
        ARD_DWIDTH_ARRAY_V(1) := C_OPB_DWIDTH;      -- User1 data width (memory space)
    elsif (C_NUM_BANKS_MEM = 3) then
        ARD_DWIDTH_ARRAY_V(0) := C_OPB_DWIDTH;      -- User0 data width (memory space)
        ARD_DWIDTH_ARRAY_V(1) := C_OPB_DWIDTH;      -- User1 data width (memory space)
        ARD_DWIDTH_ARRAY_V(2) := C_OPB_DWIDTH;      -- User2 data width (memory space)
    elsif (C_NUM_BANKS_MEM = 4) then
        ARD_DWIDTH_ARRAY_V(0) := C_OPB_DWIDTH;      -- User0 data width (memory space)
        ARD_DWIDTH_ARRAY_V(1) := C_OPB_DWIDTH;      -- User1 data width (memory space)
        ARD_DWIDTH_ARRAY_V(2) := C_OPB_DWIDTH;      -- User2 data width (memory space)
        ARD_DWIDTH_ARRAY_V(3) := C_OPB_DWIDTH;      -- User3 data width (memory space)
    end if;                  
    return ARD_DWIDTH_ARRAY_V;
    
end function GET_ARD_DWIDTH_ARRAY;

-----------------------------------------------------------------------------
-- Function: GET_ARD_NUM_CE_ARRAY
-- Purpose: Fill ARD_NUM_CE_ARRAY based on input parameters
-----------------------------------------------------------------------------
function GET_ARD_NUM_CE_ARRAY return INTEGER_ARRAY_TYPE is
variable ARD_NUM_CE_ARRAY_V : INTEGER_ARRAY_TYPE (0 to GET_ARD_ARRAY_SIZE-1);
begin     

    if (C_NUM_BANKS_MEM = 1) then
        ARD_NUM_CE_ARRAY_V(0) := 1;  
    elsif (C_NUM_BANKS_MEM = 2) then
        ARD_NUM_CE_ARRAY_V(0) := 1;  
        ARD_NUM_CE_ARRAY_V(1) := 1;  
    elsif (C_NUM_BANKS_MEM = 3) then
        ARD_NUM_CE_ARRAY_V(0) := 1;  
        ARD_NUM_CE_ARRAY_V(1) := 1;  
        ARD_NUM_CE_ARRAY_V(2) := 1;  
    elsif (C_NUM_BANKS_MEM = 4) then
        ARD_NUM_CE_ARRAY_V(0) := 1;  
        ARD_NUM_CE_ARRAY_V(1) := 1;  
        ARD_NUM_CE_ARRAY_V(2) := 1;  
        ARD_NUM_CE_ARRAY_V(3) := 1;  
    end if;          
    return ARD_NUM_CE_ARRAY_V;
    
end function GET_ARD_NUM_CE_ARRAY;

-------------------------------------------------------------------------------
-- Constant Declarations
-------------------------------------------------------------------------------
-- set the bus to be used
constant OPB_BUS        : integer := 1;
constant PLB_BUS        : integer := 0;

-- set the DDR burst size
constant DDR_BRST_SIZE       : integer := C_OPB_DWIDTH/C_DDR_DWIDTH;

-- addresses are now expected to be 64-bits wide - create constants to 
-- zero the most significant address bits
constant ZERO_ADDR_PAD  : std_logic_vector(0 to 64-C_OPB_AWIDTH-1) := (others => '0');

-- Constants for OPB IPIF
-- Call functions to populate these arrays based on C_NUM_BANKS_MEM
constant ARD_ID_ARRAY           : INTEGER_ARRAY_TYPE := GET_ARD_ID_ARRAY;
constant ARD_ADDR_RANGE_ARRAY   : SLV64_ARRAY_TYPE   := GET_ARD_ADDR_RANGE_ARRAY;
constant ARD_DWIDTH_ARRAY       : INTEGER_ARRAY_TYPE := GET_ARD_DWIDTH_ARRAY;
constant ARD_NUM_CE_ARRAY       : INTEGER_ARRAY_TYPE := GET_ARD_NUM_CE_ARRAY;
constant IP_INTR_MODE_ARRAY     : INTEGER_ARRAY_TYPE := (0,0);

-- No dependent properties
constant ARD_DEPENDENT_PROPS_ARRAY : DEPENDENT_PROPS_ARRAY_TYPE := 
        ( 0 => (others => 0) );
        
-- Do not include MIR
constant DEV_MIR_ENABLE         : integer := 0;
constant DEV_BLK_ID             : integer := 0;

-- Burst support generics
constant INCLUDE_ADDR_CNTR      : integer := C_INCLUDE_BURST_SUPPORT;
constant INCLUDE_WR_BUF         : integer := C_INCLUDE_BURST_SUPPORT;

-- IPIF pipeline model number
constant PIPELINE_MODEL      : integer := 5;

constant ZERO_DATA             : std_logic_vector(0 to C_OPB_DWIDTH-1)
                                    :=  (others => '0');
constant ZERO_INTR             : std_logic_vector(0 to IP_INTR_MODE_ARRAY'length-1)
                                    := (others => '0');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -