eFEX firmware
1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards
Back to eFEX documentation
Infrastructure
control_fpga
src
data_path
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;
fwft_register.Behavioral
Definition:
fwft_register.vhd:26
fwft_register
Definition:
fwft_register.vhd:8
Generated on Tue Nov 11 2025 09:44:32 for eFEX firmware by
1.9.1