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.
145 lines
8.1 KiB
VHDL
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;
|