AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Variables
link_status.vhd
1 ----------------------------------------------------------------------------------
2 -- Company:
3 -- Engineer:
4 --
5 -- Create Date: 12:31:57 12/05/2012
6 -- Design Name:
7 -- Module Name: link_status - Behavioral
8 -- Project Name:
9 -- Target Devices:
10 -- Tool versions:
11 -- Description:
12 --
13 -- Dependencies:
14 --
15 -- Revision:
16 -- Revision 0.01 - File Created
17 -- Additional Comments:
18 --
19 ----------------------------------------------------------------------------------
20 library IEEE;
21 use IEEE.STD_LOGIC_1164.ALL;
22 use IEEE.STD_LOGIC_ARITH.ALL;
23 use IEEE.STD_LOGIC_UNSIGNED.ALL;
24 use IEEE.std_logic_misc.all;
25 
26 -- Uncomment the following library declaration if using
27 -- arithmetic functions with Signed or Unsigned values
28 --use IEEE.NUMERIC_STD.ALL;
29 
30 -- Uncomment the following library declaration if instantiating
31 -- any Xilinx primitives in this code.
32 --library UNISIM;
33 --use UNISIM.VComponents.all;
34 
35 entity link_status is
36  Port ( clk : in STD_LOGIC;
37  reset : in STD_LOGIC;
38  Rxc : in STD_LOGIC_VECTOR (3 downto 0);
39  Rxd : in STD_LOGIC_VECTOR (31 downto 0);
40  link_fault : out STD_LOGIC_VECTOR (1 downto 0) := "00");
41 end link_status;
42 
43 architecture Behavioral of link_status is
44 type state is (INIT, COUNT, FAULT, NEW_FAULT_TYPE);
45 signal link_state : state := INIT;
46 signal local_fault : std_logic := '0';
47 signal remote_fault : std_logic := '0';
48 signal col_cnt : std_logic_vector(7 downto 0) := (others => '0');
49 signal seq_cnt : std_logic_vector(1 downto 0) := (others => '0');
50 signal last_seq_type_remote : std_logic := '0';
51 
52 begin
53 process(clk)
54 begin
55  if(clk'event and clk = '1')then
56  if(Rxc = x"1" and Rxd = x"0100009c")then
57  local_fault <= '1';
58  else
59  local_fault <= '0';
60  end if;
61  if(Rxc = x"1" and Rxd = x"0200009c")then
62  remote_fault <= '1';
63  else
64  remote_fault <= '0';
65  end if;
66  if(reset = '1')then
67  link_state <= INIT;
68  else
69  case link_state is
70  when INIT =>
71  col_cnt <= (others => '0');
72  link_fault <= "00";
73  if(local_fault = '1')then
74  link_state <= COUNT;
75  last_seq_type_remote <= '0';
76  end if;
77  if(remote_fault = '1')then
78  link_state <= COUNT;
79  last_seq_type_remote <= '1';
80  end if;
81  when COUNT =>
82  col_cnt <= col_cnt + 1;
83  if(local_fault = '0' and remote_fault = '0' and col_cnt(7) = '1')then
84  link_state <= INIT;
85  end if;
86  if(local_fault = '1')then
87  col_cnt <= (others => '0');
88  seq_cnt <= seq_cnt + 1;
89  if(last_seq_type_remote = '1')then
90  link_state <= NEW_FAULT_TYPE;
91  elsif(seq_cnt = "11")then
92  link_state <= FAULT;
93  end if;
94  end if;
95  if(remote_fault = '1')then
96  col_cnt <= (others => '0');
97  seq_cnt <= seq_cnt + 1;
98  if(last_seq_type_remote = '0')then
99  link_state <= NEW_FAULT_TYPE;
100  elsif(seq_cnt = "11")then
101  link_state <= FAULT;
102  end if;
103  end if;
104  when FAULT =>
105  link_fault <= last_seq_type_remote & not last_seq_type_remote;
106  col_cnt <= col_cnt + 1;
107  if(local_fault = '1')then
108  col_cnt <= (others => '0');
109  if(last_seq_type_remote = '1')then
110  link_state <= NEW_FAULT_TYPE;
111  end if;
112  elsif(remote_fault = '1')then
113  col_cnt <= (others => '0');
114  if(last_seq_type_remote = '0')then
115  link_state <= NEW_FAULT_TYPE;
116  end if;
117  elsif(col_cnt(7) = '1')then
118  link_state <= INIT;
119  end if;
120  when others =>
121  link_state <= COUNT;
122  seq_cnt <= "01";
123  end case;
124  end if;
125  end if;
126 end process;
127 
128 end Behavioral;
129