Skip to content
Snippets Groups Projects
Commit 67490608 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Added tx_cnt_arr to MM reg. Added g_mm_broadcast to select for single or multi MM port control.

parent 29510d26
Branches
No related tags found
No related merge requests found
...@@ -24,17 +24,28 @@ ...@@ -24,17 +24,28 @@
-- Description: -- Description:
-- --
-- Each DP stream has its own diag_tx_seq, because each stream can have its -- Each DP stream has its own diag_tx_seq, because each stream can have its
-- own flow control. -- own flow control. Each DP stream also has its own MM control register to
-- -- support reading tx_cnt per stream.
-- One MM control register sets all g_nof_streams:
-- --
-- 31 24 23 16 15 8 7 0 wi -- 31 24 23 16 15 8 7 0 wi
-- |-----------------|-----------------|-----------------|-----------------| -- |-----------------|-----------------|-----------------|-----------------|
-- | select = [1], enable = [0] | 0 -- | select = [1], enable = [0] | 0
-- |-----------------------------------------------------------------------| -- |-----------------------------------------------------------------------|
-- | init[31: 0] | 1 -- | init[31:0] | 1
-- |-----------------------------------------------------------------------|
-- | tx_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.
--
-- . g_mm_broadcast
-- Use default g_mm_broadcast=FALSE for multiplexed individual MM access to
-- each reg_mosi_arr/reg_miso_arr MM port. When g_mm_broadcast=TRUE then a
-- write access to MM port [0] is passed on to all ports and a read access
-- is done from MM port [0]. The other MM array ports cannot be read then.
--
-- . g_seq_dat_w -- . g_seq_dat_w
-- The g_seq_dat_w must be >= 1. The DP streaming data field is -- The g_seq_dat_w must be >= 1. The DP streaming data field is
-- c_dp_stream_data_w bits wide and the REPLICATE_DP_DATA() is used to wire -- c_dp_stream_data_w bits wide and the REPLICATE_DP_DATA() is used to wire
...@@ -48,6 +59,12 @@ ...@@ -48,6 +59,12 @@
-- . diag_init -- . diag_init
-- Note that MM diag_init has c_word_w=32 bits, so if g_seq_dat_w is wider -- Note that MM diag_init has c_word_w=32 bits, so if g_seq_dat_w is wider
-- then the MSbits are 0 and if it is smaller, then the MSbits are ignored. -- then the MSbits are 0 and if it is smaller, then the MSbits are ignored.
--
-- . tx_cnt
-- Counts the number of valid output data that was transmitted onstream 0
-- since diag_en went active. An incrementing tx_cnt shows that data is
-- being transmitted.
--
LIBRARY IEEE, common_lib, dp_lib; LIBRARY IEEE, common_lib, dp_lib;
USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_1164.ALL;
...@@ -57,8 +74,9 @@ USE dp_lib.dp_stream_pkg.ALL; ...@@ -57,8 +74,9 @@ USE dp_lib.dp_stream_pkg.ALL;
ENTITY mms_diag_tx_seq IS ENTITY mms_diag_tx_seq IS
GENERIC ( GENERIC (
g_nof_streams : NATURAL := 1; g_mm_broadcast : BOOLEAN := FALSE;
g_seq_dat_w : NATURAL := c_word_w -- >= 1, test sequence data width g_nof_streams : NATURAL := 1;
g_seq_dat_w : NATURAL := c_word_w -- >= 1, test sequence data width
); );
PORT ( PORT (
-- Clocks and reset -- Clocks and reset
...@@ -82,33 +100,43 @@ ARCHITECTURE str OF mms_diag_tx_seq IS ...@@ -82,33 +100,43 @@ ARCHITECTURE str OF mms_diag_tx_seq IS
-- Define the actual size of the MM slave register -- Define the actual size of the MM slave register
CONSTANT c_mm_reg : t_c_mem := (latency => 1, 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 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'); init_sl => '0');
TYPE t_dat_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(g_seq_dat_w-1 DOWNTO 0); CONSTANT c_reg_slv_w : NATURAL := c_mm_reg.nof_dat*c_mm_reg.dat_w;
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_replicate_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(c_dp_stream_data_w-1 DOWNTO 0); TYPE t_replicate_arr IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(c_dp_stream_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 -- Registers in dp_clk domain
SIGNAL ctrl_reg : STD_LOGIC_VECTOR(c_mm_reg.nof_dat*c_mm_reg.dat_w-1 DOWNTO 0) := (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 diag_en : STD_LOGIC; SIGNAL diag_init_mm_arr : t_slv_32_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0')); -- can use t_slv_32_arr because c_mm_reg.dat_w = c_word_w = 32 fixed
SIGNAL diag_sel : STD_LOGIC; SIGNAL diag_init_arr : t_seq_dat_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS=>(OTHERS=>'0'));
SIGNAL diag_init_mm : STD_LOGIC_VECTOR(c_mm_reg.dat_w-1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL diag_init : STD_LOGIC_VECTOR(g_seq_dat_w-1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL tx_dat_arr : t_dat_arr(g_nof_streams-1 DOWNTO 0); SIGNAL tx_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 tx_val_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL tx_dat_arr : t_seq_dat_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL tx_req_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL tx_val_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0);
SIGNAL tx_req_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0);
SIGNAL tx_replicate_arr : t_replicate_arr(g_nof_streams-1 DOWNTO 0); SIGNAL tx_replicate_dat_arr : t_dp_data_slv_arr(g_nof_streams-1 DOWNTO 0);
BEGIN BEGIN
gen_nof_streams: FOR I IN 0 to g_nof_streams-1 GENERATE gen_nof_streams: FOR I IN 0 to g_nof_streams-1 GENERATE
u_diag_tx_seq: ENTITY WORK.diag_tx_seq u_diag_tx_seq: ENTITY WORK.diag_tx_seq
GENERIC MAP ( GENERIC MAP (
g_cnt_w => c_word_w,
g_dat_w => g_seq_dat_w g_dat_w => g_seq_dat_w
) )
PORT MAP ( PORT MAP (
...@@ -116,53 +144,75 @@ BEGIN ...@@ -116,53 +144,75 @@ BEGIN
clk => dp_clk, clk => dp_clk,
-- Write and read back registers: -- Write and read back registers:
diag_en => diag_en, diag_en => diag_en_arr(I),
diag_sel => diag_sel, diag_sel => diag_sel_arr(I),
diag_dat => diag_init, diag_dat => diag_init_arr(I),
-- Streaming -- Streaming
diag_req => tx_req_arr(I), diag_req => tx_req_arr(I),
out_cnt => tx_cnt_arr(I),
out_dat => tx_dat_arr(I), out_dat => tx_dat_arr(I),
out_val => tx_val_arr(I) out_val => tx_val_arr(I)
); );
tx_req_arr(I) <= tx_src_in_arr(I).ready; tx_req_arr(I) <= tx_src_in_arr(I).ready;
tx_replicate_dat_arr(I) <= REPLICATE_DP_DATA(tx_dat_arr(I));
tx_replicate_arr(I) <= REPLICATE_DP_DATA(tx_dat_arr(I)); -- for some reason the intermediate tx_replicate_dat_arr() signal is needed, otherwise the assignment to the tx_src_out_arr().data field remains void in the Wave window
tx_src_out_arr(I).data <= tx_replicate_dat_arr(I);
-- for some reason the intermediate tx_replicate_arr() signal is needed, otherwise the assignment to the tx_src_out_arr().data field remains void in the Wave window
tx_src_out_arr(I).data <= tx_replicate_arr(I);
tx_src_out_arr(I).valid <= tx_val_arr(I); tx_src_out_arr(I).valid <= tx_val_arr(I);
END GENERATE;
-- Register mapping -- Register mapping
diag_en <= ctrl_reg( 0); -- address 0, data bit [0] diag_en_arr(I) <= ctrl_reg_arr(I)( 0); -- address 0, data bit [0]
diag_sel <= ctrl_reg( 1); -- address 0, data bit [1] diag_sel_arr(I) <= ctrl_reg_arr(I)( 1); -- address 0, data bit [1]
diag_init_mm <= ctrl_reg(2*c_word_w-1 DOWNTO c_word_w); -- address 1, data bits [31:0] diag_init_mm_arr(I) <= ctrl_reg_arr(I)(2*c_word_w-1 DOWNTO c_word_w); -- address 1, data bits [31:0]
diag_init_arr(I) <= RESIZE_UVEC(diag_init_mm_arr(I), g_seq_dat_w);
p_stat_reg : PROCESS(ctrl_reg_arr(I), tx_cnt_arr)
BEGIN
-- Default write / readback:
stat_reg_arr(I) <= ctrl_reg_arr(I); -- address 0, 1: control read back
-- Status read only:
stat_reg_arr(I)(3*c_word_w-1 DOWNTO 2*c_word_w) <= tx_cnt_arr(I); -- address 2: read tx_cnt
END PROCESS;
diag_init <= RESIZE_UVEC(diag_init_mm, g_seq_dat_w); u_reg : ENTITY common_lib.common_reg_r_w_dc
GENERIC MAP (
g_cross_clock_domain => TRUE,
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 (
-- Clocks and reset
mm_rst => mm_rst,
mm_clk => mm_clk,
st_rst => dp_rst,
st_clk => dp_clk,
-- Memory Mapped Slave in mm_clk domain
sla_in => reg_mosi_arr(I),
sla_out => reg_miso_arr(I),
-- MM registers in dp_clk domain
in_reg => stat_reg_arr(I), -- connect out_reg to in_reg for write and readback register
out_reg => ctrl_reg_arr(I)
);
END GENERATE;
u_reg : ENTITY common_lib.common_reg_r_w_dc -- Combine the internal array of mm interfaces for the bg_data to one array that is connected to the port of the MM bus
u_mem_mux : ENTITY common_lib.common_mem_mux
GENERIC MAP ( GENERIC MAP (
g_cross_clock_domain => TRUE, g_broadcast => g_mm_broadcast,
g_readback => TRUE, -- using TRUE fits for write and readback register g_nof_mosi => g_nof_streams,
g_reg => c_mm_reg g_mult_addr_w => c_mm_reg.adr_w
) )
PORT MAP ( PORT MAP (
-- Clocks and reset mosi => reg_mosi,
mm_rst => mm_rst, miso => reg_miso,
mm_clk => mm_clk, mosi_arr => reg_mosi_arr,
st_rst => dp_rst, miso_arr => reg_miso_arr
st_clk => dp_clk,
-- Memory Mapped Slave in mm_clk domain
sla_in => reg_mosi,
sla_out => reg_miso,
-- MM registers in dp_clk domain
in_reg => ctrl_reg, -- connect out_reg to in_reg for write and readback register
out_reg => ctrl_reg
); );
END str; END str;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment