Add a Verbatim Key Hash Generator
Add a Key Hash Generator that just generates a Key Hash with the verbatim contents of the Type Key Fields. This is the case for all Types with a combined Key Field size less than 16 Bytes.
This commit is contained in:
parent
6662935514
commit
1871adac6d
80
src/verbatim_key_hash_generator.vhd
Normal file
80
src/verbatim_key_hash_generator.vhd
Normal file
@ -0,0 +1,80 @@
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
use work.rtps_package.all;
|
||||
use work.rtps_config_package.all;
|
||||
|
||||
architecture arch of key_hash_generator is
|
||||
|
||||
constant MAX_CNT_BOUND : natural := (KEY_HASH_WIDTH/data_in'length);
|
||||
|
||||
type STAGE_TYPE is (IDLE, GEN_KEY_HASH, FINALIZE);
|
||||
|
||||
signal stage, stage_next : STAGE_TYPE;
|
||||
signal cnt, cnt_next : natural range 0 to MAX_CNT_BOUND-1;
|
||||
signal kh, kh_next : std_logic_vector(KEY_HASH_WIDTH-1 downto 0);
|
||||
|
||||
begin
|
||||
key_hash <= kh;
|
||||
|
||||
kh_prc : process(all)
|
||||
begin
|
||||
-- DEFAULT
|
||||
stage_next <= stage;
|
||||
kh_next <= kh;
|
||||
cnt_next <= cnt;
|
||||
-- DEFAULT Unregistered
|
||||
ack <= '0';
|
||||
ready_in <= '0';
|
||||
done <= '0';
|
||||
|
||||
case (stage) is
|
||||
when IDLE =>
|
||||
if (start = '1') then
|
||||
ack <= '1';
|
||||
stage_next <= GEN_KEY_HASH;
|
||||
-- Reset
|
||||
kh_next <= (others => '0');
|
||||
cnt_next <= 0;
|
||||
end if;
|
||||
when GEN_KEY_HASH =>
|
||||
ready_in <= '1';
|
||||
-- Input Guard
|
||||
if (valid_in = '1') then
|
||||
kh_next <= write_sub_vector(kh, data_in, cnt, TRUE);
|
||||
|
||||
-- Last Word
|
||||
if (last_word_in = '1') then
|
||||
stage_next <= FINALIZE;
|
||||
elsif (cnt = MAX_CNT_BOUND-1) then
|
||||
-- Reset (Prevent overflow)
|
||||
cnt_next <= 0;
|
||||
else
|
||||
cnt_next <= cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
when FINALIZE =>
|
||||
done <= '1';
|
||||
stage_next <= IDLE;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end process;
|
||||
|
||||
sync_prc : process(clk)
|
||||
begin
|
||||
if rising_edge(clk) then
|
||||
if (reset = '1') then
|
||||
stage <= IDLE;
|
||||
cnt <= 0;
|
||||
kh <= (others => '0');
|
||||
else
|
||||
stage <= stage_next;
|
||||
cnt <= cnt_next;
|
||||
kh <= kh_next;
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
end architecture;
|
||||
Loading…
Reference in New Issue
Block a user