All the necessary "glue" logic to convert ROS Data to a form that the DDS/RTPS back-end can use is implemented in packages. The ROS Node discovery information is statically generated in packages (similar to the RTPS Participant Data), and a special dds writer is implemented (ros_static_discovery_writer) that has this static data as its only payload sample. Some definitions are moved out of rtps_config_package to prevent circular package dependency.
160 lines
5.7 KiB
VHDL
160 lines
5.7 KiB
VHDL
-- altera vhdl_input_version vhdl_2008
|
|
-- XXX: QSYS Fix (https://www.intel.com/content/www/us/en/support/programmable/articles/000079458.html)
|
|
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
use work.math_pkg.all;
|
|
use work.rtps_package.all;
|
|
use work.ros_config_package.all;
|
|
|
|
entity ros_static_discovery_writer is
|
|
port (
|
|
-- SYSTEM
|
|
clk : in std_logic;
|
|
reset : in std_logic;
|
|
-- TO/FROM RTPS ENDPOINT
|
|
start : in std_logic;
|
|
opcode : in HISTORY_CACHE_OPCODE_TYPE;
|
|
ack : out std_logic;
|
|
done : out std_logic;
|
|
ret : out HISTORY_CACHE_RESPONSE_TYPE;
|
|
seq_nr : in SEQUENCENUMBER_TYPE;
|
|
get_data : in std_logic;
|
|
data_out : out std_logic_vector(WORD_WIDTH-1 downto 0);
|
|
valid_out : out std_logic;
|
|
ready_out : in std_logic;
|
|
last_word_out : out std_logic;
|
|
liveliness_assertion : out std_logic;
|
|
data_available : out std_logic;
|
|
-- Cache Change
|
|
cc_instance_handle : out INSTANCE_HANDLE_TYPE;
|
|
cc_kind : out CACHE_CHANGE_KIND_TYPE;
|
|
cc_source_timestamp : out TIME_TYPE;
|
|
cc_seq_nr : out SEQUENCENUMBER_TYPE
|
|
);
|
|
end entity;
|
|
|
|
architecture arch of ros_static_discovery_writer is
|
|
|
|
constant SN : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
|
|
|
|
--*****TYPE DECLARATION*****
|
|
type STAGE_TYPE is (IDLE,CACHE_CHANGE,DATA,RET_SN,RET_RTPS);
|
|
|
|
--*****SIGNAL DECLARATION*****
|
|
signal stage, stage_next : STAGE_TYPE;
|
|
signal ret_code, ret_code_next : HISTORY_CACHE_RESPONSE_TYPE;
|
|
signal data_available_sig, data_available_sig_next : std_logic;
|
|
signal cnt, cnt_next : integer range 0 to ROS_DISCOVERY_DATA.length;
|
|
|
|
begin
|
|
|
|
liveliness_assertion <= '0';
|
|
data_available <= data_available_sig;
|
|
|
|
main_prc : process(all)
|
|
begin
|
|
-- DEFAULT
|
|
stage_next <= stage;
|
|
cnt_next <= cnt;
|
|
ret_code_next <= ret_code;
|
|
data_available_sig_next <= data_available_sig;
|
|
-- DEFAULT Unregistered
|
|
ack <= '0';
|
|
done <= '0';
|
|
ret <= OK;
|
|
data_out <= (others => '0');
|
|
valid_out <= '0';
|
|
last_word_out <= '0';
|
|
cc_instance_handle <= HANDLE_NIL;
|
|
cc_kind <= ALIVE;
|
|
cc_source_timestamp <= TIME_INVALID;
|
|
cc_seq_nr <= SEQUENCENUMBER_UNKNOWN;
|
|
|
|
|
|
case (stage) is
|
|
when IDLE =>
|
|
if (start = '1') then
|
|
ack <= '1';
|
|
case (opcode) is
|
|
when GET_MIN_SN =>
|
|
stage_next <= RET_SN;
|
|
when GET_MAX_SN =>
|
|
-- Reset Data Available
|
|
data_available_sig_next <= '0';
|
|
|
|
stage_next <= RET_SN;
|
|
when GET_CACHE_CHANGE =>
|
|
cnt_next <= 0;
|
|
stage_next <= CACHE_CHANGE;
|
|
when ACK_CACHE_CHANGE =>
|
|
ret_code_next <= OK;
|
|
stage_next <= RET_RTPS;
|
|
when NACK_CACHE_CHANGE =>
|
|
ret_code_next <= OK;
|
|
stage_next <= RET_RTPS;
|
|
when REMOVE_CACHE_CHANGE =>
|
|
ret_code_next <= OK;
|
|
stage_next <= RET_RTPS;
|
|
when others =>
|
|
end case;
|
|
end if;
|
|
when CACHE_CHANGE =>
|
|
done <= '1';
|
|
ret <= OK;
|
|
cc_seq_nr <= SN;
|
|
|
|
if (get_data = '1') then
|
|
stage_next <= DATA;
|
|
else
|
|
stage_next <= IDLE;
|
|
end if;
|
|
when DATA =>
|
|
valid_out <= '1';
|
|
data_out <= ROS_DISCOVERY_DATA.data(cnt);
|
|
if (cnt = ROS_DISCOVERY_DATA.length-1) then
|
|
last_word_out <= '1';
|
|
end if;
|
|
|
|
if (ready_out = '1') then
|
|
if (cnt = ROS_DISCOVERY_DATA.length-1) then
|
|
stage_next <= IDLE;
|
|
else
|
|
cnt_next <= cnt + 1;
|
|
end if;
|
|
end if;
|
|
when RET_SN =>
|
|
done <= '1';
|
|
ret <= OK;
|
|
cc_seq_nr <= SN;
|
|
|
|
stage_next <= IDLE;
|
|
when RET_RTPS =>
|
|
done <= '1';
|
|
ret <= ret_code;
|
|
|
|
stage_next <= IDLE;
|
|
end case;
|
|
end process;
|
|
|
|
sync_prc : process(clk)
|
|
begin
|
|
if rising_edge(clk) then
|
|
if (reset = '1') then
|
|
stage <= IDLE;
|
|
cnt <= 0;
|
|
ret_code <= ERROR;
|
|
data_available_sig <= '1';
|
|
else
|
|
stage <= stage_next;
|
|
cnt <= cnt_next;
|
|
ret_code <= ret_code_next;
|
|
data_available_sig <= data_available_sig_next;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
end architecture;
|