From 2578f0bd277fe5f6a2a0489868a229a52d8382e7 Mon Sep 17 00:00:00 2001
From: Pepping <pepping>
Date: Mon, 30 Mar 2015 12:55:45 +0000
Subject: [PATCH] Added register map for io_ddr ctrol signals.

---
 libraries/io/ddr/src/vhdl/io_ddr.vhd | 96 ++++++++++++++++++++--------
 1 file changed, 70 insertions(+), 26 deletions(-)

diff --git a/libraries/io/ddr/src/vhdl/io_ddr.vhd b/libraries/io/ddr/src/vhdl/io_ddr.vhd
index 4c215f1393..ff1e1c3cf9 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr.vhd
@@ -185,6 +185,14 @@ ENTITY io_ddr IS
     ctlr_clk_in        : IN    STD_LOGIC;  -- connect ctlr_clk_out to ctlr_clk_in at top level to avoid potential delta-cycle differences between the same clock
     ctlr_rst_in        : IN    STD_LOGIC;  -- connect ctlr_rst_out to ctlr_rst_in at top level
     
+    -- MM clock + reset
+    mm_rst             : IN    STD_LOGIC;                                           
+    mm_clk             : IN    STD_LOGIC; 
+    
+    -- MM register map for DDR controller status info
+    reg_io_ddr_mosi    : IN    t_mem_mosi;
+    reg_io_ddr_miso    : OUT   t_mem_miso;
+    
     -- Driver clock domain
     dvr_clk            : IN    STD_LOGIC;
     dvr_rst            : IN    STD_LOGIC;
@@ -230,6 +238,7 @@ ARCHITECTURE str OF io_ddr IS
   CONSTANT c_wr_fifo_depth     : NATURAL := g_wr_fifo_depth * (c_ctlr_data_w/g_wr_data_w);  -- get FIFO depth at write side
   
   CONSTANT c_wr_fifo_af_margin : NATURAL := 4 + 1;                        -- use +1 to compensate for latency introduced by registering wr_siso.ready due to RL=0
+  CONSTANT c_mem_reg_io_ddr    : t_c_mem := (c_mem_reg_rd_latency, 1 , 32 , 1, 'X');
                                                           
   SIGNAL ctlr_dvr_miso         : t_mem_ctlr_miso;
   SIGNAL ctlr_dvr_mosi         : t_mem_ctlr_mosi;
@@ -256,6 +265,11 @@ ARCHITECTURE str OF io_ddr IS
   SIGNAL ctlr_wr_fifo_usedw    : STD_LOGIC_VECTOR(ceil_log2(g_wr_fifo_depth)-1 DOWNTO 0);  -- read  side depth of the write FIFO
   SIGNAL ctlr_rd_fifo_usedw    : STD_LOGIC_VECTOR(ceil_log2(g_rd_fifo_depth)-1 DOWNTO 0);  -- write side depth of the read  FIFO
   
+  SIGNAL dp_flush_snk_in       : t_dp_sosi := c_dp_sosi_rst;   
+
+  SIGNAL ctlr_rst_out_i        : STD_LOGIC;
+  SIGNAL mm_reg_io_ddr         : STD_LOGIC_VECTOR(31 DOWNTO 0); 
+  
 BEGIN 
 
   u_io_ddr_cross_domain : ENTITY work.io_ddr_cross_domain
@@ -322,7 +336,7 @@ BEGIN
     src_in         => ctlr_wr_fifo_src_in,
     src_out        => ctlr_wr_fifo_src_out
   );
-  
+ 
   u_dp_flush : ENTITY dp_lib.dp_flush
   GENERIC MAP (
     g_ready_latency => 0,
@@ -402,23 +416,23 @@ BEGIN
 
   u_io_ddr_driver : ENTITY work.io_ddr_driver
   GENERIC MAP (
-    g_tech_ddr         => g_tech_ddr
+    g_tech_ddr => g_tech_ddr
   )
   PORT MAP ( 
-    rst                => ctlr_rst_in,  
-    clk                => ctlr_clk_in,        
+    rst        => ctlr_rst_in,  
+    clk        => ctlr_clk_in,        
 
-    dvr_miso           => ctlr_dvr_miso,
-    dvr_mosi           => ctlr_dvr_mosi,
+    dvr_miso   => ctlr_dvr_miso,
+    dvr_mosi   => ctlr_dvr_mosi,
     
-    wr_snk_in          => ctlr_wr_snk_in, 
-    wr_snk_out         => ctlr_wr_snk_out,
+    wr_snk_in  => ctlr_wr_snk_in, 
+    wr_snk_out => ctlr_wr_snk_out,
     
-    rd_src_out         => ctlr_rd_src_out,
-    rd_src_in          => ctlr_rd_src_in,
+    rd_src_out => ctlr_rd_src_out,
+    rd_src_in  => ctlr_rd_src_in,
 
-    ctlr_miso          => ctlr_miso,
-    ctlr_mosi          => ctlr_mosi
+    ctlr_miso  => ctlr_miso,
+    ctlr_mosi  => ctlr_mosi
   );
   
   u_tech_ddr : ENTITY tech_ddr_lib.tech_ddr
@@ -429,26 +443,56 @@ BEGIN
   )
   PORT MAP (
     -- PLL reference clock
-    ctlr_ref_clk      => ctlr_ref_clk,
-    ctlr_ref_rst      => ctlr_ref_rst,
+    ctlr_ref_clk    => ctlr_ref_clk,
+    ctlr_ref_rst    => ctlr_ref_rst,
 
     -- Controller user interface
-    ctlr_gen_clk      => ctlr_clk_out,
-    ctlr_gen_rst      => ctlr_rst_out,
-    ctlr_gen_clk_2x   => OPEN,
-    ctlr_gen_rst_2x   => OPEN,
+    ctlr_gen_clk    => ctlr_clk_out,
+    ctlr_gen_rst    => ctlr_rst_out_i,
+    ctlr_gen_clk_2x => OPEN,
+    ctlr_gen_rst_2x => OPEN,
 
-    ctlr_mosi         => ctlr_mosi,
-    ctlr_miso         => ctlr_miso,
+    ctlr_mosi       => ctlr_mosi,
+    ctlr_miso       => ctlr_miso,
 
-    term_ctrl_out     => term_ctrl_out,
-    term_ctrl_in      => term_ctrl_in,
+    term_ctrl_out   => term_ctrl_out,
+    term_ctrl_in    => term_ctrl_in,
 
     -- PHY interface
-    phy_in            => phy_in,
-    phy_io            => phy_io,
-    phy_ou            => phy_ou
-  );             
+    phy_in          => phy_in,
+    phy_io          => phy_io,
+    phy_ou          => phy_ou
+  );  
+  
+  ctlr_rst_out  <= ctlr_rst_out_i;
+  mm_reg_io_ddr <= RESIZE_UVEC(ctlr_rst_out_i & ctlr_mosi.flush & ctlr_miso.waitrequest_n & ctlr_miso.done, 32);   
+  
+  u_reg_map : ENTITY common_lib. common_reg_r_w_dc
+  GENERIC MAP (
+    g_cross_clock_domain => TRUE,             -- : BOOLEAN := TRUE;  -- use FALSE when mm_clk and st_clk are the same, else use TRUE to cross the clock domain
+    g_in_new_latency     => 0,                -- : NATURAL := 0;  -- >= 0
+    g_readback           => FALSE,            -- : BOOLEAN := FALSE;  -- must use FALSE for write/read or read only register when g_cross_clock_domain=TRUE
+    g_reg                => c_mem_reg_io_ddr, -- : t_c_mem := c_mem_reg;
+    g_init_reg           => (OTHERS => '0')   -- : STD_LOGIC_VECTOR(c_mem_reg_init_w-1 DOWNTO 0) := (OTHERS => '0')
+  )
+  PORT MAP (
+    -- Clocks and reset
+    mm_rst      => mm_rst,          --: IN  STD_LOGIC;   -- reset synchronous with mm_clk
+    mm_clk      => mm_clk,          --: IN  STD_LOGIC;   -- memory-mapped bus clock
+    st_rst      => ctlr_rst_in,     --: IN  STD_LOGIC;   -- reset synchronous with st_clk
+    st_clk      => ctlr_clk_in,     --: IN  STD_LOGIC;   -- other clock domain clock
+    
+    -- Memory Mapped Slave in mm_clk domain
+    sla_in      => reg_io_ddr_mosi, --: IN  t_mem_mosi;  -- actual ranges defined by g_reg
+    sla_out     => reg_io_ddr_miso, --: OUT t_mem_miso;  -- actual ranges defined by g_reg
+    
+    -- MM registers in st_clk domain
+    reg_wr_arr  => OPEN,            --  : OUT STD_LOGIC_VECTOR(            g_reg.nof_dat-1 DOWNTO 0);
+    reg_rd_arr  => OPEN,            --  : OUT STD_LOGIC_VECTOR(            g_reg.nof_dat-1 DOWNTO 0);
+    in_new      => '1',             --  : IN  STD_LOGIC := '1';
+    in_reg      => mm_reg_io_ddr,   --  : IN  STD_LOGIC_VECTOR(g_reg.dat_w*g_reg.nof_dat-1 DOWNTO 0);
+    out_reg     => OPEN             --  : OUT STD_LOGIC_VECTOR(g_reg.dat_w*g_reg.nof_dat-1 DOWNTO 0)
+  );
   
 END str;
 
-- 
GitLab