You are on page 1of 13

library ieee;

use ieee.std_logic_1164.all;

entity merg_fsm is
port
(

clk

: in std_logic;

inp_pattern

: in string(1 to 4);

--bcdf
virus_pattern1 : inout std_logic_vector(31 downto 0):="00000010000000110000010000000110";
--pcdg
virus_pattern2 : inout std_logic_vector(23 downto 0):="000100000000001100000111";
sub_pattern1 : inout std_logic_vector(7 downto 0);
sub_pattern2 : inout std_logic_vector(7 downto 0);
sub_pattern3 : inout std_logic_vector(7 downto 0)

);
end merg_fsm;

architecture beh of merg_fsm is

signal sub_pattern4 : std_logic_vector(7 downto 0);

type state is (s0,s1,s26,s37,s4,s5,s8);

signal present_state,next_state : state :=s0;

signal present_state_value : std_logic_vector(9 downto 0):="0000000000";


signal next_state_value : std_logic_vector(9 downto 0):="0000000000";

type memory is array(0 to 6) of std_logic_vector(9 downto 0);


signal n_s,m_v : memory;

signal pathvec_ifinal : std_logic_vector(3 downto 0):="11-0";


signal prereg : std_logic_vector(1 downto 0):="11";

begin

process(inp_pattern)
begin

if inp_pattern(1)='b' then

sub_pattern1 <= "00000010";

elsif inp_pattern(1)='c' then

sub_pattern1 <= "00000011";

elsif inp_pattern(1)='d' then

sub_pattern1 <= "00000100";

elsif inp_pattern(1)='f' then

sub_pattern1 <= "00000110";

elsif inp_pattern(1)='p' then

sub_pattern1 <= "00010000";

elsif inp_pattern(1)='g' then

sub_pattern1 <= "00000111";

end if;

if inp_pattern(2)='b' then

sub_pattern2 <= "00000010";

elsif inp_pattern(2)='c' then

sub_pattern2 <= "00000011";

elsif inp_pattern(2)='d' then

sub_pattern2 <= "00000100";

elsif inp_pattern(2)='f' then

sub_pattern2 <= "00000110";

elsif inp_pattern(2)='p' then

sub_pattern2 <= "00010000";

elsif inp_pattern(2)='g' then

sub_pattern2 <= "00000111";

end if;

if inp_pattern(3)='b' then

sub_pattern3 <= "00000010";

elsif inp_pattern(3)='c' then

sub_pattern3 <= "00000011";

elsif inp_pattern(3)='d' then

sub_pattern3 <= "00000100";

elsif inp_pattern(3)='f' then

sub_pattern3 <= "00000110";

elsif inp_pattern(3)='p' then

sub_pattern3 <= "00010000";

elsif inp_pattern(3)='g' then

sub_pattern3 <= "00000111";

end if;

if inp_pattern(4)='b' then

sub_pattern4 <= "00000010";

elsif inp_pattern(4)='c' then

sub_pattern4 <= "00000011";

elsif inp_pattern(4)='d' then

sub_pattern4 <= "00000100";

elsif inp_pattern(4)='f' then

sub_pattern4 <= "00000110";

elsif inp_pattern(4)='p' then

sub_pattern4 <= "00010000";

elsif inp_pattern(4)='g' then

sub_pattern4 <= "00000111";

end if;

end process;

process(clk)
begin

if clk'event and clk='1' then

present_state <= next_state;

end if;

end process;

process(inp_pattern,present_state,sub_pattern1,sub_pattern2,sub_pattern3,sub_pattern4,
virus_pattern1,virus_pattern2,pathvec_ifinal,prereg)

begin

case present_state is

when s0 =>

if sub_pattern1=virus_pattern1(31 downto 24) then

next_state <= s1;


present_state_value <= "0000000000";
next_state_value <= "0000000001";
n_s(0) <= "0000000001";
m_v(0) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

elsif sub_pattern1=virus_pattern2(23 downto 16) then

next_state <= s5;


present_state_value <= "0000000000";
next_state_value <= "0000000101";
n_s(0) <= "0000000101";
m_v(0) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

else

next_state <= s0;


present_state_value <= "0000000000";
next_state_value <= "0000000000";
n_s(0) <= "0000000001";
m_v(0) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

end if;

when s1 =>

if sub_pattern2=virus_pattern1(23 downto 16) then

next_state <= s26;


present_state_value <= "0000000001";
next_state_value <= "0000011010";
n_s(1) <= "0000011010";
m_v(1) <= "0000000000";
pathvec_ifinal <= "01-0";
prereg <= prereg and "01";

else

next_state <= s0;


present_state_value <= "0000000001";
next_state_value <= "0000000000";
n_s(1) <= "0000000000";
m_v(1) <= "0000000000";

pathvec_ifinal <= "01-0";


prereg <= prereg and "01";

end if;

when s26 =>

if sub_pattern3=virus_pattern1(15 downto 8) then

next_state <= s37;


present_state_value <= "0000011010";
next_state_value <= "0000100101";
n_s(2) <= "0000100101";
m_v(2) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

else

next_state <= s0;


present_state_value <= "0000011010";
next_state_value <= "0000000000";
n_s(2) <= "0000000000";
m_v(2) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

end if;

when s37 =>

if sub_pattern4=virus_pattern1(7 downto 0) then

next_state <= s4;


present_state_value <= "0000100101";
next_state_value <= "0000000100";
n_s(3) <= "0000000100";
m_v(3) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

elsif sub_pattern4=virus_pattern2(7 downto 0) then

next_state <= s8;


present_state_value <= "0000100101";
next_state_value <= "0000001000";
n_s(3) <= "0000001000";
m_v(3) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

else

next_state <= s0;


present_state_value <= "0000100101";
next_state_value <= "0000000000";

n_s(3) <= "0000000000";


m_v(3) <= "0000000000";
pathvec_ifinal <= "11-0";
prereg <= prereg and "11";

end if;

when s4 =>

n_s(4) <= "0000000100";


m_v(4) <= "0000000001";

next_state_value <= "0000000000";


next_state <= s0;
pathvec_ifinal <= "01-1";
prereg <= prereg and "01";

when s5 =>

if sub_pattern2=virus_pattern2(15 downto 8) then

next_state <= s26;


present_state_value <= "0000000101";
next_state_value <= "0000011010";
n_s(5) <= "0000011010";
m_v(5) <= "0000000000";
pathvec_ifinal <= "10-0";
prereg <= prereg and "10";

else

next_state <= s0;


present_state_value <= "0000000101";
next_state_value <= "0000000000";
n_s(5) <= "0000000000";
m_v(5) <= "0000000000";
pathvec_ifinal <= "10-0";
prereg <= prereg and "10";

end if;

when s8 =>

n_s(6) <= "0000001000";


m_v(6) <= "0000000010";

next_state_value <= "0000000000";


next_state <= s0;

pathvec_ifinal <= "10-1";


prereg <= prereg and "10";

when others=>

end case;

end process;

end beh;

You might also like