rtps-fpga/syn/dds_reader_syn.vhd
Greek64 6724156e72 TIMING CLOSURE: Split main FSM in dds_reader
The sequential logic of the main FSM in dds_reader was just to big to
pass the timing requirement of 50 MHz.
All the DDS READ/TAKE relevant states were removed from the main FSM,
and added to a seperate read FSM. This reduces the state numberes and
state tarnsition logic of the main FSM, allowing it to pass the timing
requirements.
2022-04-14 14:27:09 +02:00

145 lines
8.1 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.user_config.all;
use work.rtps_config_package.all;
use work.Type1_package.all;
entity dds_reader_syn is
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
-- FROM RTPS ENDPOINT
input : in std_logic_vector(13 downto 0);
output : out std_logic_vector(24 downto 0)
);
end entity;
architecture arch of dds_reader_syn is
constant NUM_READERS : natural := 1;
begin
if_gen : if (NUM_READERS > 0) generate
signal time : TIME_TYPE;
signal start_rtps, ack_rtps, done_rtps, valid_in_rtps, ready_in_rtps, last_word_in_rtps, start_dds, ack_dds, get_data_dds, done_dds, valid_out_dds, ready_out_dds, last_word_out_dds, sample_info_valid, sample_info_ack, eoc : std_logic_vector(0 to NUM_READERS-1);
signal opcode_rtps : HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1);
signal ret_rtps : HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to NUM_READERS-1);
signal data_in_rtps, data_out_dds : WORD_ARRAY_TYPE(0 to NUM_READERS-1);
signal opcode_dds : DDS_READER_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1);
signal instance_state_dds : INSTANCE_STATE_ARRAY_TYPE(0 to NUM_READERS-1);
signal view_state_dds : VIEW_STATE_ARRAY_TYPE(0 to NUM_READERS-1);
signal sample_state_dds : SAMPLE_STATE_ARRAY_TYPE(0 to NUM_READERS-1);
signal instance_handle_dds : INSTANCE_HANDLE_ARRAY_TYPE(0 to NUM_READERS-1);
signal max_samples_dds : MAX_SAMPLES_ARRAY_TYPE(0 to NUM_READERS-1);
signal return_code_dds : RETURN_CODE_ARRAY_TYPE(0 to NUM_READERS-1);
signal sample_info : SAMPLE_INFO_ARRAY_TYPE(0 to NUM_READERS-1);
signal status : STATUS_KIND_ARRAY_TYPE(0 to NUM_READERS-1);
begin
-- This process is here to reduce the port count (allowing the entity to be synthesized as top level), but still prevent the tool from optimizing any logic away.
dummy_reducer : process (all)
variable tmp : std_logic_vector(127 downto 0);
begin
if rising_edge(clk) then
time <= to_double_word(to_unsigned(time)(62 downto 0) & input(0));
for i in 0 to NUM_READERS-1 loop
start_rtps(i) <= input(1);
opcode_rtps(i) <= HISTORY_CACHE_OPCODE_TYPE'VAL(to_integer(unsigned(input)));
data_in_rtps(i) <= data_in_rtps(i)(data_in_rtps(i)'length-2 downto 0) & input(2);
valid_in_rtps(i) <= input(3);
last_word_in_rtps(i) <= input(4);
start_dds(i) <= input(5);
opcode_dds(i) <= DDS_READER_OPCODE_TYPE'VAL(to_integer(unsigned(input)));
instance_state_dds(i) <= instance_state_dds(i)(instance_state_dds(i)'length-2 downto 0) & input(6);
view_state_dds(i) <= view_state_dds(i)(view_state_dds(i)'length-2 downto 0) & input(7);
sample_state_dds(i) <= sample_state_dds(i)(sample_state_dds(i)'length-2 downto 0) & input(8);
tmp := std_logic_vector(to_unsigned(instance_handle_dds(i))(126 downto 0) & input(9));
instance_handle_dds(i) <= to_key_hash(tmp);
max_samples_dds(i) <= max_samples_dds(i)(max_samples_dds(i)'length-2 downto 0) & input(10);
get_data_dds(i) <= input(11);
ready_out_dds(i) <= input(12);
sample_info_ack(i) <= input(13);
end loop;
end if;
for i in 0 to NUM_READERS-1 loop
output(0) <= ack_rtps(i);
output(1) <= done_rtps(i);
output(2) <= to_unsigned(HISTORY_CACHE_RESPONSE_TYPE'POS(ret_rtps(i)),1)(0);
output(3) <= ready_in_rtps(i);
output(4) <= ack_dds(i);
output(5) <= done_dds(i);
output(6) <= return_code_dds(i)(to_integer(unsigned(input)));
output(7) <= valid_out_dds(i);
output(8) <= data_out_dds(i)(to_integer(unsigned(input)));
output(9) <= last_word_out_dds(i);
output(10) <= sample_info(i).sample_state(to_integer(unsigned(input)));
output(11) <= sample_info(i).view_state(to_integer(unsigned(input)));
output(12) <= sample_info(i).instance_state(to_integer(unsigned(input)));
output(13) <= to_unsigned(sample_info(i).source_timestamp)(to_integer(unsigned(input)));
output(14) <= to_unsigned(sample_info(i).instance_handle)(to_integer(unsigned(input)));
output(15) <= to_unsigned(sample_info(i).publication_handle)(to_integer(unsigned(input)));
output(16) <= sample_info(i).disposed_generation_count(to_integer(unsigned(input)));
output(17) <= sample_info(i).no_writers_generation_count(to_integer(unsigned(input)));
output(18) <= sample_info(i).sample_rank(to_integer(unsigned(input)));
output(19) <= sample_info(i).generation_rank(to_integer(unsigned(input)));
output(20) <= sample_info(i).absolute_generation_rank(to_integer(unsigned(input)));
output(21) <= sample_info(i).valid_data;
output(22) <= sample_info_valid(i);
output(23) <= eoc(i);
output(24) <= status(i)(to_integer(unsigned(input)));
end loop;
end process;
syn_inst : entity work.dds_reader(arch)
generic map (
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => 50
)
port map (
clk => clk,
reset => reset,
time => time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info => sample_info,
sample_info_valid => sample_info_valid,
sample_info_ack => sample_info_ack,
eoc => eoc,
status => status
);
end generate;
end architecture;