📄 cntl_ddr2.vhd
字号:
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 + -