* Added Documentation in RTPS

This commit is contained in:
Greek 2020-05-24 18:28:57 +02:00
parent 9ab7d79d87
commit 052a4054b9
2 changed files with 144 additions and 59 deletions

View File

@ -9,43 +9,55 @@ use work.rtps_package.all;
entity rtps_handler is
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(31 downto 0); -- Input FIFO data signal
builtin_output : out BUILTIN_ENDPOINT_TYPE;
builtin_full : in std_logic_vector(NUM_DOMAIN-1 downto 0);
builtin_wr : out std_logic_vector(NUM_DOMAIN-1 downto 0);
user_output : out USER_ENDPOINT_OUTPUT;
user_full : in std_logic_vector(NUM_READERS+NUM_WRITERS-1 downto 0);
user_wr : out std_logic_vector(NUM_READERS+NUM_WRITERS-1 downto 0)
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(31 downto 0); -- Input FIFO data signal
builtin_output : out BUILTIN_ENDPOINT_TYPE; -- Output FIFO (Built-In Endpoints) data signal
builtin_full : in std_logic_vector(NUM_DOMAIN-1 downto 0); -- Output FIFO (Built-In Endpoints) full signal
builtin_wr : out std_logic_vector(NUM_DOMAIN-1 downto 0); -- Output FIFO (Built-In Endpoints) write signal
user_output : out USER_ENDPOINT_OUTPUT; -- Output FIFO (User Endpoints) data signal
user_full : in std_logic_vector(MAX_ENDPOINTS-1 downto 0); -- Output FIFO (User Endpoints) full signal
user_wr : out std_logic_vector(MAX_ENDPOINTS-1 downto 0) -- Output FIFO (User Endpoints) write signal
);
end entity;
architecture arch of rtps_handler is
--*****COMPOENENT DECLARATION******
--*****COMPONENT DECLARATION******
--*****CONSTANT DECLARATION*****
-- Minimum Packet Length to consider valid
-- 2 UDP Header 32-bit Words, 5 RTPS Header 32-bit Words
-- Minimum Packet Length to consider valid (32-bit Words)
-- 2 UDP Header, 5 RTPS Header
constant MIN_PACKET_LENGTH : integer := 7;
constant MAX_ENDPOINTS : integer := NUM_READERS+NUM_WRITERS;
-- Minimum ACKNACK Submessage Size (Bytes)
-- 4 Reader ID, 4 Writer ID, 12 SequenceNumberSet (8 BitmapBase, 4 numBits), 4 Count
constant MIN_ACKNACK_SIZE : integer := 24;
-- Minimum INFO_DST Submessage Size (Bytes)
-- 12 GUID Prefix
constant MIN_INFO_DST_SIZE : integer := 12;
-- Minimum INFO_SRC Submessage Size (Bytes)
-- 4 unused, 2 ProtocolVersion, 2 VendorID, 12 GUID Prefix
constant MIN_INFO_SRC_SIZE : integer := 20;
constant MIN_INFO_REPLY_SIZE : integer := 1;
constant MIN_INFO_REPLY_IP4_SIZE: integer := 2;
-- Minimum INFO_REPLY Submessage Size (Bytes)
-- 4 Unicast LocatorList (4 numLocators)
constant MIN_INFO_REPLY_SIZE : integer := 4;
-- Minimum INFO_REPLY_IP4 Submessage Size (Bytes)
-- 8 Unicast LocatorUPDv4 (4 Addr, 4 Port)
constant MIN_INFO_REPLY_IP4_SIZE: integer := 8;
-- Minimum GAP Submessage Size (Bytes)
-- 4 Reader ID, 4 Writer ID, 8 SequenceNumber, 12 SequenceNumberSet (8 BitmapBase, 4 numBits)
constant MIN_GAP_SIZE : integer := 28;
-- Minimum HEARTBEAT Submessage Size (Bytes)
-- 4 Reader ID, 4 Writer ID, 8 SequenceNumber, 8 SequenceNumber, 4 Count
constant MIN_HEARTBEAT_SIZE : integer := 28;
constant MIN_DATA_SIZE : integer := 20;
--GUIDPREFIX(1 downto 0) <= VENDORID;
-- Minimum DATA Submessage Size (Bytes)
-- 2 Extra Flags, 2 octetstoinlineQoS, 4 Reader ID, 4 Writer ID, 8 SequenceNumber
constant MIN_DATA_SIZE : integer := 20;
--*****TYPE DECLARATION*****
-- FSM states. Explained below in detail
type STAGE_TYPE is (SRC_ADDR_HEADER, DEST_ADDR_HEADER, LEN_HEADER, UDP_HEADER_1, UDP_HEADER_2, RTPS_HEADER_1, RTPS_HEADER_2,
RTPS_HEADER_3, RTPS_SUB_HEADER, EXTRACT_LOCATOR_UDPv4_1, EXTRACT_LOCATOR_UDPv4_2,
EXTRACT_LOCATOR_LIST, EXTRACT_LOCATOR, INFO_SRC_HEADER, EXTRACT_DOMAIN_ID, SRC_ENTPOINT, DATA_HEADER,
@ -56,45 +68,68 @@ architecture arch of rtps_handler is
--*****SIGNAL DECLARATION*****
-- FSM state
signal stage, stage_next : STAGE_TYPE := SRC_ADDR_HEADER;
-- FSM state latch. Used to transition dynamically to different states from the same state.
signal return_stage, return_stage_next : STAGE_TYPE := SRC_ADDR_HEADER;
-- Intermediate input read signal. (Read from output port not allowed)
signal rd_sig : std_logic := '0';
-- Signal used to reset the word counter
signal reset_read_cnt : std_logic;
-- 32-bit word counter (Counts words read from input fifo)
-- 32-bit Word counter (Counts words read from input fifo)
signal read_cnt : unsigned(13 downto 0) := (others => '0');
-- 32-bit aligned total packet length
-- 32-bit Word aligned total packet length
signal packet_length, packet_length_next : unsigned(13 downto 0) := (others => '0');
-- 32-bit Word aligned end of Submessage
signal sub_end, sub_end_next : unsigned(13 downto 0) := (others => '0');
-- 32-bit Word aligned end of Data Header (Beginning of inlineQoS/Payload)
signal data_header_end, data_header_end_next : unsigned(13 downto 0) := (others => '0');
-- Input Signal Latch. Used to read 32-bit Word aligned from input
signal align_sig, align_sig_next : std_logic_vector(23 downto 0) := (others => '0');
-- 32-bit Word Aligned Input
signal aligned_data_in : std_logic_vector(31 downto 0);
-- 32-bit Word Aligned Input, Padded with Zeroes (The last read from input with less than 32-bits gets padded with zeroes)
signal aligned_data_in_padded : std_logic_vector(31 downto 0) := (others => '0');
-- 32-bit Word alignement offset
signal align_offset, align_offset_next : std_logic_vector(1 downto 0) := (others => '0');
-- Alignement offset latch
signal offset_latch, offset_latch_next : std_logic_vector(1 downto 0) := (others => '0');
-- Alignement offset latch (For Data Header)
signal data_header_offset_latch, data_header_offset_latch_next : std_logic_vector(1 downto 0) := (others => '0');
-- IPv4 Source Address latch
signal src_addr, src_addr_next : std_logic_vector(31 downto 0) := (others => '0');
-- UDP Source Port latch
signal src_port, src_port_next : std_logic_vector(15 downto 0) := (others => '0');
-- Denotes if processed Message has Multicast Destination
signal is_multicast, is_multicast_next : std_logic := '0';
-- Denotes if processed Message is Metatraffic destined for Built-In Endpoints
signal is_metatraffic, is_metatraffic_next : std_logic := '0';
-- Domain ID/Participant ID target of processed Message
signal domain_id, domain_id_next : integer range 0 to NUM_DOMAIN-1 := 0;
signal endpoint_id, endpoint_id_next : integer range 0 to MAX_ENDPOINTS-1 := 0;
-- RTPS Submessage Flag latch
signal flags, flags_next : std_logic_vector(7 downto 0) := (others => '0');
-- Source Endpoint Entity ID latch
signal src_entityid, src_entityid_next : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := (others => '0');
-- Vector denoting the Destination User Endpoints of the Message
signal user_endpoint, user_endpoint_next : std_logic_vector(MAX_ENDPOINTS-1 downto 0) := (others => '0');
-- Denoting if the Message is destined for the Built-in Endpoints
signal builtin_endpoint, builtin_endpoint_next : std_logic := '0';
signal sub_length, sub_length_next : std_logic_vector(13 downto 0) := (others => '0');
-- Since Submessages are limited to 2^16 Bytes, we can limit this counter also to 16 bits
-- Length of Payload (32-bit Words) to be sent to Endpoints
signal payload_length, payload_length_next : std_logic_vector(13 downto 0) := (others => '0');
-- numLocator latch
-- NOTE: Since Submessages are limited to 2^16 Bytes, we can limit this also to 16 bits
signal numlocators, numlocators_next : unsigned(15 downto 0) := (others => '0');
-- Denotes if a suitable Locator has been found
signal locator_match, locator_match_next : std_logic := '0';
-- Denotes if the Source of the Message is a Reader Endpoint
signal src_is_reader, src_is_reader_next : std_logic := '0';
-- Intermediate Output Data Signal
signal output_sig : std_logic_vector(31 downto 0) := (others => '0');
-- Intermediate Write Enable Signal
signal wr_sig : std_logic := '0';
-- Submessage ID latch (Used as OPCODe by Endpoints)
signal opcode, opcode_next : std_logic_vector(SUBMESSAGE_ID_WIDTH-1 downto 0) := (others => '0');
-- Denotes if Message is DATA Submessage
signal is_data, is_data_next : std_logic := '0';
signal data_header_length, data_header_length_next : unsigned(15 downto 0) := (others => '0');
-- General purpose counter
-- General Purpose counter
signal cnt, cnt_next : integer range 0 to max(GUIDPREFIX_WIDTH/32, 6) := 0;
--*****ALIAS DEFINATION*****
@ -220,16 +255,19 @@ architecture arch of rtps_handler is
end function;
begin
rd <= rd_sig;
-- This process connects the Intermediate Output Signals to the actual output FIFOs
output_prc : process(all)
begin
rd <= rd_sig;
-- Data Signal
for i in 0 to NUM_DOMAIN-1 loop
builtin_output(i) <= output_sig;
end loop;
for i in 0 to MAX_ENDPOINTS-1 loop
user_output(i) <= output_sig;
end loop;
--Write Enable Signal
builtin_wr <= (others => '0');
user_wr <= (others => '0');
if (wr_sig = '1') then
@ -241,6 +279,12 @@ begin
end if;
end process;
-- This process is responsible for reading the input FIFO 32-bit Word aligned.
-- Since the RTPS Header uses octet Length counters, the Elements are not guaranteed to be 32-bit
-- aligned (Which is how we read from the input FIFO).
-- We store the lower 2 bits of the octet length (Which denotes the 32-bit alignment offset),
-- and at the end of the Byte aligned Element we pad it to 32-bit, and calculate the new
-- alignement of the data following (Done by adding the current offset to the previous offset)
align_prc : process(all)
variable input : std_logic_vector(55 downto 0) := (others => '0');
begin
@ -257,13 +301,38 @@ begin
end case;
end process;
-- Main State Machine
-- STATE DESCRIPTION
-- SRC_ADDR_HEADER Initial and Idle state. Read IPv4 Source Address
-- DEST_ADDR_HEADER Read IPv4 Destination Address
-- LEN_HEADER Read UDP Packet Length
-- UDP_HEADER_1 Parse first word of UDP Header
-- UDP_HEADER_2 Parse second word of UDP Header
-- RTPS_HEADER_1 Parse first word of RTPS Header
-- RTPS_HEADER_2 Parse second word of RTPS Header
-- RTPS_HEADER_3 Parse GUID Prefix of RTPS Header (3rd-5th Word)
-- RTPS_SUB_HEADER Parse RTPS Submessage Header
-- EXTRACT_LOCATOR_UDPv4_1 Read IPv4 Address from LocatorUDPv4
-- EXTRACT_LOCATOR_UDPv4_2 Read UDP Port from LocatorUDPv4
-- EXTRACT_LOCATOR_LIST Parse LocatorList Head
-- EXTRACT_LOCATOR Parse Locator
-- INFO_SRC_HEADER Parse INFO_SRC content
-- EXTRACT_DOMAIN_ID Extract Domain ID from GUID Prefix (Works only for GUID Prefixes generated by rtps_package)
-- SRC_ENTPOINT Read EntityID
-- DATA_HEADER Parse Submessage DATA Subheader
-- MATCH_DST_ENDPOINT Determine destination of Submessage
-- PUSH_PAYLOAD_HEADER Write Payload Header into relevant output FIFOs
-- DATA_SKIP_HEADER Read known DATA Submessage Subheader Elements, and skip the rest
-- PUSH_PAYLOAD Read from input FIFO into relevant output FIFOs
-- CHECK_SUB_END Check if end of Submessage is reached, and handle accordingly
-- SKIP_PACKET Skip rest of UDP Packet
-- SKIP_SUB Skip rest of Submessage
parse_prc: process(all)
variable tmp : integer range 0 to MAX_ENDPOINTS := 0;
variable tmp_length : std_logic_vector(15 downto 0) := (others => '0');
begin
--DEFAULT
--DEFAULT Registered
stage_next <= stage;
reset_read_cnt <= '0';
cnt_next <= cnt;
align_offset_next <= align_offset;
align_sig_next <= align_sig;
@ -271,9 +340,7 @@ begin
sub_end_next <= sub_end;
offset_latch_next <= offset_latch;
src_addr_next <= src_addr;
is_multicast_next <= is_multicast;
src_port_next <= src_port;
is_metatraffic_next <= is_metatraffic;
domain_id_next <= domain_id;
flags_next <= flags;
src_entityid_next <= src_entityid;
@ -281,16 +348,20 @@ begin
builtin_endpoint_next <= builtin_endpoint_next;
return_stage_next <= return_stage;
numlocators_next <= numlocators;
locator_match_next <= locator_match;
sub_length_next <= sub_length;
src_is_reader_next <= src_is_reader;
output_sig <= (others => '0');
wr_sig <= '0';
payload_length_next <= payload_length;
opcode_next <= opcode;
data_header_end_next <= data_header_end;
data_header_offset_latch_next <= data_header_offset_latch;
locator_match_next <= locator_match;
is_metatraffic_next <= is_metatraffic;
is_multicast_next <= is_multicast;
is_data_next <= is_data;
data_header_length_next <= data_header_length;
src_is_reader_next <= src_is_reader;
-- DEFAULT Unregistered
rd_sig <= '0';
reset_read_cnt <= '0';
output_sig <= (others => '0');
wr_sig <= '0';
case(stage) is
-- Initial/Idle State
@ -323,6 +394,7 @@ begin
stage_next <= SKIP_PACKET;
end if;
end if;
-- UDP Packet Length
when LEN_HEADER =>
-- Reset packet Byte Counter
reset_read_cnt <= '1';
@ -458,6 +530,7 @@ begin
case (rtps_sub_id) is
-- INFO_DST (Writer -> Reader, Update Destination GUID Prefix)
-- STAGE ORDER: EXTRACT_DOMAIN_ID -> CHECK_SUB_END -> (SKIP_SUB) -> RTPS_SUB_HEADER
when SID_INFO_DST =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_INFO_DST_SIZE)) then
@ -471,6 +544,7 @@ begin
return_stage_next <= CHECK_SUB_END;
end if;
-- INFO_SRC (RTPS Header in Submessage form)
-- STAGE ORDER: INFO_SRC_HEADER -> SKIP_SUB -> RTPS_SUB_HEADER
when SID_INFO_SRC =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_INFO_SRC_SIZE)) then
@ -483,10 +557,12 @@ begin
stage_next <= INFO_SRC_HEADER;
end if;
-- INFO_TS (Source Timestamp)
-- STAGE ORDER: SKIP_SUB -> RTPS_SUB_HEADER
when SID_INFO_TS =>
-- IGNORE
stage_next <= CHECK_SUB_END;
-- INFO_REPLY (Source Port and Address)
-- STAGE ORDER: EXTRACT_LOCATOR_LIST <-> EXTRACT_LOCATOR -> CHECK_SUB_END -> (SKIP_SUB) -> RTPS_SUB_HEADER
when SID_INFO_REPLY =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_INFO_REPLY_SIZE)) then
@ -497,6 +573,7 @@ begin
stage_next <= EXTRACT_LOCATOR_LIST;
end if;
-- INFO_REPLY (Source Port and Address)
-- STAGE ORDER: EXTRACT_LOCATOR_UDPv4_1 -> EXTRACT_LOCATOR_UDPv4_2 -> CHECK_SUB_END -> (SKIP_SUB) -> RTPS_SUB_HEADER
when SID_INFO_REPLY_IP4 =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_INFO_REPLY_IP4_SIZE)) then
@ -504,9 +581,10 @@ begin
stage_next <= SKIP_PACKET;
else
-- Parse Locators
stage_next <= SKIP_SUB;
stage_next <= EXTRACT_LOCATOR_UDPv4_1;
end if;
-- Heartbeat (Writer -> Reader, Available SeqNum)
-- STAGE ORDER: MATCH_DST_ENDPOINT -> SRC_ENTPOINT -> PUSH_PAYLOAD_HEADER -> PUSH_PAYLOAD -> RTPS_SUB_HEADER
when SID_HEARTBEAT =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_HEARTBEAT_SIZE)) then
@ -518,6 +596,7 @@ begin
return_stage_next <= SRC_ENTPOINT;
end if;
-- AckNack (Reader -> Writer, Request SeqNum)
-- STAGE ORDER: SRC_ENTPOINT -> MATCH_DST_ENDPOINT -> PUSH_PAYLOAD_HEADER -> PUSH_PAYLOAD -> RTPS_SUB_HEADER
when SID_ACKNACK =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_ACKNACK_SIZE)) then
@ -530,6 +609,7 @@ begin
stage_next <= SRC_ENTPOINT;
end if;
-- GAP (Writer -> Reader, Invalidate SeqNum)
-- STAGE ORDER: MATCH_DST_ENDPOINT -> SRC_ENTPOINT -> PUSH_PAYLOAD_HEADER -> PUSH_PAYLOAD -> RTPS_SUB_HEADER
when SID_GAP =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_GAP_SIZE)) then
@ -541,6 +621,7 @@ begin
return_stage_next <= SRC_ENTPOINT;
end if;
-- DATA (Writer -> Reader, SeqNum+Data)
-- STAGE ORDER: DATA_HEADER -> MATCH_DST_ENDPOINT -> SRC_ENTPOINT -> PUSH_PAYLOAD_HEADER -> DATA_SKIP_HEADER -> PUSH_PAYLOAD -> RTPS_SUB_HEADER
when SID_DATA =>
-- Check Length
if ( (rtps_sub_length /= (rtps_sub_length'reverse_range => '0')) and (to_integer(unsigned(rtps_sub_length)) < MIN_DATA_SIZE)) then
@ -569,6 +650,7 @@ begin
-- IGNORE
stage_next <= SKIP_SUB;
-- PAD (Variable Size Padding)
-- STAGE ORDER: CHECK_SUB_END -> (SKIP_PACKET) -> RTPS_SUB_HEADER
when SID_PAD =>
stage_next <= CHECK_SUB_END;
-- Unknown ID, skip submessage
@ -590,7 +672,7 @@ begin
sub_end_next <= packet_length;
-- Calculate Submessage Length
-- TODO: Check synthesized code (Should be Subtractor/Adder with carry in)
sub_length_next <= std_logic_vector(packet_length - read_cnt + to_unsigned(1,sub_length'length));
payload_length_next <= std_logic_vector(packet_length - read_cnt + to_unsigned(1,payload_length'length));
end if;
else
-- Latch Submessage End
@ -600,10 +682,10 @@ begin
-- Latch Submessage Size (+1 to adjust to the format recognised by the Endpoints)
if (rtps_sub_id = SID_DATA) then
-- (+5 to counter Data header subtraction)
sub_length_next <= std_logic_vector(unsigned(normalize_length(endian_swap(rtps_sub_endianness,rtps_sub_length))) + to_unsigned(5,sub_length'length));
payload_length_next <= std_logic_vector(unsigned(normalize_length(endian_swap(rtps_sub_endianness,rtps_sub_length))) + to_unsigned(5,payload_length'length));
else
-- (+1 to adjust to the format recognised by the Endpoints)
sub_length_next <= std_logic_vector(unsigned(normalize_length(endian_swap(rtps_sub_endianness,rtps_sub_length))) + to_unsigned(1,sub_length'length));
payload_length_next <= std_logic_vector(unsigned(normalize_length(endian_swap(rtps_sub_endianness,rtps_sub_length))) + to_unsigned(1,payload_length'length));
end if;
end if;
-- Latch Byte offset of next Header
@ -758,7 +840,7 @@ begin
-- Latch offset
data_header_end_next <= read_cnt + unsigned(normalize_length(endian_swap(rtps_sub_endianness, rtps_sub_data_length)));
-- Fix Payload Size
sub_length_next <= std_logic_vector(unsigned(sub_length) - unsigned(normalize_length(endian_swap(rtps_sub_endianness, rtps_sub_data_length))));
payload_length_next <= std_logic_vector(unsigned(payload_length) - unsigned(normalize_length(endian_swap(rtps_sub_endianness, rtps_sub_data_length))));
-- Next Stage
stage_next <= MATCH_DST_ENDPOINT;
return_stage_next <= SRC_ENTPOINT;
@ -825,8 +907,8 @@ begin
cnt_next <= cnt + 1;
case (cnt) is
when 1 =>
output_sig(sub_length'length-1 downto 0) <= sub_length;
wr_sig <= '1';
output_sig(payload_length'length-1 downto 0) <= payload_length;
wr_sig <= '1';
when 2 =>
output_sig <= opcode & flags & src_port;
wr_sig <= '1';
@ -985,11 +1067,10 @@ begin
src_entityid <= (others => '0');
user_endpoint <= (others => '0');
numlocators <= (others => '0');
sub_length <= (others => '0');
payload_length <= (others => '0');
opcode <= (others => '0');
data_header_end <= (others => '0');
data_header_offset_latch <= (others => '0');
data_header_length <= (others => '0');
is_data <= '0';
src_is_reader <= '0';
locator_match <= '0';
@ -1012,11 +1093,10 @@ begin
src_entityid <= src_entityid_next;
user_endpoint <= user_endpoint_next;
numlocators <= numlocators_next;
sub_length <= sub_length_next;
payload_length <= payload_length_next;
opcode <= opcode_next;
data_header_end <= data_header_end_next;
data_header_offset_latch <= data_header_offset_latch_next;
data_header_length <= data_header_length_next;
is_data <= is_data_next;
src_is_reader <= src_is_reader_next;
locator_match <= locator_match_next;

View File

@ -11,6 +11,11 @@ package rtps_package is
constant NUM_WRITERS : integer := 0;
-- Number of RTPS Reader Endpoints
constant NUM_READERS : integer := 1;
-----------------------------------------------------------------------------------------------------
-- *DO NOT MODIFY BEGIN*
constant MAX_ENDPOINTS : integer := NUM_READERS+NUM_WRITERS;
-- *DO NOT MODIFY END*
-----------------------------------------------------------------------------------------------------
-- PB Value of Default Port Generation (see DDSI-RTPS 2.3 Section 9.6.1)
constant PORT_CONFIG_PB : integer := 7400;
-- DG Value of Default Port Generation (see DDSI-RTPS 2.3 Section 9.6.1)
@ -39,8 +44,8 @@ package rtps_package is
-----------------------------------------------------------------------------------------------------
-- *DO NOT MODIFY BEGIN*
type ENDPOINT_DOMAIN_MAP_TYPE is array (NUM_READERS+NUM_WRITERS-1 downto 0) of integer;
type ENDPOINT_WITH_KEY_TYPE is array (NUM_READERS+NUM_WRITERS-1 downto 0) of boolean;
type ENDPOINT_DOMAIN_MAP_TYPE is array (MAX_ENDPOINTS-1 downto 0) of integer;
type ENDPOINT_WITH_KEY_TYPE is array (MAX_ENDPOINTS-1 downto 0) of boolean;
-- *DO NOT MODIFY END*
-----------------------------------------------------------------------------------------------------
@ -91,7 +96,7 @@ package rtps_package is
type DOMAIN_ID_TYPE is array (NUM_DOMAIN-1 downto 0) of std_logic_vector(DOMAIN_ID_WIDTH-1 downto 0);
constant DOMAIN_ID : DOMAIN_ID_TYPE; -- Deferred to Package Body
type DOMAIN_ENDPOINT_MAP_TYPE is array (NUM_DOMAIN-1 downto 0) of std_logic_vector(NUM_READERS+NUM_WRITERS-1 downto 0);
type DOMAIN_ENDPOINT_MAP_TYPE is array (NUM_DOMAIN-1 downto 0) of std_logic_vector(MAX_ENDPOINTS-1 downto 0);
constant DOMAIN_ENDPOINT_MAP : DOMAIN_ENDPOINT_MAP_TYPE; -- Deferred to Package Body
-- Since this implementation runs on the same network stack and the RTPS Endpoints (Readers & Writers)
@ -126,7 +131,7 @@ package rtps_package is
-- DDSI-RTPS 2.3 states that Entity IDs have to be unique within each Participant.
-- For simplicity and ease of mapping we make the Entity IDs unique across all Participant and Domains on this node.
type ENTITYID_TYPE is array (NUM_READERS+NUM_WRITERS-1 downto 0) of std_logic_vector(ENTITYID_WIDTH-1 downto 0);
type ENTITYID_TYPE is array (MAX_ENDPOINTS-1 downto 0) of std_logic_vector(ENTITYID_WIDTH-1 downto 0);
constant ENTITYID : ENTITYID_TYPE; -- Deferred to Package Body
constant ENTITYID_UNKNOWN : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := (others => '0');
constant ENTITYID_PARTICIPANT : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := (x"000001c1");
@ -151,7 +156,7 @@ package rtps_package is
--****************
type USER_ENDPOINT_OUTPUT is array (NUM_READERS+NUM_WRITERS-1 downto 0) of std_logic_vector(31 downto 0);
type USER_ENDPOINT_OUTPUT is array (MAX_ENDPOINTS-1 downto 0) of std_logic_vector(31 downto 0);
type BUILTIN_ENDPOINT_TYPE is array (NUM_DOMAIN-1 downto 0) of std_logic_vector(31 downto 0);
end package;
@ -178,7 +183,7 @@ package body rtps_package is
begin
ret := (others => (others => '0'));
for i in 0 to NUM_DOMAIN-1 loop
for j in 0 to NUM_READERS+NUM_WRITERS-1 loop
for j in 0 to MAX_ENDPOINTS-1 loop
if (i = end_id(j)) then
ret(i)(j) := '1';
end if;