From 29510d260b1fcd93ae6c0aa42e6a403986d4cf71 Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Thu, 12 Feb 2015 09:51:52 +0000 Subject: [PATCH] Added rx_cnt_arr to MM reg. --- .../base/diag/src/vhdl/mms_diag_rx_seq.vhd | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/libraries/base/diag/src/vhdl/mms_diag_rx_seq.vhd b/libraries/base/diag/src/vhdl/mms_diag_rx_seq.vhd index 2105fac3e6..881a2cd8c4 100644 --- a/libraries/base/diag/src/vhdl/mms_diag_rx_seq.vhd +++ b/libraries/base/diag/src/vhdl/mms_diag_rx_seq.vhd @@ -33,6 +33,12 @@ -- |-----------------------------------------------------------------------| -- | res_val_n = [1], res_ok_n = [0] | 1 -- |-----------------------------------------------------------------------| +-- | rx_cnt[31:0] | 2 +-- |-----------------------------------------------------------------------| +-- +-- . g_nof_streams +-- The MM control register for stream I in 0:g_nof_streams-1 starts at word +-- index wi = I * 2**c_mm_reg.adr_w. -- -- . Results -- When res_val_n = '1' then no valid data is being received. When @@ -53,7 +59,11 @@ -- CNTR or LFSR data for the DP data. If the higher bits do notmatch the -- sequence in the lower bits, then the rx data is forced to -1, and that -- will then be detected and reported by u_diag_rx_seq as a sequence error. - +-- +-- . rx_cnt +-- Counts the number of valid input data that was received since diag_en +-- went active. An incrementing rx_cnt shows that data is being received. +-- LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; @@ -89,38 +99,39 @@ ARCHITECTURE str OF mms_diag_rx_seq IS -- Define the actual size of the MM slave register CONSTANT c_mm_reg : t_c_mem := (latency => 1, - adr_w => 1, + adr_w => 2, dat_w => c_word_w, -- Use MM bus data width = c_word_w = 32 for all MM registers - nof_dat => 2, + nof_dat => 3, init_sl => '0'); CONSTANT c_reg_slv_w : NATURAL := c_mm_reg.nof_dat*c_mm_reg.dat_w; - TYPE t_reg_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(c_reg_slv_w-1 DOWNTO 0); - TYPE t_seq_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(g_seq_dat_w-1 DOWNTO 0); - TYPE t_data_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); + TYPE t_reg_slv_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(c_reg_slv_w-1 DOWNTO 0); + TYPE t_seq_dat_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(g_seq_dat_w-1 DOWNTO 0); + TYPE t_data_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); + SIGNAL reg_mosi_arr : t_mem_mosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL reg_miso_arr : t_mem_miso_arr(g_nof_streams-1 DOWNTO 0); + -- Registers in dp_clk domain - SIGNAL ctrl_reg_arr : t_reg_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); - SIGNAL stat_reg_arr : t_reg_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + SIGNAL ctrl_reg_arr : t_reg_slv_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); + SIGNAL stat_reg_arr : t_reg_slv_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); SIGNAL diag_en_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL diag_sel_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rx_seq_arr : t_seq_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_cnt_arr : t_slv_32_arr(g_nof_streams-1 DOWNTO 0); -- can use t_slv_32_arr because c_mm_reg.dat_w = c_word_w = 32 fixed + SIGNAL rx_seq_arr : t_seq_dat_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_seq_val_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_data_arr : t_data_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_data_val_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL diag_res_arr : t_seq_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL diag_res_arr : t_seq_dat_arr(g_nof_streams-1 DOWNTO 0); SIGNAL diag_res_val_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL stat_res_ok_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL stat_res_val_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL reg_mosi_arr : t_mem_mosi_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL reg_miso_arr : t_mem_miso_arr(g_nof_streams-1 DOWNTO 0); - BEGIN ASSERT g_data_w >= g_seq_dat_w REPORT "mms_diag_rx_seq: g_data_w < g_seq_dat_w is not allowed." SEVERITY FAILURE; @@ -156,6 +167,7 @@ BEGIN -- detect rx sequence errors u_diag_rx_seq: ENTITY WORK.diag_rx_seq GENERIC MAP ( + g_cnt_w => c_word_w, g_dat_w => g_seq_dat_w, g_diag_res_w => g_seq_dat_w -- do not use g_seq_dat_w+1 to include NOT diag_res_val in MSbit, instead use diag_res_val output ) @@ -172,6 +184,7 @@ BEGIN diag_res_val => diag_res_val_arr(I), -- Streaming + in_cnt => rx_cnt_arr(I), in_dat => rx_seq_arr(I), in_val => rx_seq_val_arr(I) ); @@ -186,19 +199,20 @@ BEGIN diag_sel_arr(I) <= ctrl_reg_arr(I)(1); -- address 0, data bit [1] -- address 1, not used for control -- . read stat_reg_arr - p_stat_reg_arr : PROCESS(ctrl_reg_arr, stat_res_ok_n_arr, stat_res_val_n_arr) + p_stat_reg_arr : PROCESS(ctrl_reg_arr, stat_res_ok_n_arr, stat_res_val_n_arr, rx_cnt_arr) BEGIN -- Default write / readback: - stat_reg_arr(I) <= ctrl_reg_arr(I); -- address 0, control read back + stat_reg_arr(I) <= ctrl_reg_arr(I); -- address 0: control read back -- Status read only: - stat_reg_arr(I)(0+c_word_w) <= stat_res_ok_n_arr(I); -- address 1, data bit [0] - stat_reg_arr(I)(1+c_word_w) <= stat_res_val_n_arr(I); -- address 1, data bit [1] + stat_reg_arr(I)( 0+1*c_word_w) <= stat_res_ok_n_arr(I); -- address 1, data bit [0] + stat_reg_arr(I)( 1+1*c_word_w) <= stat_res_val_n_arr(I); -- address 1, data bit [1] + stat_reg_arr(I)(3*c_word_w-1 DOWNTO 2*c_word_w) <= rx_cnt_arr(I); -- address 2: read rx_cnt per stream END PROCESS; u_reg : ENTITY common_lib.common_reg_r_w_dc GENERIC MAP ( g_cross_clock_domain => TRUE, - g_readback => FALSE, -- using FALSE fits for write/read or read only register + g_readback => FALSE, -- must use FALSE for write/read or read only register when g_cross_clock_domain=TRUE g_reg => c_mm_reg ) PORT MAP ( -- GitLab