From edb2c90e3097b7890bb8dc013739083f1fea985c Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Thu, 25 Jun 2015 11:44:59 +0000 Subject: [PATCH] Removed clock domain crossing logic for this control register, because that is done by io_ddr_cross_domain.vhd in io_ddr.vhd. Removed cal_fail and cal_ok, because these are already available via the io_ddr status register. --- libraries/io/ddr/src/vhdl/io_ddr_reg.vhd | 183 +++++------------------ 1 file changed, 39 insertions(+), 144 deletions(-) diff --git a/libraries/io/ddr/src/vhdl/io_ddr_reg.vhd b/libraries/io/ddr/src/vhdl/io_ddr_reg.vhd index 1c00111eaa..c2c8c3186e 100644 --- a/libraries/io/ddr/src/vhdl/io_ddr_reg.vhd +++ b/libraries/io/ddr/src/vhdl/io_ddr_reg.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------- -- --- Copyright (C) 2011 +-- Copyright (C) 2015 -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands -- @@ -19,26 +19,35 @@ -- ------------------------------------------------------------------------------- --- RO read only (no VHDL present to access HW in write mode) --- WO write only (no VHDL present to access HW in read mode) --- WE write event (=WO) --- WR write control, read control --- RW read status, write control --- RC read, clear on read --- FR FIFO read --- FW FIFO write -- --- wi Bits R/W Name Default Description |REG_DDR3| +-- Register definition: +-- +-- wi Bits R/W Name Default Description -- ============================================================================= -- 0 [0] WE burstbegin 0x0 -- 1 [0] WO wr_not_rd 0x0 -- 2 [0] RO done 0x1 --- 3 [1..0] RO cal_result 0x1 cal_fail & cal_ok --- 4 [0] RO waitrequest_n 0x1 +-- 3 not used +-- 4 not used -- 5 [31..0] WO address 0x0 -- 6 [31..0] WO burstsize 0x0 -- 7 [0] WR flush 0x0 -- ============================================================================= +-- +-- Legenda: +-- +-- RO read only (no VHDL present to access HW in write mode) +-- WO write only (no VHDL present to access HW in read mode) +-- WE write event (=WO) +-- WR write control, read control +-- RW read status, write control +-- RC read, clear on read +-- FR FIFO read +-- FW FIFO write +-- +-- Remarks: +-- . Clock domain crossing between mm_clk and the DDR controller clock domain +-- needs to be done by io_ddr_cross_domain.vhd in io_ddr. LIBRARY IEEE, common_lib, diag_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -52,8 +61,6 @@ ENTITY io_ddr_reg IS -- Clocks and reset mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk mm_clk : IN STD_LOGIC; -- memory-mapped bus clock - dp_rst : IN STD_LOGIC; -- reset synchronous with dp_clk - dp_clk : IN STD_LOGIC; -- other clock domain clock -- Memory Mapped Slave in mm_clk domain sla_in : IN t_mem_mosi; -- actual ranges defined by c_mm_reg @@ -72,13 +79,14 @@ ARCHITECTURE rtl OF io_ddr_reg IS adr_w => ceil_log2(8), dat_w => c_word_w, -- Use MM bus data width = c_word_w = 32 for all MM registers nof_dat => 8, - init_sl => '0'); - -- Registers in mm_clk domain - SIGNAL mm_dvr_miso : t_mem_ctlr_miso; - SIGNAL mm_dvr_mosi : t_mem_ctlr_mosi; - + init_sl => '0'); + + SIGNAL i_dvr_mosi : t_mem_ctlr_mosi; + BEGIN + dvr_mosi <= i_dvr_mosi; + ------------------------------------------------------------------------------ -- MM register access in the mm_clk domain -- . Hardcode the shared MM slave register directly in RTL instead of using @@ -90,29 +98,30 @@ BEGIN p_mm_reg : PROCESS (mm_rst, mm_clk) BEGIN IF mm_rst = '1' THEN - sla_out <= c_mem_miso_rst; - mm_dvr_mosi <= c_mem_ctlr_mosi_rst; + sla_out <= c_mem_miso_rst; + i_dvr_mosi <= c_mem_ctlr_mosi_rst; ELSIF rising_edge(mm_clk) THEN -- Read access defaults sla_out.rdval <= '0'; - mm_dvr_mosi.burstbegin <= '0'; + + -- Write access defaults + i_dvr_mosi.burstbegin <= '0'; -- Write access: set register value IF sla_in.wr = '1' THEN CASE TO_UINT(sla_in.address(c_mm_reg.adr_w-1 DOWNTO 0)) IS -- Write Block Sync WHEN 0 => - mm_dvr_mosi.burstbegin <= sla_in.wrdata(0); + i_dvr_mosi.burstbegin <= sla_in.wrdata(0); -- default to '0' so MM write '1' will yield a pulse of one mm_clk clock cycle WHEN 1 => - mm_dvr_mosi.wr <= sla_in.wrdata(0); - mm_dvr_mosi.rd <= NOT(sla_in.wrdata(0)); + i_dvr_mosi.wr <= sla_in.wrdata(0); -- = wr_not_rd, so no need to control i_dvr_mosi.rd WHEN 5 => - mm_dvr_mosi.address <= sla_in.wrdata(c_mem_ctlr_address_w-1 DOWNTO 0); + i_dvr_mosi.address <= sla_in.wrdata(c_mem_ctlr_address_w-1 DOWNTO 0); WHEN 6 => - mm_dvr_mosi.burstsize <= sla_in.wrdata(c_mem_ctlr_burstsize_w-1 DOWNTO 0); + i_dvr_mosi.burstsize <= sla_in.wrdata(c_mem_ctlr_burstsize_w-1 DOWNTO 0); WHEN 7 => - mm_dvr_mosi.flush <= sla_in.wrdata(0); + i_dvr_mosi.flush <= sla_in.wrdata(0); WHEN OTHERS => NULL; -- unused MM addresses END CASE; @@ -123,128 +132,14 @@ BEGIN CASE TO_UINT(sla_in.address(c_mm_reg.adr_w-1 DOWNTO 0)) IS -- Read Block Sync WHEN 2 => - sla_out.rddata(0) <= mm_dvr_miso.done; - WHEN 3 => - sla_out.rddata(1 DOWNTO 0) <= mm_dvr_miso.cal_fail & mm_dvr_miso.cal_ok; - WHEN 4 => - sla_out.rddata(0) <= mm_dvr_miso.waitrequest_n; + sla_out.rddata(0) <= dvr_miso.done; -- read only WHEN 7 => - sla_out.rddata(0) <= mm_dvr_mosi.flush; + sla_out.rddata(0) <= i_dvr_mosi.flush; -- readback WHEN OTHERS => NULL; -- unused MM addresses END CASE; END IF; END IF; END PROCESS; - ------------------------------------------------------------------------------ - -- Transfer register value between mm_clk and st_clk domain. - -- If the function of the register ensures that the value will not be used - -- immediately when it was set, then the transfer between the clock domains - -- can be done by wires only. Otherwise if the change in register value can - -- have an immediate effect then the bit or word value needs to be transfered - -- using: - -- - -- . common_async --> for single-bit level signal - -- . common_spulse --> for single-bit pulse signal - -- . common_reg_cross_domain --> for a multi-bit (a word) signal - -- - -- Typically always use a crossing component for the single bit signals (to - -- be on the safe side) and only use a crossing component for the word - -- signals if it is necessary (to avoid using more logic than necessary). - ------------------------------------------------------------------------------ - - u_spulse_en_evt : ENTITY common_lib.common_spulse - PORT MAP ( - in_rst => mm_rst, - in_clk => mm_clk, - in_pulse => mm_dvr_mosi.burstbegin, - in_busy => OPEN, - out_rst => dp_rst, - out_clk => dp_clk, - out_pulse => dvr_mosi.burstbegin - ); - - u_async_wr : ENTITY common_lib.common_async - GENERIC MAP ( - g_rst_level => '0' - ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - din => mm_dvr_mosi.wr, - dout => dvr_mosi.wr - ); - - u_async_rd : ENTITY common_lib.common_async - GENERIC MAP ( - g_rst_level => '0' - ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - din => mm_dvr_mosi.rd, - dout => dvr_mosi.rd - ); - - u_async_flush : ENTITY common_lib.common_async - GENERIC MAP ( - g_rst_level => '0' - ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - din => mm_dvr_mosi.flush, - dout => dvr_mosi.flush - ); - - u_async_done : ENTITY common_lib.common_async - GENERIC MAP ( - g_rst_level => '0' - ) - PORT MAP ( - rst => mm_rst, - clk => mm_clk, - din => dvr_miso.done, - dout => mm_dvr_miso.done - ); - - u_async_waitrequest_n : ENTITY common_lib.common_async - GENERIC MAP ( - g_rst_level => '0' - ) - PORT MAP ( - rst => mm_rst, - clk => mm_clk, - din => dvr_miso.waitrequest_n, - dout => mm_dvr_miso.waitrequest_n - ); - - mm_dvr_miso.cal_fail <= dvr_miso.cal_fail; - mm_dvr_miso.cal_ok <= dvr_miso.cal_ok; - - u_cross_domain_addr : ENTITY common_lib.common_reg_cross_domain - PORT MAP ( - in_rst => mm_rst, - in_clk => mm_clk, - in_dat => mm_dvr_mosi.address, - in_done => OPEN, - out_rst => dp_rst, - out_clk => dp_clk, - out_dat => dvr_mosi.address, - out_new => OPEN - ); - - u_cross_domain_burstsize : ENTITY common_lib.common_reg_cross_domain - PORT MAP ( - in_rst => mm_rst, - in_clk => mm_clk, - in_dat => mm_dvr_mosi.burstsize, - in_done => OPEN, - out_rst => dp_rst, - out_clk => dp_clk, - out_dat => dvr_mosi.burstsize, - out_new => OPEN - ); - END rtl; -- GitLab