From 839170c5ad86a392be94b56003ff97ac09cff471 Mon Sep 17 00:00:00 2001 From: John Daktylidis Date: Thu, 15 Jun 2023 19:04:42 +0200 Subject: [PATCH] Fix Bug in TEMPLATE_ros_action_client where sequence_id & request_id output signals are only valid for one clock cycle. --- src/ros2/TEMPLATE_ros_action_client.vhd | 44 +++++++++++-------- .../Fibonacci_ros_action_client.vhd | 44 +++++++++++-------- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/ros2/TEMPLATE_ros_action_client.vhd b/src/ros2/TEMPLATE_ros_action_client.vhd index bb3d817..7ace254 100644 --- a/src/ros2/TEMPLATE_ros_action_client.vhd +++ b/src/ros2/TEMPLATE_ros_action_client.vhd @@ -222,8 +222,8 @@ architecture arch of TEMPLATE_ros_action_client is signal cnt, cnt_next : natural range 0 to 5; signal g_start_user, r_start_user, c_start_user, g_ack_user, r_ack_user, c_ack_user, g_taken_user, r_taken_user, c_taken_user, g_done_user, r_done_user, c_done_user : std_logic; signal g_opcode_user, r_opcode_user, c_opcode_user : ROS_SERVICE_OPCODE_TYPE; - signal g_service_info_user, r_service_info_user, c_service_info_user : SERVICE_INFO_TYPE; - signal g_sequence_id_user, r_sequence_id_user, c_sequence_id_user : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0); + signal g_service_info_user, r_service_info_user, c_service_info_user, service_info_sig, service_info_sig_next : SERVICE_INFO_TYPE; + signal g_sequence_id_user, r_sequence_id_user, c_sequence_id_user, sequence_id_sig, sequence_id_sig_next : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0); signal g_return_code_user, r_return_code_user, c_return_code_user : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0); signal f_start_user, f_ack_user, f_done_user, f_taken_user : std_logic; @@ -489,6 +489,8 @@ begin -- ###GENERATED END### end generate; + sequence_id <= sequence_id_sig; + service_info <= service_info_sig; main_prc : process(all) begin @@ -496,6 +498,8 @@ begin stage_next <= stage; cnt_next <= cnt; return_code_latch_next <= return_code_latch; + sequence_id_sig_next <= sequence_id_sig; + service_info_sig_next <= service_info_sig; -- DEFAULT Unregistered f_start_user <= '0'; f_opcode_user <= NOP; @@ -505,8 +509,6 @@ begin g_opcode_user <= NOP; c_start_user <= '0'; c_opcode_user <= NOP; - sequence_id <= (others => '0'); - service_info <= EMPTY_SERVICE_INFO; ack <= '0'; done <= '0'; return_code <= ROS_RET_OK; @@ -560,9 +562,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= g_sequence_id_user; - done <= g_done_user; - return_code <= g_return_code_user; + sequence_id_sig_next <= g_sequence_id_user; + done <= g_done_user; + return_code <= g_return_code_user; if (g_done_user = '1') then -- DONE @@ -583,12 +585,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= g_service_info_user; - return_code <= g_return_code_user; + service_info_sig_next <= g_service_info_user; if (g_done_user = '1') then if (g_taken_user = '1') then done <= g_done_user; + return_code <= g_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -610,9 +612,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= r_sequence_id_user; - done <= r_done_user; - return_code <= r_return_code_user; + sequence_id_sig_next <= r_sequence_id_user; + done <= r_done_user; + return_code <= r_return_code_user; if (r_done_user = '1') then -- DONE @@ -633,12 +635,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= r_service_info_user; - return_code <= r_return_code_user; + service_info_sig_next <= r_service_info_user; if (r_done_user = '1') then if (r_taken_user = '1') then done <= r_done_user; + return_code <= r_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -660,9 +662,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= c_sequence_id_user; - done <= c_done_user; - return_code <= c_return_code_user; + sequence_id_sig_next <= c_sequence_id_user; + done <= c_done_user; + return_code <= c_return_code_user; if (c_done_user = '1') then -- DONE @@ -683,12 +685,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= c_service_info_user; - return_code <= c_return_code_user; + service_info_sig_next <= c_service_info_user; if (c_done_user = '1') then if (c_taken_user = '1') then done <= c_done_user; + return_code <= c_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -740,10 +742,14 @@ begin stage <= IDLE; cnt <= 0; return_code_latch <= ROS_RET_OK; + sequence_id_sig <= (others => '0'); + service_info_sig <= EMPTY_SERVICE_INFO; else stage <= stage_next; cnt <= cnt_next; return_code_latch <= return_code_latch_next; + sequence_id_sig <= sequence_id_sig_next; + service_info_sig <= service_info_sig_next; end if; end if; end process; diff --git a/src/ros2/example_interfaces/Fibonacci_ros_action_client.vhd b/src/ros2/example_interfaces/Fibonacci_ros_action_client.vhd index 23e17df..8258887 100644 --- a/src/ros2/example_interfaces/Fibonacci_ros_action_client.vhd +++ b/src/ros2/example_interfaces/Fibonacci_ros_action_client.vhd @@ -235,8 +235,8 @@ architecture arch of Fibonacci_ros_action_client is signal cnt, cnt_next : natural range 0 to 5; signal g_start_user, r_start_user, c_start_user, g_ack_user, r_ack_user, c_ack_user, g_taken_user, r_taken_user, c_taken_user, g_done_user, r_done_user, c_done_user : std_logic; signal g_opcode_user, r_opcode_user, c_opcode_user : ROS_SERVICE_OPCODE_TYPE; - signal g_service_info_user, r_service_info_user, c_service_info_user : SERVICE_INFO_TYPE; - signal g_sequence_id_user, r_sequence_id_user, c_sequence_id_user : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0); + signal g_service_info_user, r_service_info_user, c_service_info_user, service_info_sig, service_info_sig_next : SERVICE_INFO_TYPE; + signal g_sequence_id_user, r_sequence_id_user, c_sequence_id_user, sequence_id_sig, sequence_id_sig_next : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0); signal g_return_code_user, r_return_code_user, c_return_code_user : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0); signal f_start_user, f_ack_user, f_done_user, f_taken_user : std_logic; @@ -518,6 +518,8 @@ begin -- ###GENERATED END### end generate; + sequence_id <= sequence_id_sig; + service_info <= service_info_sig; main_prc : process(all) begin @@ -525,6 +527,8 @@ begin stage_next <= stage; cnt_next <= cnt; return_code_latch_next <= return_code_latch; + sequence_id_sig_next <= sequence_id_sig; + service_info_sig_next <= service_info_sig; -- DEFAULT Unregistered f_start_user <= '0'; f_opcode_user <= NOP; @@ -534,8 +538,6 @@ begin g_opcode_user <= NOP; c_start_user <= '0'; c_opcode_user <= NOP; - sequence_id <= (others => '0'); - service_info <= EMPTY_SERVICE_INFO; ack <= '0'; done <= '0'; return_code <= ROS_RET_OK; @@ -589,9 +591,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= g_sequence_id_user; - done <= g_done_user; - return_code <= g_return_code_user; + sequence_id_sig_next <= g_sequence_id_user; + done <= g_done_user; + return_code <= g_return_code_user; if (g_done_user = '1') then -- DONE @@ -612,12 +614,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= g_service_info_user; - return_code <= g_return_code_user; + service_info_sig_next <= g_service_info_user; if (g_done_user = '1') then if (g_taken_user = '1') then done <= g_done_user; + return_code <= g_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -639,9 +641,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= r_sequence_id_user; - done <= r_done_user; - return_code <= r_return_code_user; + sequence_id_sig_next <= r_sequence_id_user; + done <= r_done_user; + return_code <= r_return_code_user; if (r_done_user = '1') then -- DONE @@ -662,12 +664,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= r_service_info_user; - return_code <= r_return_code_user; + service_info_sig_next <= r_service_info_user; if (r_done_user = '1') then if (r_taken_user = '1') then done <= r_done_user; + return_code <= r_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -689,9 +691,9 @@ begin end if; -- Wait for Subscriber when 1 => - sequence_id <= c_sequence_id_user; - done <= c_done_user; - return_code <= c_return_code_user; + sequence_id_sig_next <= c_sequence_id_user; + done <= c_done_user; + return_code <= c_return_code_user; if (c_done_user = '1') then -- DONE @@ -712,12 +714,12 @@ begin end if; -- Wait for Subscriber when 1 => - service_info <= c_service_info_user; - return_code <= c_return_code_user; + service_info_sig_next <= c_service_info_user; if (c_done_user = '1') then if (c_taken_user = '1') then done <= c_done_user; + return_code <= c_return_code_user; stage_next <= IDLE; else return_code_latch_next <= ROS_RET_ACTION_CLIENT_TAKE_FAILED; @@ -769,10 +771,14 @@ begin stage <= IDLE; cnt <= 0; return_code_latch <= ROS_RET_OK; + sequence_id_sig <= (others => '0'); + service_info_sig <= EMPTY_SERVICE_INFO; else stage <= stage_next; cnt <= cnt_next; return_code_latch <= return_code_latch_next; + sequence_id_sig <= sequence_id_sig_next; + service_info_sig <= service_info_sig_next; end if; end if; end process;