From 4cc7a0330d211e822f760dfaba451e9dd30442ad Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Mon, 22 Dec 2014 13:49:20 +0000 Subject: [PATCH] Added functions for resizing to the mosi/miso record slv fields. --- libraries/technology/ddr/tech_ddr_pkg.vhd | 74 ++++++++++++++++++----- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/libraries/technology/ddr/tech_ddr_pkg.vhd b/libraries/technology/ddr/tech_ddr_pkg.vhd index 3911f580c6..ab80de226a 100644 --- a/libraries/technology/ddr/tech_ddr_pkg.vhd +++ b/libraries/technology/ddr/tech_ddr_pkg.vhd @@ -55,8 +55,8 @@ PACKAGE tech_ddr_pkg IS END RECORD; FUNCTION func_tech_ddr_dq_address_w( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR address width for the DQ data at the PHY mts rate - FUNCTION func_tech_ddr_ctrl_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR address width for the controller data at the by rsl=4 reduced rate - FUNCTION func_tech_ddr_ctrl_data_w( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR data width for the controller data at the by rsl=4 reduced rate + FUNCTION func_tech_ddr_ctlr_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR address width for the controller data at the by rsl=4 reduced rate + FUNCTION func_tech_ddr_ctlr_data_w( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR data width for the controller data at the by rsl=4 reduced rate FUNCTION func_tech_ddr_module_size( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR module size in GByte CONSTANT c_tech_ddr_max : t_c_tech_ddr := ("none", 800, TRUE, 16, 16, 10, 3, 64, 8, 8, 2, 2, 2, 1, 2, 14, 4, 2, 64, 7); -- maximum ranges for record field definitions @@ -127,30 +127,42 @@ PACKAGE tech_ddr_pkg IS FUNCTION func_tech_ddr_dq_address( dq_address : STD_LOGIC_VECTOR; g_tech_ddr : t_c_tech_ddr ) RETURN t_tech_ddr_addr; FUNCTION func_tech_ddr_dq_address( ddr_addr : t_tech_ddr_addr; g_tech_ddr : t_c_tech_ddr; c_dq_address_w : NATURAL) RETURN STD_LOGIC_VECTOR; - FUNCTION func_tech_ddr_ctrl_address(ddr_addr : t_tech_ddr_addr; g_tech_ddr : t_c_tech_ddr; c_ctrl_address_w : NATURAL) RETURN STD_LOGIC_VECTOR; + FUNCTION func_tech_ddr_ctlr_address(ddr_addr : t_tech_ddr_addr; g_tech_ddr : t_c_tech_ddr; c_ctlr_address_w : NATURAL) RETURN STD_LOGIC_VECTOR; -- PHY MM access signal record - CONSTANT c_tech_ddr_max_ctrl_address_w : NATURAL := 32; -- >= func_tech_ddr_ctrl_address_w(c_tech_ddr_max); - CONSTANT c_tech_ddr_max_ctrl_data_w : NATURAL := 576; -- >= func_tech_ddr_ctrl_data_w( c_tech_ddr_max); + + -- Choose smallest maximum slv lengths that fit all use cases, because unconstrained record fields slv is not allowed + CONSTANT c_tech_ddr_ctlr_address_w : NATURAL := 32; -- >= func_tech_ddr_ctlr_address_w(c_tech_ddr_max); + CONSTANT c_tech_ddr_ctlr_data_w : NATURAL := 576; -- >= func_tech_ddr_ctlr_data_w( c_tech_ddr_max); + CONSTANT c_tech_ddr_ctlr_burstsize_w : NATURAL := c_tech_ddr_max.maxburstsize_w; TYPE t_tech_ddr_miso IS RECORD - rddata : STD_LOGIC_VECTOR(c_tech_ddr_max_ctrl_data_w-1 DOWNTO 0); + rddata : STD_LOGIC_VECTOR(c_tech_ddr_ctlr_data_w-1 DOWNTO 0); rdval : STD_LOGIC; waitrequest_n : STD_LOGIC; END RECORD; TYPE t_tech_ddr_mosi IS RECORD - address : STD_LOGIC_VECTOR(c_tech_ddr_max_ctrl_address_w-1 DOWNTO 0); - wrdata : STD_LOGIC_VECTOR(c_tech_ddr_max_ctrl_data_w-1 DOWNTO 0); - wr : STD_LOGIC; - rd : STD_LOGIC; - burstbegin : STD_LOGIC; - burstsize : STD_LOGIC_VECTOR(c_tech_ddr_max.maxburstsize_w-1 DOWNTO 0); + address : STD_LOGIC_VECTOR(c_tech_ddr_ctlr_address_w-1 DOWNTO 0); + wrdata : STD_LOGIC_VECTOR(c_tech_ddr_ctlr_data_w-1 DOWNTO 0); + wr : STD_LOGIC; + rd : STD_LOGIC; + burstbegin : STD_LOGIC; + burstsize : STD_LOGIC_VECTOR(c_tech_ddr_ctlr_burstsize_w-1 DOWNTO 0); END RECORD; CONSTANT c_tech_ddr_miso_rst : t_tech_ddr_miso := ((OTHERS=>'0'), '0', '0'); CONSTANT c_tech_ddr_mosi_rst : t_tech_ddr_mosi := ((OTHERS=>'0'), (OTHERS=>'0'), '0', '0', '0', (OTHERS=>'0')); + -- Resize functions to fit an integer or an SLV in the corresponding t_tech_ddr_miso or t_tech_ddr_mosi field width + FUNCTION TO_DDR_CTLR_ADDRESS( n : INTEGER) RETURN STD_LOGIC_VECTOR; -- unsigned, use integer to support 32 bit range + FUNCTION TO_DDR_CTLR_DATA( n : INTEGER) RETURN STD_LOGIC_VECTOR; -- unsigned + FUNCTION TO_DDR_CTLR_BURSTSIZE(n : INTEGER) RETURN STD_LOGIC_VECTOR; -- unsigned + + FUNCTION RESIZE_DDR_CTLR_ADDRESS( vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- unsigned + FUNCTION RESIZE_DDR_CTLR_DATA( vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- unsigned + FUNCTION RESIZE_DDR_CTLR_BURSTSIZE(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- unsigned + END tech_ddr_pkg; PACKAGE BODY tech_ddr_pkg IS @@ -160,13 +172,13 @@ PACKAGE BODY tech_ddr_pkg IS RETURN c_ddr.cs_w_w + c_ddr.ba_w + c_ddr.a_w + c_ddr.a_col_w; END; - FUNCTION func_tech_ddr_ctrl_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS + FUNCTION func_tech_ddr_ctlr_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS CONSTANT c_dq_address_w : NATURAL := func_tech_ddr_dq_address_w(c_ddr); BEGIN RETURN c_dq_address_w-c_ddr.rsl_w; END; - FUNCTION func_tech_ddr_ctrl_data_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS + FUNCTION func_tech_ddr_ctlr_data_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS CONSTANT c_dq_address_w : NATURAL := func_tech_ddr_dq_address_w(c_ddr); BEGIN RETURN c_ddr.dq_w*c_ddr.rsl; @@ -200,12 +212,42 @@ PACKAGE BODY tech_ddr_pkg IS ddr_addr.col( g_tech_ddr.a_col_w-1 DOWNTO 0), c_dq_address_w); END; - FUNCTION func_tech_ddr_ctrl_address(ddr_addr : t_tech_ddr_addr; g_tech_ddr : t_c_tech_ddr; c_ctrl_address_w : NATURAL) RETURN STD_LOGIC_VECTOR IS + FUNCTION func_tech_ddr_ctlr_address(ddr_addr : t_tech_ddr_addr; g_tech_ddr : t_c_tech_ddr; c_ctlr_address_w : NATURAL) RETURN STD_LOGIC_VECTOR IS CONSTANT c_dq_address_w : NATURAL := func_tech_ddr_dq_address_w(g_tech_ddr); CONSTANT c_dq_address : STD_LOGIC_VECTOR(c_dq_address_w-1 DOWNTO 0) := func_tech_ddr_dq_address(ddr_addr, g_tech_ddr, c_dq_address_w); BEGIN - RETURN RESIZE_UVEC(c_dq_address(c_dq_address_w-1 DOWNTO g_tech_ddr.rsl_w), c_ctrl_address_w); + RETURN RESIZE_UVEC(c_dq_address(c_dq_address_w-1 DOWNTO g_tech_ddr.rsl_w), c_ctlr_address_w); END; + FUNCTION TO_DDR_CTLR_ADDRESS(n : INTEGER) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(TO_SVEC(n, 32), c_tech_ddr_ctlr_address_w); + END TO_DDR_CTLR_ADDRESS; + + FUNCTION TO_DDR_CTLR_DATA(n : INTEGER) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(TO_SVEC(n, 32), c_tech_ddr_ctlr_data_w); + END TO_DDR_CTLR_DATA; + + FUNCTION TO_DDR_CTLR_BURSTSIZE(n : INTEGER) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(TO_SVEC(n, 32), c_tech_ddr_ctlr_burstsize_w); + END TO_DDR_CTLR_BURSTSIZE; + + FUNCTION RESIZE_DDR_CTLR_ADDRESS(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(vec, c_tech_ddr_ctlr_address_w); + END RESIZE_DDR_CTLR_ADDRESS; + + FUNCTION RESIZE_DDR_CTLR_DATA(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(vec, c_tech_ddr_ctlr_data_w); + END RESIZE_DDR_CTLR_DATA; + + FUNCTION RESIZE_DDR_CTLR_BURSTSIZE(vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + BEGIN + RETURN RESIZE_UVEC(vec, c_tech_ddr_ctlr_burstsize_w); + END RESIZE_DDR_CTLR_BURSTSIZE; + END tech_ddr_pkg; -- GitLab