Fix Bug in TEMPLATE_ros_action_client where sequence_id & request_id output signals are only valid for one clock cycle.

This commit is contained in:
John Ring 2023-06-15 19:04:42 +02:00
parent c577d4f671
commit 839170c5ad
2 changed files with 50 additions and 38 deletions

View File

@ -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;

View File

@ -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;