1 ----------------------------------------------------------------------------------
5 -- Create Date: 09:
29:
47 08/28/2015
7 -- Module Name: TTC_trigger - Behavioral
16 -- Revision 0.
01 -
File Created
17 -- Additional Comments:
19 ----------------------------------------------------------------------------------
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;
26 -- Uncomment the following library declaration if using
27 -- arithmetic functions with or values
28 --use IEEE.NUMERIC_STD.ALL;
30 -- Uncomment the following library declaration if instantiating
31 -- any Xilinx primitives in this code.
33 use UNISIM.VComponents.
all;
36 generic(simulation : := false);
37 Port ( reset : in ;
-- async reset
40 HammingData_in : in (17 downto 0);
41 HammingDataValid : in ;
46 TrigData : out (7 downto 0));
50 signal TTC_lock_i : := '0';
51 signal BC0_lock_i : := '0';
52 signal Toggle : := '0';
53 signal ToggleSyncRegs : (3 downto 0) := (others => '0');
54 signal TTC_edge : (6 downto 0) := (others => '0');
55 signal HammingDataValid_dl3 : := '0';
56 signal chk_HammingData : := '0';
57 signal OutStrobe : := '0';
58 signal rd_enable : := '0';
59 signal rd_TTC_data : := '0';
60 signal BC0_l : := '0';
61 signal BcntMm_i : := '0';
62 signal BC0_matchCntr : (8 downto 0) := (others => '0');
63 signal HammingData : (17 downto 0) := (others => '0');
64 signal TTC_data_we : := '0';
65 signal TTC_data_in : (8 downto 0) := (others => '0');
66 signal TTC_data : (8 downto 0) := (others => '0');
67 signal TTC_data_a : (2 downto 0) := (others => '1');
68 signal bcnt : (11 downto 0) := (others => '0');
69 signal MmCntr : (3 downto 0) := (others => '0');
70 signal GoodBcnt : (3 downto 0) := (others => '0');
71 signal BC0_link : := '0';
72 signal BC0_offset : (3 downto 0) := (others => '0');
73 signal ec_delta_BC0 : := '0';
74 signal delta_BC0 : (3 downto 0) := (others => '0');
75 signal sel_TTC_edge : (2 downto 0) := (others => '0');
76 type array6x9 is array(0 to 5) of (8 downto 0);
77 signal MatchCntr : array6x9 := (others => (others => '0'));
79 TTC_lock <= TTC_lock_i;
80 BC0_lock <= BC0_lock_i;
84 if(TTCclk'event and TTCclk = '1')then
90 if(reset = '1' or TTC_lock_i = '0')then
91 TTC_data_a <= (others => '1');
94 elsif(UsrClk'event and UsrClk = '1')then
95 if(TTC_data_we = '1' and rd_TTC_data = '0')then
96 TTC_data_a <= TTC_data_a + 1;
97 elsif(TTC_data_we = '0' and rd_TTC_data = '1' and TTC_data_a /= "111")then
98 TTC_data_a <= TTC_data_a - 1;
100 if(TTC_data_a = "001")then
103 if(TTC_edge(3) = '1' and rd_enable = '1')then
110 OutStrobe <= TTC_edge(4);
112 variable reached256 : ;
113 variable MatchCntr_MSB : (5 downto 0);
116 reached256 := MatchCntr(5)(4) or MatchCntr(4)(4) or MatchCntr(3)(4) or MatchCntr(2)(4) or MatchCntr(1)(4) or MatchCntr(0)(4);
117 MatchCntr_MSB := MatchCntr(5)(4) & MatchCntr(4)(4) & MatchCntr(3)(4) & MatchCntr(2)(4) & MatchCntr(1)(4) & MatchCntr(0)(4);
119 reached256 := MatchCntr(5)(8) or MatchCntr(4)(8) or MatchCntr(3)(8) or MatchCntr(2)(8) or MatchCntr(1)(8) or MatchCntr(0)(8);
120 MatchCntr_MSB := MatchCntr(5)(8) & MatchCntr(4)(8) & MatchCntr(3)(8) & MatchCntr(2)(8) & MatchCntr(1)(8) & MatchCntr(0)(8);
122 if(UsrClk'event and UsrClk = '1')then
123 ToggleSyncRegs <= ToggleSyncRegs(2 downto 0) & Toggle;
124 TTC_edge <= TTC_edge(5 downto 0) & (ToggleSyncRegs(3) xor ToggleSyncRegs(2));
125 if(TTC_lock_i = '0')then
126 chk_HammingData <= HammingDataValid_dl3;
128 chk_HammingData <= TTC_edge(conv_integer(sel_TTC_edge));
130 if((chk_HammingData = '1' and BC0_l = '1') or TTC_lock_i = '1')then
131 MatchCntr <= (others => (others => '0'));
132 elsif(chk_HammingData = '1' and reached256 = '0')then
134 if(TTC_edge(i+1) = '1')then
135 MatchCntr(i) <= MatchCntr(i) + 1;
139 if(chk_HammingData = '1' and BC0_l = '1' and TTC_lock_i = '0')then
140 sel_TTC_edge(2) <= MatchCntr_MSB(4) or MatchCntr_MSB(5);
141 sel_TTC_edge(1) <= not MatchCntr_MSB(5) and (MatchCntr_MSB(2) or MatchCntr_MSB(3));
142 sel_TTC_edge(0) <= MatchCntr_MSB(5) or (not MatchCntr_MSB(4) and (MatchCntr_MSB(3) or (not MatchCntr_MSB(2) and MatchCntr_MSB(1))));
144 if(chk_HammingData = '1')then
145 if(TTC_lock_i = '0' and HammingData(17 downto 16) = "11")then
148 elsif(simulation and bcnt = x"10f")then
150 elsif(bcnt = x"deb")then
158 if(OutStrobe = '1')then
159 TrigData <= TTC_data(7 downto 0);
160 BC0_link <= TTC_data(8);
162 if(chk_HammingData = '1' and bcnt(3 downto 0) /= HammingData(15 downto 12))then
167 if(TTC_lock_i = '1')then
168 BC0_matchCntr <= (others => '0');
169 elsif(chk_HammingData = '1' and HammingData(17 downto 16) = "11")then
171 BC0_matchCntr <= (others => '0');
173 BC0_matchCntr <= BC0_matchCntr + 1;
176 if(TTC_lock_i = '0')then
177 MmCntr <= (others => '0');
178 elsif(BcntMm_i = '1')then
179 MmCntr <= MmCntr + 1;
180 elsif(GoodBcnt(3) = '1')then
181 MmCntr <= MmCntr - 1;
183 if(or_reduce(MmCntr) = '0' or GoodBcnt(3) = '1' or BcntMm_i = '1')then
184 GoodBcnt <= (others => '0');
185 elsif(chk_HammingData = '1')then
186 GoodBcnt <= GoodBcnt + 1;
188 if(MmCntr(3) = '1')then
190 elsif(BC0_matchCntr(8) = '1' or (simulation and BC0_matchCntr(2) = '1'))then
193 if(HammingDataValid = '1')then
194 HammingData <= HammingData_in;
196 if(HammingData(17) = HammingData(16) and HammingData(17) = BC0_l and bcnt(3 downto 0) = HammingData(15 downto 12) and BC0_lock_i = '1')then
197 TTC_data_in <= BC0_l & HammingData(7 downto 0);
199 TTC_data_in <= BC0_l & x"00";
201 if(chk_HammingData = '1')then
208 i_HammingDataValid_dl3 : SRL16E
210 Q => HammingDataValid_dl3,
-- SRL data output
211 A0 => '0',
-- Select[0] input
212 A1 => '1',
-- Select[1] input
213 A2 => '0',
-- Select[2] input
214 A3 => '0',
-- Select[3] input
215 CE => '1',
-- Clock enable input
216 CLK => UsrClk,
-- Clock input
217 D => HammingDataValid
-- SRL data input
219 g_TTC_data : for i in 1 to 8 generate
222 Q => TTC_data
(i
),
-- SRL data output
223 A0 => TTC_data_a
(0),
-- Select[0] input
224 A1 => TTC_data_a
(1),
-- Select[1] input
225 A2 => TTC_data_a
(2),
-- Select[2] input
226 A3 => '0',
-- Select[3] input
227 CE => TTC_data_we,
-- Clock enable input
228 CLK => UsrClk,
-- Clock input
229 D => TTC_data_in
(i
) -- SRL data input
232 process(TTCclk, reset, TTC_lock_i)
234 if(reset = '1' or TTC_lock_i = '0')then
236 delta_BC0 <= (others => '0');
237 BC0_offset <= (others => '0');
239 elsif(TTCclk'event and TTCclk = '1')then
240 if(BC0_link = '1')then
242 elsif(BC0 = '1' or delta_BC0 = x"f")then
245 if(ec_delta_BC0 = '0')then
246 delta_BC0 <= (others => '0');
248 delta_BC0 <= delta_BC0 + 1;
251 if(ec_delta_BC0 = '1')then
252 BC0_offset <= delta_BC0;
255 BC0_offset <= (others => '0');