eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
fwft_register.vhd
1 -- fwft_register registered FWFT block
2 -- Dave Sankey August 2020
3 -- Originally based on http://www.billauer.co.il/reg_fifo.html...
4 
5 library IEEE;
6 use IEEE.STD_LOGIC_1164.ALL;
7 
8 entity fwft_register is
9  GENERIC(
10  DATA_WIDTH: positive := 64
11  );
12  Port (
13  clk : in std_logic;
14  rst_clk : in std_logic;
15 -- Input signals
16  in_data : IN std_logic_vector(DATA_WIDTH-1 DOWNTO 0);
17  in_valid : IN std_logic;
18  in_ready : OUT std_logic;
19 -- Output signals
20  out_data : OUT std_logic_vector(DATA_WIDTH-1 DOWNTO 0);
21  out_valid : OUT std_logic;
22  out_ready : IN std_logic
23  );
24 end fwft_register;
25 
26 architecture Behavioral of fwft_register is
27 
28 Signal prefetched_data, middle_data: std_logic_vector(DATA_WIDTH-1 downto 0);
29 Signal in_ready_sig: std_logic;
30 
31 begin
32 
33  in_ready <= in_ready_sig and in_valid;
34 
35  register_process: process (clk)
36  Variable load_prefetch, load_middle, prefetch_middle, prefetch_valid, middle_valid, dout_valid, input_ready, ending: std_logic;
37  begin
38  if rising_edge(clk) then
39  if rst_clk = '1' then
40  out_data <= (Others => '0');
41  dout_valid := '0';
42  middle_data <= (Others => '0');
43  middle_valid := '0';
44  prefetched_data <= (Others => '0');
45  prefetch_valid := '0';
46  input_ready := '0';
47  ending := '0';
48  else
49 -- Output register
50  if ((out_ready = '1') or (dout_valid = '0')) then
51  if (middle_valid = '1') then
52  middle_valid := '0';
53  dout_valid := '1';
54  out_data <= middle_data
55  -- pragma translate_off
56  after 2 ns
57  -- pragma translate_on
58  ;
59  else
60  dout_valid := '0';
61  end if;
62  end if;
63  out_valid <= dout_valid
64  -- pragma translate_off
65  after 2 ns
66  -- pragma translate_on
67  ;
68 -- In ready logic preserving an IFG!
69  if ((dout_valid = '1') and (in_valid = '0')) then
70  ending := '1';
71  elsif (dout_valid = '0') then
72  ending := '0';
73  end if;
74  if ((middle_valid = '1') or (ending = '1')) then
75  input_ready := '0';
76  else
77  input_ready := '1';
78  end if;
79  in_ready_sig <= input_ready
80  -- pragma translate_off
81  after 2 ns
82  -- pragma translate_on
83  ;
84 -- Buffer logic
85  if ((middle_valid = '0') and (prefetch_valid = '1')) then
86  prefetch_middle := '1';
87  load_middle := '0';
88  if ((in_valid = '1') and (in_ready_sig = '1')) then
89  load_prefetch := '1';
90  else
91  load_prefetch := '0';
92  end if;
93  elsif ((in_valid = '1') and (in_ready_sig = '1')) then
94  prefetch_middle := '0';
95  if (middle_valid = '1') then
96  load_middle := '0';
97  load_prefetch := '1';
98  else
99  load_middle := '1';
100  load_prefetch := '0';
101  end if;
102  else
103  prefetch_middle := '0';
104  load_middle := '0';
105  load_prefetch := '0';
106  end if;
107 -- Move internal data
108  if (prefetch_middle = '1') then
109  middle_valid := '1';
110  prefetch_valid := '0';
111  middle_data <= prefetched_data
112  -- pragma translate_off
113  after 2 ns
114  -- pragma translate_on
115  ;
116  elsif (load_middle = '1') then
117  middle_valid := '1';
118  prefetch_valid := '0';
119  middle_data <= in_data
120  -- pragma translate_off
121  after 2 ns
122  -- pragma translate_on
123  ;
124  end if;
125  if (load_prefetch = '1') then
126  prefetch_valid := '1';
127  prefetched_data <= in_data
128  -- pragma translate_off
129  after 2 ns
130  -- pragma translate_on
131  ;
132  end if;
133  end if;
134  end if;
135  end process register_process;
136 
137 end Behavioral;