Modify ports of rtps_builtin_endpoint according to port naming convention

The ports to rtps_out from the rtps_reader and rtps_writer entities were
also modified to apply a uniform naming.
This commit is contained in:
Greek 2021-11-18 16:44:42 +01:00
parent 399bd2bbda
commit e87d84ba24
41 changed files with 764 additions and 686 deletions

View File

@ -9,8 +9,10 @@ entity FWFT_FIFO is
);
port
(
reset : in std_logic;
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
data_in : in std_logic_vector(DATA_WIDTH-1 downto 0);
write : in std_logic;
read : in std_logic;

View File

@ -35,10 +35,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test1 is
type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_PARTICIPANTS*PARTICIPANT_FRAME_SIZE)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1'; --TODO: Do that in all testbenches
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -76,20 +76,27 @@ begin
MAX_REMOTE_PARTICIPANTS => MAX_REMOTE_PARTICIPANTS
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => TIME_ZERO,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -595,10 +602,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -606,7 +613,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -645,8 +652,8 @@ begin
output_check_prc : process(all)
begin
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB_out.empty) then
check_done <= '1';

View File

@ -107,10 +107,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test2 is
type MATCH_MATRIX_TYPE is array (0 to NUM_WRITERS-1) of std_logic_vector(0 to NUM_READERS-1);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -149,20 +149,27 @@ begin
MAX_REMOTE_PARTICIPANTS => 3
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => TIME_ZERO,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -897,10 +904,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -908,7 +915,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -948,8 +955,8 @@ begin
begin
check_done <= '0';
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB.empty) then
check_done <= '1';

View File

@ -56,10 +56,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test3 is
type TEST_STAGE_TYPE is (IDLE, BUSY);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -97,20 +97,27 @@ begin
MAX_REMOTE_PARTICIPANTS => MAX_REMOTE_PARTICIPANTS
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => TIME_ZERO,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -1244,10 +1251,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -1255,7 +1262,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -1294,8 +1301,8 @@ begin
output_check_prc : process(all)
begin
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB_out.empty) then
check_done <= '1';

View File

@ -25,10 +25,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test4 is
type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_PARTICIPANTS*PARTICIPANT_FRAME_SIZE)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -74,20 +74,27 @@ begin
MAX_REMOTE_PARTICIPANTS => MAX_REMOTE_PARTICIPANTS
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => TIME_ZERO,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -1765,10 +1772,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -1776,7 +1783,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -1815,8 +1822,8 @@ begin
output_check_prc : process(all)
begin
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB_out.empty) then
check_done <= '1';

View File

@ -28,10 +28,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test5 is
type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_PARTICIPANTS*PARTICIPANT_FRAME_SIZE)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -70,20 +70,27 @@ begin
MAX_REMOTE_PARTICIPANTS => MAX_REMOTE_PARTICIPANTS
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => test_time,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => test_time,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -301,10 +308,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -312,7 +319,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -351,8 +358,8 @@ begin
output_check_prc : process(all)
begin
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB_out.empty) then
check_done <= '1';

View File

@ -23,10 +23,10 @@ architecture testbench of L0_rtps_builtin_endpoint_test6 is
type TEST_STAGE_TYPE is (IDLE, BUSY);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal clk, in_empty, rd_sig, last_word_in, last_word_out_ue: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal wr_ue, full_ue : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out_ue : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
@ -57,20 +57,27 @@ begin
MAX_REMOTE_PARTICIPANTS => 2
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
-- SYSTEM
clk => clk,
reset => reset,
time => TIME_ZERO,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => (others => '0'),
-- TO USER ENDPOINT
full_ue => full_ue,
wr_ue => wr_ue,
data_out_ue => data_out_ue,
last_word_out_ue => last_word_out_ue,
-- RTPS OUTPUT
full_ro => '0',
wr_ro => open,
data_out_ro => open,
last_word_out_ro => open
);
stimulus_prc : process
@ -278,10 +285,10 @@ begin
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
full_ue <= (others => '0');
wait until (or wr_ue) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
full_ue <= (others => '1');
wait until rising_edge(clk);
end process;
@ -289,7 +296,7 @@ begin
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
alertif(full_ue /= (0 to NUM_ENDPOINTS-1 => '0') and (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
@ -329,8 +336,8 @@ begin
begin
check_done <= '0';
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(endpoint_wr & last_word_out & data_out);
if (wr_ue /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB_out.Check(wr_ue & last_word_out_ue & data_out_ue);
end if;
if (stim_done = '1' and SB_out.empty) then
check_done <= '1';

View File

@ -98,10 +98,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -98,10 +98,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -86,10 +86,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => wr_rtps,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => wr_rtps,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -86,10 +86,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -86,10 +86,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => wr_rtps,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => wr_rtps,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -86,10 +86,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -86,10 +86,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -82,10 +82,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -82,10 +82,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
start_hc => start_hc,
opcode_hc => opcode_hc,
ack_hc => ack_hc,

View File

@ -97,10 +97,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
liveliness_assertion => '0',
data_available => '0',
start_hc => start_hc,

View File

@ -97,10 +97,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
liveliness_assertion => '0',
data_available => '0',
start_hc => start_hc,

View File

@ -81,10 +81,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => open,
full_rtps => '0',
last_word_out_rtps => open,
data_out_rtps => open,
wr_ro => open,
full_ro => '0',
last_word_out_ro => open,
data_out_ro => open,
liveliness_assertion => '0',
data_available => '0',
start_hc => start_hc,

View File

@ -389,20 +389,27 @@ begin
MAX_REMOTE_PARTICIPANTS => 1
)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => fifo_in(WORD_WIDTH-1 downto 0),
last_word_in => last_word_in,
time => test_time,
endpoint_full => (others => '0'),
endpoint_wr => open,
rtps_wr => fifo_wr,
rtps_full => fifo_full,
last_word_out => fifo_in(WORD_WIDTH),
alive => alive
-- SYSTEM
clk => clk,
reset => reset,
time => test_time,
-- FROM RTPS HANDLER
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
last_word_in => last_word_in,
-- FROM USER ENDPOINT
alive => alive,
-- TO USER ENDPOINT
full_ue => (others => '0'),
wr_ue => open,
data_out_ue => open,
last_word_out_ue => open,
-- RTPS OUTPUT
full_ro => fifo_full,
wr_ro => fifo_wr,
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
last_word_out_ro => fifo_in(WORD_WIDTH)
);
fifo_inst : entity work.FWFT_FIFO(arch)

View File

@ -105,10 +105,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
start_hc => open,
opcode_hc => open,
ack_hc => '1',

View File

@ -106,10 +106,10 @@ begin
rd_meta => rd_meta,
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
start_hc => open,
opcode_hc => open,
ack_hc => '1',

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -104,10 +104,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => '0',
data_available => data_available,
start_hc => start_hc,

View File

@ -103,10 +103,10 @@ begin
data_in_meta => data_in_meta,
last_word_in_meta => last_word_in_meta,
alive_sig => open,
wr_rtps => fifo_wr,
full_rtps => fifo_full,
last_word_out_rtps => fifo_in(WORD_WIDTH),
data_out_rtps => fifo_in(WORD_WIDTH-1 downto 0),
wr_ro => fifo_wr,
full_ro => fifo_full,
last_word_out_ro => fifo_in(WORD_WIDTH),
data_out_ro => fifo_in(WORD_WIDTH-1 downto 0),
liveliness_assertion => liveliness_assertion,
data_available => data_available,
start_hc => start_hc,

View File

@ -244,10 +244,10 @@ begin
-- TO RTPS_BUILTIN_ENDPOINT (META TRAFFIC)
alive_sig => alive_sig_rtps(0),
-- RTPS OUTPUT
wr_rtps => wr_rtps_out(0),
full_rtps => full_rtps_out(0),
data_out_rtps => data_in_rtps_out(0)(WORD_WIDTH-1 downto 0),
last_word_out_rtps => data_in_rtps_out(0)(WORD_WIDTH),
wr_ro => wr_rtps_out(0),
full_ro => full_rtps_out(0),
data_out_ro => data_in_rtps_out(0)(WORD_WIDTH-1 downto 0),
last_word_out_ro => data_in_rtps_out(0)(WORD_WIDTH),
-- FROM HC
liveliness_assertion => liveliness_assertion_dds_rtps,
data_available => data_available_dds_rtps,
@ -273,27 +273,29 @@ begin
MAX_REMOTE_PARTICIPANTS => 5
)
port map (
clk => clk,
reset => reset,
time => time,
clk => clk,
reset => reset,
time => time,
-- FROM RTPS HANDLER
empty => empty_rh(NUM_ENDPOINTS),
rd => rd_rh(NUM_ENDPOINTS),
data_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH),
-- TO RTPS ENDPOINTS
endpoint_full => full_rtps(0 to NUM_ENDPOINTS-1),
endpoint_wr => wr_rtps(0 to NUM_ENDPOINTS-1),
alive => alive_sig_rtps(0 to NUM_ENDPOINTS-1),
empty => empty_rh(NUM_ENDPOINTS),
rd => rd_rh(NUM_ENDPOINTS),
data_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH),
-- FROM USER ENDPOINTS
alive => alive_sig_rtps(0 to NUM_ENDPOINTS-1),
-- TO USER ENDPOINTS
full_ue => full_rtps(0 to NUM_ENDPOINTS-1),
wr_ue => wr_rtps(0 to NUM_ENDPOINTS-1),
data_out_ue => data_out_rbe,
last_word_out_ue => last_word_out_rbe,
-- TO RTPS OUT
rtps_full => full_rtps_out(NUM_ENDPOINTS),
rtps_wr => wr_rtps_out(NUM_ENDPOINTS),
last_word_out => last_word_out_rbe,
data_out => data_out_rbe
full_ro => full_rtps_out(NUM_ENDPOINTS),
wr_ro => wr_rtps_out(NUM_ENDPOINTS),
data_out_ro => data_in_rtps_out(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_out_ro => data_in_rtps_out(NUM_ENDPOINTS)(WORD_WIDTH)
);
data_in_rtps(0 to NUM_ENDPOINTS-1) <= (others => (last_word_out_rbe & data_out_rbe));
data_in_rtps_out(NUM_ENDPOINTS) <= last_word_out_rbe & data_out_rbe;
rtps_handler_w_inst : entity Testbench_Lib2.rtps_handler(arch)
port map (

View File

@ -305,10 +305,10 @@ begin
data_in_meta => data_out_rtps(0)(WORD_WIDTH-1 downto 0),
last_word_in_meta => data_out_rtps(0)(WORD_WIDTH),
-- RTPS OUTPUT
wr_rtps => wr_rtps_out(0),
full_rtps => full_rtps_out(0),
data_out_rtps => data_in_rtps_out(0)(WORD_WIDTH-1 downto 0),
last_word_out_rtps => data_in_rtps_out(0)(WORD_WIDTH),
wr_ro => wr_rtps_out(0),
full_ro => full_rtps_out(0),
data_out_ro => data_in_rtps_out(0)(WORD_WIDTH-1 downto 0),
last_word_out_ro => data_in_rtps_out(0)(WORD_WIDTH),
-- TO HISTORY CACHE
start_hc => start_dds_rtps,
opcode_hc => opcode_dds_rtps,
@ -326,27 +326,29 @@ begin
MAX_REMOTE_PARTICIPANTS => 5
)
port map (
clk => clk,
reset => reset,
time => time,
clk => clk,
reset => reset,
time => time,
-- FROM RTPS HANDLER
empty => empty_rh(NUM_ENDPOINTS),
rd => rd_rh(NUM_ENDPOINTS),
data_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH),
-- TO RTPS ENDPOINTS
endpoint_full => full_rtps(0 to NUM_ENDPOINTS-1),
endpoint_wr => wr_rtps(0 to NUM_ENDPOINTS-1),
alive => alive_sig_rtps(0 to NUM_ENDPOINTS-1),
empty => empty_rh(NUM_ENDPOINTS),
rd => rd_rh(NUM_ENDPOINTS),
data_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_in => data_out_rh(NUM_ENDPOINTS)(WORD_WIDTH),
-- FROM USER ENDPOINTS
alive => alive_sig_rtps(0 to NUM_ENDPOINTS-1),
-- TO USER ENDPOINTS
full_ue => full_rtps(0 to NUM_ENDPOINTS-1),
wr_ue => wr_rtps(0 to NUM_ENDPOINTS-1),
data_out_ue => data_out_rbe,
last_word_out_ue => last_word_out_rbe,
-- TO RTPS OUT
rtps_full => full_rtps_out(NUM_ENDPOINTS),
rtps_wr => wr_rtps_out(NUM_ENDPOINTS),
last_word_out => last_word_out_rbe,
data_out => data_out_rbe
full_ro => full_rtps_out(NUM_ENDPOINTS),
wr_ro => wr_rtps_out(NUM_ENDPOINTS),
data_out_ro => data_in_rtps_out(NUM_ENDPOINTS)(WORD_WIDTH-1 downto 0),
last_word_out_ro => data_in_rtps_out(NUM_ENDPOINTS)(WORD_WIDTH)
);
data_in_rtps(0 to NUM_ENDPOINTS-1) <= (others => (last_word_out_rbe & data_out_rbe));
data_in_rtps_out(NUM_ENDPOINTS) <= last_word_out_rbe & data_out_rbe;
rtps_handler_r_inst : entity Testbench_Lib3.rtps_handler(arch)
port map (

View File

@ -120,7 +120,7 @@ begin
fifo_r_w_inst : entity work.FWFT_FIFO(arch)
generic map (
FIFO_DEPTH => 65536,
FIFO_DEPTH => 65536/(WORD_WIDTH/BYTE_WIDTH),
DATA_WIDTH => WORD_WIDTH
)
port map
@ -138,7 +138,7 @@ begin
fifo_w_r_inst : entity work.FWFT_FIFO(arch)
generic map (
FIFO_DEPTH => 65536,
FIFO_DEPTH => 65536/(WORD_WIDTH/BYTE_WIDTH),
DATA_WIDTH => WORD_WIDTH
)
port map

View File

@ -4,17 +4,18 @@ use ieee.numeric_std.all;
entity key_hash_generator is
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
-- CONTROL
start : in std_logic;
ack : out std_logic;
-- INPUT
data_in : in std_logic_vector(7 downto 0);
valid_in : in std_logic;
ready_in : out std_logic;
last_word_in : in std_logic;
-- OUTPUT
key_hash : out std_logic_vector(127 downto 0);
done : out std_logic
);

View File

@ -7,20 +7,21 @@ use work.rtps_config_package.all;
entity key_holder is
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
-- CONTROL
start : in std_logic;
opcode : in KEY_HOLDER_OPCODE_TYPE;
ack : out std_logic;
decode_error : out std_logic;
abort : in std_logic;
-- INPUT
data_in : in std_logic_vector(WORD_WIDTH-1 downto 0);
valid_in : in std_logic;
ready_in : out std_logic;
last_word_in : in std_logic;
-- OUTPUT
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0);
valid_out : out std_logic;
ready_out : in std_logic;

View File

@ -10,8 +10,10 @@ entity mem_ctrl is
MAX_BURST_LENGTH : natural
);
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
addr : in std_logic_vector(ADDR_WIDTH-1 downto 0);
read : in std_logic;
ready_in : out std_logic;

View File

@ -12,20 +12,27 @@ entity rtps_builtin_endpoint is
MAX_REMOTE_PARTICIPANTS : natural := 50
);
port (
clk : in std_logic; -- Input Clock
reset : in std_logic; -- Synchronous Reset
empty : in std_logic; -- Input FIFO empty flag
rd : out std_logic; -- Input FIFO read signal
data_in : in std_logic_vector(WORD_WIDTH-1 downto 0); -- Input FIFO data signal
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in : in std_logic;
time : in TIME_TYPE;
endpoint_full : in std_logic_vector(0 to NUM_ENDPOINTS-1);
endpoint_wr : out std_logic_vector(0 to NUM_ENDPOINTS-1);
rtps_wr : out std_logic;
rtps_full : in std_logic;
last_word_out : out std_logic;
alive : in std_logic_vector(0 to NUM_ENDPOINTS-1)
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
time : in TIME_TYPE;
-- FROM RTPS HANDLER
empty : in std_logic;
rd : out std_logic;
data_in : in std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in : in std_logic;
-- FROM USER ENDPOINTS
alive : in std_logic_vector(0 to NUM_ENDPOINTS-1);
-- TO USER ENDPOINTS
full_ue : in std_logic_vector(0 to NUM_ENDPOINTS-1);
wr_ue : out std_logic_vector(0 to NUM_ENDPOINTS-1);
data_out_ue : out std_logic_vector(WORD_WIDTH-1 downto 0); -- one-to-many (Multicast) Connection
last_word_out_ue : out std_logic; -- one-to-many (Multicast) Connection
-- RTPS OUTPUT
full_ro : in std_logic;
wr_ro : out std_logic;
data_out_ro : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_out_ro : out std_logic
);
end entity;
@ -351,6 +358,10 @@ architecture arch of rtps_builtin_endpoint is
signal idle_sig : std_logic := '0';
-- Signifies that we received an Unregister/Dispose Status Info
signal ud_status, ud_status_next : std_logic := '0';
-- Internal Signal for data_out
signal data_out_sig : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
-- Internal Signal for last_word_out
signal last_word_out_sig : std_logic := '0';
-- *MEMORY PROCESS*
-- Memory FSM State
@ -512,30 +523,35 @@ begin
-- This process connects the Intermediate Output Signals to the actual output FIFOs
output_prc : process(all)
begin
endpoint_wr <= (others => '0');
rtps_wr <= '0';
wr_ue <= (others => '0');
wr_ro <= '0';
case (stage) is
when INFORM_ENDPOINTS_MATCH =>
if (wr_sig = '1') then
endpoint_wr <= endpoint_mask;
wr_ue <= endpoint_mask;
end if;
when INFORM_ENDPOINTS_UNMATCH =>
if (wr_sig = '1') then
endpoint_wr <= not endpoint_mask;
wr_ue <= not endpoint_mask;
end if;
when INFORM_ENDPOINTS_PARTICIPANT_UNMATCH =>
if (wr_sig = '1') then
endpoint_wr <= (others => '1');
wr_ue <= (others => '1');
end if;
when LIVELINESS_UPDATE =>
if (wr_sig = '1') then
endpoint_wr <= endpoint_mask;
wr_ue <= endpoint_mask;
end if;
when others =>
rtps_wr <= wr_sig;
wr_ro <= wr_sig;
end case;
end process;
data_out_ue <= data_out_sig;
data_out_ro <= data_out_sig;
last_word_out_ue <= last_word_out_sig;
last_word_out_ro <= last_word_out_sig;
-- Main State Machine
-- STATE DESCRIPTION
-- IDLE Idle state. Initiates Participant Announcements, Heartbeat/Liveliness Assertions, Stale Participant Entry Checks ,and Packet Processing, in that priority order.
@ -666,10 +682,10 @@ begin
wr_sig <= '0';
mem_opcode <= NOP;
mem_op_start <= '0';
last_word_out <= '0';
last_word_out_sig <= '0';
reset_endpoint_alive <= '0';
idle_sig <= '0';
data_out <= (others => '0');
data_out_sig <= (others => '0');
mem_field_flags <= (others => '0');
extra_flags <= (others => '0');
mem_addr_update <= PARTICIPANT_MEMORY_MAX_ADDRESS;
@ -1392,26 +1408,26 @@ begin
-- DONE
stage_next <= SKIP_PACKET;
-- Output FIFO Guard
elsif ((endpoint_mask and endpoint_full) = (endpoint_full'range => '0')) then
elsif ((endpoint_mask and full_ue) = (full_ue'range => '0')) then
wr_sig <= '1';
case (cnt) is
-- Liveliness Assertion Opcode
when 0 =>
data_out <= OPCODE_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
data_out_sig <= OPCODE_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
-- GUID Prefix 1/3
when 1 =>
data_out <= guid(0);
cnt_next <= cnt + 1;
data_out_sig <= guid(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 2 =>
data_out <= guid(1);
cnt_next <= cnt + 1;
data_out_sig <= guid(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 3 =>
data_out <= guid(2);
last_word_out <= '1';
data_out_sig <= guid(2);
last_word_out_sig <= '1';
-- DONE
stage_next <= SKIP_PACKET;
@ -2880,54 +2896,54 @@ begin
assert check_mask(current_pmf, PMF_DEFAULT_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG) severity FAILURE;
-- Output FIFO Guard
if ((endpoint_mask and endpoint_full) = (endpoint_full'range => '0')) then
if ((endpoint_mask and full_ue) = (full_ue'range => '0')) then
wr_sig <= '1';
case (cnt) is
-- Match Opcode
when 0 =>
data_out <= OPCODE_ENDPOINT_MATCH;
cnt_next <= cnt + 1;
data_out_sig <= OPCODE_ENDPOINT_MATCH;
cnt_next <= cnt + 1;
-- GUID Prefix 1/3
when 1 =>
data_out <= guid(0);
cnt_next <= cnt + 1;
data_out_sig <= guid(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 2 =>
data_out <= guid(1);
cnt_next <= cnt + 1;
data_out_sig <= guid(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 3 =>
data_out <= guid(2);
cnt_next <= cnt + 1;
data_out_sig <= guid(2);
cnt_next <= cnt + 1;
-- Entity ID
when 4 =>
data_out <= guid(3);
cnt_next <= cnt + 1;
data_out_sig <= guid(3);
cnt_next <= cnt + 1;
-- IPv4 Address
when 5 =>
-- If Endpoint did not set Address, use Participant Default
if (def_addr /= (def_addr'reverse_range => '0')) then
data_out <= def_addr;
data_out_sig <= def_addr;
else
data_out <= participant_data.def_addr;
data_out_sig <= participant_data.def_addr;
end if;
cnt_next <= cnt + 1;
-- UDPv4 Port and Reader Flags
when 6 =>
-- Default
data_out <= (others => '0');
last_word_out <= '1';
data_out_sig <= (others => '0');
last_word_out_sig <= '1';
-- If Endpoint did not set Port, use Participant Default
if (def_port /= (def_port'reverse_range => '0')) then
data_out(31 downto 16) <= def_port;
data_out_sig(31 downto 16) <= def_port;
else
data_out(31 downto 16) <= participant_data.def_port;
data_out_sig(31 downto 16) <= participant_data.def_port;
end if;
if (is_subscriber = '1') then
data_out(15 downto 0) <= reader_flags;
data_out_sig(15 downto 0) <= reader_flags;
end if;
-- DONE
@ -2940,30 +2956,30 @@ begin
end if;
when INFORM_ENDPOINTS_UNMATCH =>
-- Output FIFO Guard
if (((not endpoint_mask) and endpoint_full) = (endpoint_full'range => '0')) then
if (((not endpoint_mask) and full_ue) = (full_ue'range => '0')) then
wr_sig <= '1';
case (cnt) is
-- Match Opcode
when 0 =>
data_out <= OPCODE_ENDPOINT_UNMATCH;
cnt_next <= cnt + 1;
data_out_sig <= OPCODE_ENDPOINT_UNMATCH;
cnt_next <= cnt + 1;
-- GUID Prefix 1/3
when 1 =>
data_out <= guid(0);
cnt_next <= cnt + 1;
data_out_sig <= guid(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 2 =>
data_out <= guid(1);
cnt_next <= cnt + 1;
data_out_sig <= guid(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 3 =>
data_out <= guid(2);
cnt_next <= cnt + 1;
data_out_sig <= guid(2);
cnt_next <= cnt + 1;
-- Entity ID
when 4 =>
data_out <= guid(3);
last_word_out <= '1';
data_out_sig <= guid(3);
last_word_out_sig <= '1';
-- DONE
stage_next <= SKIP_PACKET;
@ -2973,26 +2989,26 @@ begin
end if;
when INFORM_ENDPOINTS_PARTICIPANT_UNMATCH =>
-- Output FIFO Guard
if (endpoint_full = (endpoint_full'range => '0')) then
if (full_ue = (full_ue'range => '0')) then
wr_sig <= '1';
case (cnt) is
-- Match Opcode
when 0 =>
data_out <= OPCODE_PARTICIPANT_UNMATCH;
cnt_next <= cnt + 1;
data_out_sig <= OPCODE_PARTICIPANT_UNMATCH;
cnt_next <= cnt + 1;
-- GUID Prefix 1/3
when 1 =>
data_out <= guid(0);
cnt_next <= cnt + 1;
data_out_sig <= guid(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 2 =>
data_out <= guid(1);
cnt_next <= cnt + 1;
data_out_sig <= guid(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 3 =>
data_out <= guid(2);
last_word_out <= '1';
data_out_sig <= guid(2);
last_word_out_sig <= '1';
-- Currently in Stale Check
if (stale_check = '1') then
@ -3015,48 +3031,48 @@ begin
assert check_mask(current_pmf, PMF_META_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG) severity FAILURE;
end if;
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- OUTPUT HEADER
-- Src IPv4 Address
when 0 =>
data_out <= DEFAULT_IPv4_ADDRESS;
data_out_sig <= DEFAULT_IPv4_ADDRESS;
cnt_next <= cnt + 1;
-- Dest IPv4 Address
when 1 =>
-- Set Default Multicast Announce Address if Participant Announcement
if (return_stage = SEND_PARTICIPANT_ANNOUNCEMENT) then
data_out <= DEFAULT_IPv4_META_ADDRESS;
data_out_sig <= DEFAULT_IPv4_META_ADDRESS;
else
data_out <= participant_data.meta_addr;
data_out_sig <= participant_data.meta_addr;
end if;
cnt_next <= cnt + 1;
-- Src and Dest UDPv4 Ports
when 2 =>
-- Set Default Multicast Announce Port if Participant Announcement
if (return_stage = SEND_PARTICIPANT_ANNOUNCEMENT) then
data_out <= META_IPv4_UNICAST_PORT & META_IPv4_MULTICAST_PORT;
data_out_sig <= META_IPv4_UNICAST_PORT & META_IPv4_MULTICAST_PORT;
else
data_out <= META_IPv4_UNICAST_PORT & participant_data.meta_port;
data_out_sig <= META_IPv4_UNICAST_PORT & participant_data.meta_port;
end if;
cnt_next <= cnt + 1;
-- RTPS MESSAGE HEADER
when 3 =>
data_out <= PROTOCOL_RTPS;
cnt_next <= cnt + 1;
data_out_sig <= PROTOCOL_RTPS;
cnt_next <= cnt + 1;
when 4 =>
data_out <= PROTOCOLVERSION_2_4 & VENDORID;
cnt_next <= cnt + 1;
data_out_sig <= PROTOCOLVERSION_2_4 & VENDORID;
cnt_next <= cnt + 1;
when 5 =>
data_out <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
when 6 =>
data_out <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
when 7 =>
data_out <= GUIDPREFIX(2);
data_out_sig <= GUIDPREFIX(2);
-- Continue with respective RTPS Submessage
stage_next <= return_stage;
@ -3070,15 +3086,15 @@ begin
end if;
end if;
when SEND_PARTICIPANT_ANNOUNCEMENT =>
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
-- Send Participant Data
data_out <= LOCAL_PARTICIPANT_DATA.data(participant_data_cnt);
data_out_sig <= LOCAL_PARTICIPANT_DATA.data(participant_data_cnt);
-- Exit Condition
if (participant_data_cnt = (LOCAL_PARTICIPANT_DATA.length-1)) then
last_word_out <= '1';
last_word_out_sig <= '1';
-- DONE
stage_next <= IDLE;
else
@ -3092,115 +3108,115 @@ begin
if (mem_op_done = '1') then
assert check_mask(current_pmf, PMF_PUB_SEQ_NR_FLAG or PMF_SUB_SEQ_NR_FLAG or PMF_MES_SEQ_NR_FLAG) severity FAILURE;
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- ACKNACK RTPS SUBMESSAGE (Publication)
-- RTPS Submessage Header
when 0 =>
data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 1/2)
when 3 =>
data_out <= std_logic_vector(participant_data.pub_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.pub_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 2/2)
when 4 =>
data_out <= std_logic_vector(participant_data.pub_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.pub_seq_nr(1));
cnt_next <= cnt + 1;
-- Sequence Number Set (NumBits)
when 5 =>
data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap)
when 6 =>
-- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet)
-- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist)
data_out <= (others => '1');
cnt_next <= cnt + 1;
data_out_sig <= (others => '1');
cnt_next <= cnt + 1;
-- Count
when 7 =>
data_out <= std_logic_vector(count);
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(count);
cnt_next <= cnt + 1;
-- ACKNACK RTPS SUBMESSAGE (Subscription)
-- RTPS Submessage Header
when 8 =>
data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 9 =>
data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 10 =>
data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 1/2)
when 11 =>
data_out <= std_logic_vector(participant_data.sub_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.sub_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 2/2)
when 12 =>
data_out <= std_logic_vector(participant_data.sub_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.sub_seq_nr(1));
cnt_next <= cnt + 1;
-- Sequence Number Set (NumBits)
when 13 =>
data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap)
when 14 =>
-- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet)
-- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist)
data_out <= (others => '1');
cnt_next <= cnt + 1;
data_out_sig <= (others => '1');
cnt_next <= cnt + 1;
-- Count
when 15 =>
data_out <= std_logic_vector(count);
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(count);
cnt_next <= cnt + 1;
-- ACKNACK RTPS SUBMESSAGE (Message)
-- RTPS Submessage Header
when 16 =>
data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 17 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 18 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 1/2)
when 19 =>
data_out <= std_logic_vector(participant_data.mes_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.mes_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 2/2)
when 20 =>
data_out <= std_logic_vector(participant_data.mes_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(participant_data.mes_seq_nr(1));
cnt_next <= cnt + 1;
-- Sequence Number Set (NumBits)
when 21 =>
data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap)
when 22 =>
-- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet)
-- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist)
data_out <= (others => '1');
cnt_next <= cnt + 1;
data_out_sig <= (others => '1');
cnt_next <= cnt + 1;
-- Count
when 23 =>
data_out <= std_logic_vector(count);
last_word_out <= '1';
data_out_sig <= std_logic_vector(count);
last_word_out_sig <= '1';
-- Continue
stage_next <= PARTICIPANT_STALE_CHECK;
@ -3211,108 +3227,108 @@ begin
end if;
end if;
when SEND_HEARTBEAT =>
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- HEARTBEAT RTPS SUBMESSAGE (Publication)
-- RTPS Submessage Header
when 0 =>
data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 3 =>
data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(FIRST_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 4 =>
data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(FIRST_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 5 =>
data_out <= std_logic_vector(PUB_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(PUB_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 6 =>
data_out <= std_logic_vector(PUB_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(PUB_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
-- Count
when 7 =>
data_out <= std_logic_vector(count);
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(count);
cnt_next <= cnt + 1;
-- HEARTBEAT RTPS SUBMESSAGE (Subscription)
-- RTPS Submessage Header
when 8 =>
data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 9 =>
data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 10 =>
data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 11 =>
data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(FIRST_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 12 =>
data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(FIRST_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 13 =>
data_out <= std_logic_vector(SUB_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(SUB_SEQUENCENUMBER(0));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 14 =>
data_out <= std_logic_vector(SUB_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(SUB_SEQUENCENUMBER(1));
cnt_next <= cnt + 1;
-- Count
when 15 =>
data_out <= std_logic_vector(count);
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(count);
cnt_next <= cnt + 1;
-- HEARTBEAT RTPS SUBMESSAGE (Message)
-- RTPS Submessage Header
when 16 =>
data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 17 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 18 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 19 =>
data_out <= std_logic_vector(man_live_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(man_live_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 20 =>
data_out <= std_logic_vector(man_live_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(man_live_seq_nr(1));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 21 =>
data_out <= std_logic_vector(auto_live_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(auto_live_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 22 =>
data_out <= std_logic_vector(auto_live_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(auto_live_seq_nr(1));
cnt_next <= cnt + 1;
-- Count
when 23 =>
data_out <= std_logic_vector(count);
data_out_sig <= std_logic_vector(count);
-- If manual and automatic sequence numbers are not consecutive, we have only asserted the automatic liveliness
if (live_gap_start /= auto_live_seq_nr) then
@ -3338,15 +3354,15 @@ begin
if (not check_mask(participant_data.extra_flags, EF_PUB_DATA_FLAG) or NUM_WRITERS = 0) then
stage_next <= SEND_SUB_DATA;
-- Output FIFO Guard
elsif (rtps_full = '0') then
elsif (full_ro = '0') then
wr_sig <= '1';
-- Send Publisher Data
data_out <= WRITER_ENDPOINT_DATA.data(publisher_data_cnt);
data_out_sig <= WRITER_ENDPOINT_DATA.data(publisher_data_cnt);
-- Exit Condition
if (publisher_data_cnt = (WRITER_ENDPOINT_DATA.length-1)) then
last_word_out <= '1';
last_word_out_sig <= '1';
-- If we still have Data to sent, continue
if (check_mask(participant_data.extra_flags, EF_SUB_DATA_FLAG) or check_mask(participant_data.extra_flags, EF_MES_DATA_FLAG)) then
stage_next <= SEND_HEADER;
@ -3377,15 +3393,15 @@ begin
stage_next <= SEND_MES_MAN_LIVE;
cnt_next <= 0;
-- Output FIFO Guard
elsif (rtps_full = '0') then
elsif (full_ro = '0') then
wr_sig <= '1';
-- Send Subscriber Data
data_out <= READER_ENDPOINT_DATA.data(subscriber_data_cnt);
data_out_sig <= READER_ENDPOINT_DATA.data(subscriber_data_cnt);
-- Exit Condition
if (subscriber_data_cnt = (READER_ENDPOINT_DATA.length-1)) then
last_word_out <= '1';
last_word_out_sig <= '1';
-- If we still have Data to sent, continue
if (check_mask(participant_data.extra_flags, EF_MES_DATA_FLAG)) then
stage_next <= SEND_HEADER;
@ -3406,59 +3422,59 @@ begin
end if;
when SEND_MES_MAN_LIVE =>
-- Output FIFO Guard
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- DATA RTPS SUBMESSAGE (Participant Message)
-- RTPS Submessage Header
when 0 =>
data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16));
cnt_next <= cnt + 1;
-- ExtraFlags, octetsToInlineQoS
when 1 =>
data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16));
cnt_next <= cnt + 1;
data_out_sig <= x"0000" & std_logic_vector(to_unsigned(16, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 2 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 3 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 4 =>
data_out <= std_logic_vector(man_live_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(man_live_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 5 =>
data_out <= std_logic_vector(man_live_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(man_live_seq_nr(1));
cnt_next <= cnt + 1;
-- Serialized Payload Header
when 6 =>
data_out <= CDR_BE & x"0000";
cnt_next <= cnt + 1;
data_out_sig <= CDR_BE & x"0000";
cnt_next <= cnt + 1;
-- Serialized Payload BEGIN
-- GUID Prefix 1/3
when 7 =>
data_out <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 8 =>
data_out <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 9 =>
data_out <= GUIDPREFIX(2);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(2);
cnt_next <= cnt + 1;
-- Participant Message Kind
when 10 =>
data_out <= PARTICIPANT_MESSAGE_DATA_KIND_MANUAL_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
data_out_sig <= PARTICIPANT_MESSAGE_DATA_KIND_MANUAL_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
-- Data Length
when 11 =>
data_out <= (others => '0');
data_out_sig <= (others => '0');
-- If manual and automatic sequence numbers are not consecutive, we need to send a GAP Message
if (live_gap_start /= auto_live_seq_nr) then
stage_next <= SEND_MES_GAP;
@ -3473,104 +3489,104 @@ begin
end if;
when SEND_MES_GAP =>
-- Output FIFO Guard
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- DATA RTPS SUBMESSAGE (Participant Message)
-- RTPS Submessage Header
when 0 =>
data_out <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
-- GAP Start Sequence Number 1/2
when 3 =>
data_out <= std_logic_vector(live_gap_start(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(live_gap_start(0));
cnt_next <= cnt + 1;
-- GAP Start Sequence Number 2/2
when 4 =>
data_out <= std_logic_vector(live_gap_start(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(live_gap_start(1));
cnt_next <= cnt + 1;
-- GAP End Sequence Number Set (Bitmap Base 1/2)
when 5 =>
data_out <= std_logic_vector(live_gap_end(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(live_gap_end(0));
cnt_next <= cnt + 1;
-- GAP End Sequence Number Set (Bitmap Base 2/2)
when 6 =>
data_out <= std_logic_vector(live_gap_end(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(live_gap_end(1));
cnt_next <= cnt + 1;
-- GAP End Sequence Number Set (NumBits)
when 7 =>
data_out <= (others => '0');
stage_next <= SEND_MES_AUTO_LIVE;
cnt_next <= 0;
data_out_sig <= (others => '0');
stage_next <= SEND_MES_AUTO_LIVE;
cnt_next <= 0;
when others =>
null;
end case;
end if;
when SEND_MES_AUTO_LIVE =>
-- Output FIFO Guard
if (rtps_full = '0') then
if (full_ro = '0') then
wr_sig <= '1';
case (cnt) is
-- DATA RTPS SUBMESSAGE (Participant Message)
-- RTPS Submessage Header
when 0 =>
data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16));
cnt_next <= cnt + 1;
data_out_sig <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16));
cnt_next <= cnt + 1;
-- ExtraFlags, octetsToInlineQoS
when 1 =>
data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16));
cnt_next <= cnt + 1;
data_out_sig <= x"0000" & std_logic_vector(to_unsigned(16, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 2 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 3 =>
data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
data_out_sig <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER;
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 4 =>
data_out <= std_logic_vector(auto_live_seq_nr(0));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(auto_live_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 5 =>
data_out <= std_logic_vector(auto_live_seq_nr(1));
cnt_next <= cnt + 1;
data_out_sig <= std_logic_vector(auto_live_seq_nr(1));
cnt_next <= cnt + 1;
-- Serialized Payload Header
when 6 =>
data_out <= CDR_BE & x"0000";
cnt_next <= cnt + 1;
data_out_sig <= CDR_BE & x"0000";
cnt_next <= cnt + 1;
-- Serialized Payload BEGIN
-- GUID Prefix 1/3
when 7 =>
data_out <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
-- GUID Prefix 2/3
when 8 =>
data_out <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
-- GUID Prefix 3/3
when 9 =>
data_out <= GUIDPREFIX(2);
cnt_next <= cnt + 1;
data_out_sig <= GUIDPREFIX(2);
cnt_next <= cnt + 1;
-- Participant Message Kind
when 10 =>
data_out <= PARTICIPANT_MESSAGE_DATA_KIND_AUTOMATIC_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
data_out_sig <= PARTICIPANT_MESSAGE_DATA_KIND_AUTOMATIC_LIVELINESS_UPDATE;
cnt_next <= cnt + 1;
-- Data Length
when 11 =>
data_out <= (others => '0');
last_word_out <= '1';
data_out_sig <= (others => '0');
last_word_out_sig <= '1';
-- If we are in the middle of a liveliness assertion, find the next Participant destination
if (is_live_assert = '1') then
@ -3640,7 +3656,7 @@ begin
-- Force rd_sig low
rd_sig <= '0';
-- Notify Endpoints of EOP
last_word_out <= '1'; -- TODO: Necessary? (We do not pass through input to output, so a EOP should not leave us "stranded" during a write out)
last_word_out_sig <= '1'; -- TODO: Necessary? (We do not pass through input to output, so a EOP should not leave us "stranded" during a write out)
-- Continue parsing next Packet
stage_next <= IDLE;
-- Reset Last Word In Latch
@ -3655,7 +3671,7 @@ begin
-- Force rd_sig low
rd_sig <= '0';
-- Notify Endpoints of EOP
last_word_out <= '1';
last_word_out_sig <= '1';
-- Invalid Parameter Length, Skip Packet
stage_next <= SKIP_PACKET;
-- Reset Parameter End

View File

@ -9,18 +9,21 @@ use work.rtps_config_package.all;
entity rtps_out is
generic (
-- Max Serialized Payload Size in a UDP Stream (Bytes) [MAX_PAYLOAD(65536) - IPv4_HEADER(20) - UDP_HEADER(8) + FORMAT_HEADER(16)]
MAX_BUFFER_SIZE : natural := 65524/4
MAX_BUFFER_SIZE : natural := 65524/(WORD_WIDTH/BYTE_WIDTH)
);
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
-- INPUT
full : in std_logic;
wr : out std_logic;
data_in : in RTPS_OUT_DATA_TYPE;
last_word_in: in std_logic_vector(0 to NUM_ENDPOINTS);
rd : out std_logic_vector(0 to NUM_ENDPOINTS);
-- OUTPUT
empty : in std_logic_vector(0 to NUM_ENDPOINTS);
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0);
wr : out std_logic;
full : in std_logic
rd : out std_logic_vector(0 to NUM_ENDPOINTS);
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0)
);
end entity;

View File

@ -28,21 +28,21 @@ entity rtps_reader is
clk : in std_logic;
reset : in std_logic;
time : in TIME_TYPE;
-- FROM RTPS_HANDLER (USER TRAFFIC)
-- FROM RTPS HANDLER (USER TRAFFIC)
empty_user : in std_logic;
rd_user : out std_logic;
data_in_user : in std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in_user : in std_logic;
-- FROM RTPS_BUILTIN_ENDPOINT (META TRAFFIC)
-- FROM RTPS BUILTIN ENDPOINT (META TRAFFIC)
empty_meta : in std_logic;
rd_meta : out std_logic;
data_in_meta : in std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in_meta : in std_logic;
-- RTPS OUTPUT
wr_rtps : out std_logic;
full_rtps : in std_logic;
last_word_out_rtps : out std_logic;
data_out_rtps : out std_logic_vector(WORD_WIDTH-1 downto 0);
full_ro : in std_logic;
wr_ro : out std_logic;
data_out_ro : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_out_ro : out std_logic;
-- TO HISTORY CACHE
start_hc : out std_logic;
opcode_hc : out HISTORY_CACHE_OPCODE_TYPE;
@ -435,13 +435,13 @@ begin
start_hc <= '0';
valid_out_hc <= '0';
last_word_out_hc <= '0';
wr_rtps <= '0';
last_word_out_rtps <= '0';
wr_ro <= '0';
last_word_out_ro <= '0';
idle_sig <= '0';
rd_guard := '0';
mem_field_flags <= (others => '0');
data_out_hc <= (others => '0');
data_out_rtps <= (others => '0');
data_out_ro <= (others => '0');
mem_addr_update <= (others => '0');
@ -1557,38 +1557,38 @@ begin
assert check_mask(current_emf, EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG) severity FAILURE;
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- OUTPUT HEADER
-- Src IPv4 Address
when 0 =>
data_out_rtps <= DEFAULT_IPv4_ADDRESS;
cnt_next <= cnt + 1;
data_out_ro <= DEFAULT_IPv4_ADDRESS;
cnt_next <= cnt + 1;
-- Dest IPv4 Address
when 1 =>
data_out_rtps <= mem_endpoint_data.addr;
data_out_ro <= mem_endpoint_data.addr;
cnt_next <= cnt + 1;
-- Src and Dest UDPv4 Ports
when 2 =>
data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn;
data_out_ro <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn;
cnt_next <= cnt + 1;
-- RTPS MESSAGE HEADER
when 3 =>
data_out_rtps <= PROTOCOL_RTPS;
data_out_ro <= PROTOCOL_RTPS;
cnt_next <= cnt + 1;
when 4 =>
data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID;
data_out_ro <= PROTOCOLVERSION_2_4 & VENDORID;
cnt_next <= cnt + 1;
when 5 =>
data_out_rtps <= GUIDPREFIX(0);
data_out_ro <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
when 6 =>
data_out_rtps <= GUIDPREFIX(1);
data_out_ro <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
when 7 =>
data_out_rtps <= GUIDPREFIX(2);
data_out_ro <= GUIDPREFIX(2);
-- Continue with respective RTPS Submessage
stage_next <= return_stage;
@ -1606,45 +1606,45 @@ begin
assert check_mask(current_emf, EMF_ENTITYID_FLAG or EMF_NEXT_SEQ_NR_FLAG) severity FAILURE;
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- ACKNACK RTPS SUBMESSAGE
-- RTPS Submessage Header
when 0 =>
data_out_rtps <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, SUBMESSAGE_LENGTH_WIDTH));
data_out_ro <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, SUBMESSAGE_LENGTH_WIDTH));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out_rtps <= ENTITYID;
data_out_ro <= ENTITYID;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out_rtps <= mem_endpoint_data.guid(3);
data_out_ro <= mem_endpoint_data.guid(3);
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 1/2)
when 3 =>
data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(0));
data_out_ro <= std_logic_vector(mem_endpoint_data.next_seq_nr(0));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap Base 2/2)
when 4 =>
data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(1));
data_out_ro <= std_logic_vector(mem_endpoint_data.next_seq_nr(1));
cnt_next <= cnt + 1;
-- Sequence Number Set (NumBits)
when 5 =>
data_out_rtps <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
data_out_ro <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH));
cnt_next <= cnt + 1;
-- Sequence Number Set (Bitmap)
when 6 =>
-- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet)
-- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist)
data_out_rtps <= (others => '1');
data_out_ro <= (others => '1');
cnt_next <= cnt + 1;
-- Count
when 7 =>
data_out_rtps <= std_logic_vector(count);
last_word_out_rtps <= '1';
data_out_ro <= std_logic_vector(count);
last_word_out_ro <= '1';
-- Stale Check in Progress
if (stale_check = '1') then

View File

@ -31,24 +31,24 @@ entity rtps_writer is
clk : in std_logic;
reset : in std_logic;
time : in TIME_TYPE;
-- FROM RTPS_HANDLER (USER TRAFFIC)
-- FROM RTPS HANDLER (USER TRAFFIC)
empty_user : in std_logic;
rd_user : out std_logic;
data_in_user : in std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in_user : in std_logic;
-- FROM RTPS_BUILTIN_ENDPOINT (META TRAFFIC)
-- FROM RTPS BUILTIN ENDPOINT (META TRAFFIC)
empty_meta : in std_logic;
rd_meta : out std_logic;
data_in_meta : in std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_in_meta : in std_logic;
-- TO RTPS_BUILTIN_ENDPOINT (META TRAFFIC)
-- TO RTPS BUILTIN ENDPOINT (META TRAFFIC)
alive_sig : out std_logic;
-- RTPS OUTPUT
wr_rtps : out std_logic;
full_rtps : in std_logic;
last_word_out_rtps : out std_logic;
data_out_rtps : out std_logic_vector(WORD_WIDTH-1 downto 0);
-- FROM HC
full_ro : in std_logic;
wr_ro : out std_logic;
data_out_ro : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_out_ro : out std_logic;
-- FROM HISTORY CACHE
liveliness_assertion : in std_logic;
data_available : in std_logic;
start_hc : out std_logic;
@ -328,10 +328,10 @@ architecture arch of rtps_writer is
alias final_flag : std_logic is rtps_flags(1);
alias liveliness_flag : std_logic is rtps_flags(2);
-- RTPS OUT DATA SUBMESSAGE FLAGS
alias qos_flag : std_logic is data_out_rtps(17);
alias data_flag : std_logic is data_out_rtps(18);
alias key_flag : std_logic is data_out_rtps(19);
alias non_std_flag : std_logic is data_out_rtps(20);
alias qos_flag : std_logic is data_out_ro(17);
alias data_flag : std_logic is data_out_ro(18);
alias key_flag : std_logic is data_out_ro(19);
alias non_std_flag : std_logic is data_out_ro(20);
-- ACKNACK
alias nack_base : SEQUENCENUMBER_TYPE is sn_latch_1;
alias nack_base_next : SEQUENCENUMBER_TYPE is sn_latch_1_next;
@ -463,8 +463,8 @@ begin
alive_sig <= '0';
rd_meta <= '0';
rd_user <= '0';
wr_rtps <= '0';
last_word_out_rtps <= '0';
wr_ro <= '0';
last_word_out_ro <= '0';
mem_op_start <= '0';
start_hc <= '0';
ready_in_hc <= '0';
@ -473,7 +473,7 @@ begin
seq_nr <= SEQUENCENUMBER_UNKNOWN;
seq_nr_hc <= SEQUENCENUMBER_UNKNOWN;
mem_field_flags <= (others => '0');
data_out_rtps <= (others => '0');
data_out_ro <= (others => '0');
mem_addr_update <= (others => '0');
-- Assert Liveliness Latch Setter
@ -1639,38 +1639,38 @@ begin
assert check_mask(current_emf, EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG) severity FAILURE;
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- OUTPUT HEADER
-- Src IPv4 Address
when 0 =>
data_out_rtps <= DEFAULT_IPv4_ADDRESS;
data_out_ro <= DEFAULT_IPv4_ADDRESS;
cnt_next <= cnt + 1;
-- Dest IPv4 Address
when 1 =>
data_out_rtps <= mem_endpoint_data.addr;
data_out_ro <= mem_endpoint_data.addr;
cnt_next <= cnt + 1;
-- Src and Dest UDPv4 Ports
when 2 =>
data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn;
data_out_ro <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn;
cnt_next <= cnt + 1;
-- RTPS MESSAGE HEADER
when 3 =>
data_out_rtps <= PROTOCOL_RTPS;
data_out_ro <= PROTOCOL_RTPS;
cnt_next <= cnt + 1;
when 4 =>
data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID;
data_out_ro <= PROTOCOLVERSION_2_4 & VENDORID;
cnt_next <= cnt + 1;
when 5 =>
data_out_rtps <= GUIDPREFIX(0);
data_out_ro <= GUIDPREFIX(0);
cnt_next <= cnt + 1;
when 6 =>
data_out_rtps <= GUIDPREFIX(1);
data_out_ro <= GUIDPREFIX(1);
cnt_next <= cnt + 1;
when 7 =>
data_out_rtps <= GUIDPREFIX(2);
data_out_ro <= GUIDPREFIX(2);
-- Continue with respective RTPS Submessage
stage_next <= return_stage;
@ -1682,22 +1682,22 @@ begin
end if;
when SEND_INFO_TS =>
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- INFO_TS RTPS SUBMESSAGE
-- RTPS Submessage Header
when 0 =>
data_out_rtps <= SID_INFO_TS & "00000000" & std_logic_vector(to_unsigned(8, SUBMESSAGE_LENGTH_WIDTH));
data_out_ro <= SID_INFO_TS & "00000000" & std_logic_vector(to_unsigned(8, SUBMESSAGE_LENGTH_WIDTH));
cnt_next <= cnt + 1;
-- Source Timestamp 1/2
when 1 =>
data_out_rtps <= std_logic_vector(cc_source_timestamp(0));
data_out_ro <= std_logic_vector(cc_source_timestamp(0));
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out_rtps <= std_logic_vector(cc_source_timestamp(1));
data_out_ro <= std_logic_vector(cc_source_timestamp(1));
stage_next <= SEND_DATA_A;
cnt_next <= 0;
@ -1713,41 +1713,41 @@ begin
assert check_mask(current_emf, EMF_UDP_PORT_FLAG) severity FAILURE;
-- Output FIFO Guard
if (full_rtps = '0') then
if (full_ro = '0') then
case (cnt) is
-- DATA RTPS SUBMESSAGE
-- RTPS Submessage Header
when 0 =>
data_out_rtps <= SID_DATA & "00000000" & std_logic_vector(to_unsigned(0, SUBMESSAGE_LENGTH_WIDTH));
data_out_ro <= SID_DATA & "00000000" & std_logic_vector(to_unsigned(0, SUBMESSAGE_LENGTH_WIDTH));
data_flag <= '1' when (cc_kind = ALIVE) else '0';
key_flag <= '1' when (WITH_KEY and cc_kind /= ALIVE) else '0';
qos_flag <= '1' when (cc_kind /= ALIVE or WITH_KEY or mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') else '0';
wr_rtps <= '1';
wr_ro <= '1';
cnt_next <= cnt + 1;
-- extraFlags, octetsToInlineQoS
when 1 =>
data_out_rtps <= x"0000" & std_logic_vector(to_unsigned(16, 16));
wr_rtps <= '1';
data_out_ro <= x"0000" & std_logic_vector(to_unsigned(16, 16));
wr_ro <= '1';
cnt_next <= cnt + 1;
-- Reader Entity ID
when 2 =>
data_out_rtps <= ENTITYID_UNKNOWN;
wr_rtps <= '1';
data_out_ro <= ENTITYID_UNKNOWN;
wr_ro <= '1';
cnt_next <= cnt + 1;
-- Writer Entity ID
when 3 =>
data_out_rtps <= ENTITYID;
wr_rtps <= '1';
data_out_ro <= ENTITYID;
wr_ro <= '1';
cnt_next <= cnt + 1;
-- Sequence Number 1/2
when 4 =>
data_out_rtps <= std_logic_vector(next_seq_nr(0));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(next_seq_nr(0));
wr_ro <= '1';
cnt_next <= cnt + 1;
-- Sequence Number 2/2
when 5 =>
data_out_rtps <= std_logic_vector(next_seq_nr(1));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(next_seq_nr(1));
wr_ro <= '1';
-- Need to send Key Hash
if (WITH_KEY) then
@ -1764,7 +1764,7 @@ begin
stage_next <= SEND_DATA_B;
cnt_next <= 0;
else
last_word_out_rtps <= '1';
last_word_out_ro <= '1';
-- Continue
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then
stage_next <= HANDLE_REQUESTS;
@ -1783,40 +1783,40 @@ begin
when 6 =>
-- Synthesis Guard
if (WITH_KEY) then
data_out_rtps <= PID_KEY_HASH & std_logic_vector(to_unsigned(16, SUBMESSAGE_LENGTH_WIDTH));
wr_rtps <= '1';
data_out_ro <= PID_KEY_HASH & std_logic_vector(to_unsigned(16, SUBMESSAGE_LENGTH_WIDTH));
wr_ro <= '1';
cnt_next <= cnt + 1;
end if;
-- Key Hash 1/4
when 7 =>
-- Synthesis Guard
if (WITH_KEY) then
data_out_rtps <= std_logic_vector(cc_instance_handle(0));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(cc_instance_handle(0));
wr_ro <= '1';
cnt_next <= cnt + 1;
end if;
-- Key Hash 2/4
when 8 =>
-- Synthesis Guard
if (WITH_KEY) then
data_out_rtps <= std_logic_vector(cc_instance_handle(1));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(cc_instance_handle(1));
wr_ro <= '1';
cnt_next <= cnt + 1;
end if;
-- Key Hash 3/4
when 9 =>
-- Synthesis Guard
if (WITH_KEY) then
data_out_rtps <= std_logic_vector(cc_instance_handle(2));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(cc_instance_handle(2));
wr_ro <= '1';
cnt_next <= cnt + 1;
end if;
-- Key Hash 4/4
when 10 =>
-- Synthesis Guard
if (WITH_KEY) then
data_out_rtps <= std_logic_vector(cc_instance_handle(3));
wr_rtps <= '1';
data_out_ro <= std_logic_vector(cc_instance_handle(3));
wr_ro <= '1';
-- Need to send Status Info
if (cc_kind /= ALIVE) then
@ -1831,20 +1831,20 @@ begin
end if;
-- Status Info PID
when 11 =>
data_out_rtps <= PID_STATUS_INFO & std_logic_vector(to_unsigned(4, SUBMESSAGE_LENGTH_WIDTH));
wr_rtps <= '1';
data_out_ro <= PID_STATUS_INFO & std_logic_vector(to_unsigned(4, SUBMESSAGE_LENGTH_WIDTH));
wr_ro <= '1';
cnt_next <= cnt + 1;
-- Status Info
when 12 =>
data_out_rtps <= (others => '0');
wr_rtps <= '1';
data_out_ro <= (others => '0');
wr_ro <= '1';
case (cc_kind) is
when ALIVE_FILTERED =>
data_out_rtps(STATUS_INFO_FILTERED_FLAG) <= '1';
data_out_ro(STATUS_INFO_FILTERED_FLAG) <= '1';
when NOT_ALIVE_DISPOSED =>
data_out_rtps(STATUS_INFO_DISPOSED_FLAG) <= '1';
data_out_ro(STATUS_INFO_DISPOSED_FLAG) <= '1';
when NOT_ALIVE_UNREGISTERED =>
data_out_rtps(STATUS_INFO_UNREGISTERED_FLAG) <= '1';
data_out_ro(STATUS_INFO_UNREGISTERED_FLAG) <= '1';
when others =>
null;
end case;
@ -1858,14 +1858,14 @@ begin
end if;
-- Sentinel
when 13 =>
data_out_rtps <= PID_SENTINEL & std_logic_vector(to_unsigned(0, PARAMETER_LENGTH_WIDTH));
wr_rtps <= '1';
data_out_ro <= PID_SENTINEL & std_logic_vector(to_unsigned(0, PARAMETER_LENGTH_WIDTH));
wr_ro <= '1';
-- Payload Available (DATA or Serialized Key)
if (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then
stage_next <= SEND_DATA_B;
else
last_word_out_rtps <= '1';
last_word_out_ro <= '1';
-- Continue
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then
stage_next <= HANDLE_REQUESTS;
@ -1887,9 +1887,9 @@ begin
end if;
when SEND_INLINE_QOS =>
-- Output FIFO Guard
if (full_rtps = '0') then
data_out_rtps <= INLINE_QOS.data(cnt3);
wr_rtps <= '1';
if (full_ro = '0') then
data_out_ro <= INLINE_QOS.data(cnt3);
wr_ro <= '1';
-- Exit Condition
if (cnt3 = INLINE_QOS.length-1) then
@ -1897,7 +1897,7 @@ begin
if (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then
stage_next <= SEND_DATA_B;
else
last_word_out_rtps <= '1';
last_word_out_ro <= '1';
-- Continue
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then
stage_next <= HANDLE_REQUESTS;
@ -1918,15 +1918,15 @@ begin
end if;
when SEND_DATA_B =>
-- Output FIFO Guard
if (full_rtps = '0') then
if (full_ro = '0') then
ready_in_hc <= '1';
if (valid_in_hc = '1') then
data_out_rtps <= data_in_hc;
wr_rtps <= '1';
data_out_ro <= data_in_hc;
wr_ro <= '1';
if (last_word_in_hc = '1') then
last_word_out_rtps <= '1';
last_word_out_ro <= '1';
-- Continue
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then
@ -1946,30 +1946,30 @@ begin
end if;
when SEND_GAP_A =>
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- DATA RTPS SUBMESSAGE (Participant Message)
-- RTPS Submessage Header
when 0 =>
data_out_rtps <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16));
data_out_ro <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16));
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out_rtps <= ENTITYID_UNKNOWN;
data_out_ro <= ENTITYID_UNKNOWN;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out_rtps <= ENTITYID;
data_out_ro <= ENTITYID;
cnt_next <= cnt + 1;
-- GAP Start Sequence Number 1/2
when 3 =>
data_out_rtps <= std_logic_vector(next_seq_nr(0));
data_out_ro <= std_logic_vector(next_seq_nr(0));
cnt_next <= cnt + 1;
-- GAP Start Sequence Number 2/2
when 4 =>
data_out_rtps <= std_logic_vector(next_seq_nr(1));
data_out_ro <= std_logic_vector(next_seq_nr(1));
-- Continue
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then
@ -1985,24 +1985,24 @@ begin
end if;
when SEND_GAP_B =>
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- GAP List Sequence Number Set (Bitmap Base 1/2)
when 0 =>
data_out_rtps <= std_logic_vector(next_seq_nr(0));
data_out_ro <= std_logic_vector(next_seq_nr(0));
cnt_next <= cnt + 1;
-- GAP List Sequence Number Set (Bitmap Base 2/2)
when 1 =>
data_out_rtps <= std_logic_vector(next_seq_nr(1));
data_out_ro <= std_logic_vector(next_seq_nr(1));
cnt_next <= cnt + 1;
-- GAP List Sequence Number Set (NumBits)
when 2 =>
data_out_rtps <= (others => '0');
data_out_ro <= (others => '0');
if (gap_is_last = '1') then
last_word_out_rtps <= '1';
last_word_out_ro <= '1';
-- Reset
gap_is_last_next <= '0';
end if;
@ -2018,47 +2018,47 @@ begin
-- Synthesis Guard
if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then
-- Output FIFO Guard
if (full_rtps = '0') then
wr_rtps <= '1';
if (full_ro = '0') then
wr_ro <= '1';
case (cnt) is
-- HEARTBEAT RTPS SUBMESSAGE
-- RTPS Submessage Header
when 0 =>
if (assert_liveliness_latch = '1') then
data_out_rtps <= SID_HEARTBEAT & "00000100" & std_logic_vector(to_unsigned(28, 16));
data_out_ro <= SID_HEARTBEAT & "00000100" & std_logic_vector(to_unsigned(28, 16));
else
data_out_rtps <= SID_HEARTBEAT & "00000000" & std_logic_vector(to_unsigned(28, 16));
data_out_ro <= SID_HEARTBEAT & "00000000" & std_logic_vector(to_unsigned(28, 16));
end if;
cnt_next <= cnt + 1;
-- Reader Entity ID
when 1 =>
data_out_rtps <= ENTITYID_UNKNOWN;
data_out_ro <= ENTITYID_UNKNOWN;
cnt_next <= cnt + 1;
-- Writer Entity ID
when 2 =>
data_out_rtps <= ENTITYID;
data_out_ro <= ENTITYID;
cnt_next <= cnt + 1;
-- First Sequence Number 1/2
when 3 =>
data_out_rtps <= std_logic_vector(min_sn(0));
data_out_ro <= std_logic_vector(min_sn(0));
cnt_next <= cnt + 1;
-- First Sequence Number 2/2
when 4 =>
data_out_rtps <= std_logic_vector(min_sn(1));
data_out_ro <= std_logic_vector(min_sn(1));
cnt_next <= cnt + 1;
-- Last Sequence Number 1/2
when 5 =>
data_out_rtps <= std_logic_vector(last_seq_nr(0));
data_out_ro <= std_logic_vector(last_seq_nr(0));
cnt_next <= cnt + 1;
-- Last Sequence Number 2/2
when 6 =>
data_out_rtps <= std_logic_vector(last_seq_nr(1));
data_out_ro <= std_logic_vector(last_seq_nr(1));
cnt_next <= cnt + 1;
-- Count
when 7 =>
data_out_rtps <= std_logic_vector(count);
last_word_out_rtps <= '1';
data_out_ro <= std_logic_vector(count);
last_word_out_ro <= '1';
stage_next <= HANDLE_HEARTBEATS;
cnt_next <= 1;