OpenCores
URL https://opencores.org/ocsvn/pulse_processing_algorithm/pulse_processing_algorithm/trunk

Subversion Repositories pulse_processing_algorithm

[/] [pulse_processing_algorithm/] [output_select.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 panda_emc
-----------------------------------------------------------------------------------------------
2
--
3
--    Copyright (C) 2011 Peter Lemmens, PANDA collaboration
4
--              p.j.j.lemmens@rug.nl
5
--    http://www-panda.gsi.de
6
--
7
--    As a reference, please use:
8
--    E. Guliyev, M. Kavatsyuk, P.J.J. Lemmens, G. Tambave, H. Loehner,
9
--    "VHDL Implementation of Feature-Extraction Algorithm for the PANDA Electromagnetic Calorimeter"
10
--    Nuclear Inst. and Methods in Physics Research, A ....
11
--
12
--
13
--    This program is free software; you can redistribute it and/or modify
14
--    it under the terms of the GNU Lesser General Public License as published by
15
--    the Free Software Foundation; either version 3 of the License, or
16
--    (at your option) any later version.
17
--
18
--    This program is distributed in the hope that it will be useful,
19
--    but WITHOUT ANY WARRANTY; without even the implied warranty of
20
--    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
--    GNU Lesser General Public License for more details.
22
--
23
--    You should have received a copy of the GNU General Public License
24
--    along with this program; if not, write to the Free Software
25
--    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
26
--
27
-----------------------------------------------------------------------------------------------
28
-- Company              :       KVI (Kernfysisch Versneller Instituut  -- Groningen, The Netherlands    
29
-- Author               :       P.J.J. Lemmens
30
-- Design Name  :       Feature Extraction
31
-- Module Name  :       data_select.vhd 
32
-- Description  :       The data-selector is in essence a DEBUG-feature that enables the selection
33
--                                              of 1 of 16 busses for output; most giving continuous data.
34
--                                      
35
--                                      0        'echo-mode' copying input data to output to see if anything works at all
36
--                                      1       mwd (moving window deconv) output = CF-input
37
--                                      2       baseline value
38
--                                      3       CF-input signal clamped to zero
39
--                                      4       CF-input signal clamped to zero and delayed
40
--                                      5       CF-input signal clamped to zero and divided by 4 (or 2) and inverted
41
--                                      6       CF result
42
--                                      7       CF-input signal integrated
43
--                                      8       zero-crossing detection signal
44
--                                      9       event-detection signal
45
--                                      10      gating signal
46
--                                      11      energy/amplitude/peak-value of signal at an event
47
--                                      12      samplenr (lower 16-bits) when an event is detected
48
--                                      13      samplenr (lower 16-bits) when an event is detected
49
--                                      14      time fraction (right alligned)
50
--                                      15      multiplexed event feature packet
51
--                                              
52
-----------------------------------------------------------------------------------------------
53
LIBRARY ieee;
54
USE ieee.std_logic_1164.ALL;
55
USE ieee.std_logic_unsigned.all;
56
use IEEE.STD_LOGIC_ARITH.ALL;
57
 
58
entity output_select is
59
        PORT    (       clk                                     : in  std_logic;
60
                                output_select           : in  std_logic_vector;
61
                                indata_in                       : in  std_logic_vector; -- Feature Extraction data_in
62
                                mwd_in                          : in  std_logic_vector;
63
                                baseline_in                     : in  std_logic_vector;
64
                                clamped_in                      : in  std_logic_vector;
65
                                del_clamp_in            : in  std_logic_vector;
66
                                CFdev_clamp_in          : in  std_logic_vector;
67
                                cf_trace_in                     : in  std_logic_vector;
68
                                integral_in                     : in  std_logic_vector;
69
                                zerox_in                                : in    std_logic;
70
                                eventdetect_in          : in    std_logic;
71
                                gate_in                         : in    std_logic;
72
                                energy_in                       : in  std_logic_vector;
73
                                mux_data_in                     : in    std_logic_vector;
74
                                samplenr_in                     : in    STD_LOGIC_VECTOR;
75
                                fraction_in                     : in    STD_LOGIC_VECTOR;
76
                                mux_data_valid_in       : in    std_logic;
77
                                fe_data_valid           : in    std_logic;
78
                                dataword_out            : out   std_logic_vector;
79
                                data_out_valid          : out   std_logic
80
                        );
81
end output_select;
82
 
83
architecture Behavioral of output_select is
84
 
85
        constant WIDTH  : natural       := indata_in'length;
86
 
87
        signal clk_S                                    : std_logic := '0';
88
        signal output_select_S          : std_logic_vector(output_select'high downto 0) := (others => '0');
89
 
90
        signal indata_in_S                      : std_logic_vector(WIDTH - 1 downto 0) := (others => '0');
91
        signal mwd_in_S                         : std_logic_vector(WIDTH - 1 downto 0) := (others => '0');
92
        signal baseline_in_S                    : std_logic_vector(WIDTH - 1 downto 0);
93
        signal clamped_in_S                     : std_logic_vector(WIDTH - 1 downto 0);
94
        signal del_clamp_in_S           : std_logic_vector(WIDTH - 1 downto 0);
95
        signal CFdev_clamp_in_S         : std_logic_vector(WIDTH - 1 downto 0);
96
        signal cf_trace_in_S                    : STD_LOGIC_VECTOR(WIDTH - 1 downto 0);
97
        signal integral_in_S                    : STD_LOGIC_VECTOR(WIDTH - 1 downto 0);
98
        signal zeroX_in_S                               : STD_LOGIC;
99
        signal eventdetect_in_S         : STD_LOGIC;
100
        signal gate_in_S                                : STD_LOGIC;
101
        signal energy_in_S                      : STD_LOGIC_VECTOR(WIDTH - 1 downto 0);
102
 
103
        signal dataLSB_out_S                    : std_logic_vector(7 downto 0) := (others => '0');
104
        signal dataMSB_out_S                    : std_logic_vector(7 downto 0) := (others => '0');
105
        signal uar_data_valid_in_S      : std_logic;
106
        signal mux_data_in_S                    : std_logic_vector(15 downto 0) := (others => '0');
107
        signal samplenr_in_S                    : std_logic_vector(63 downto 0) := (others => '0');
108
        signal fraction_in_S                    : STD_LOGIC_VECTOR(15 downto 0) := (others => '0');
109
        signal mux_data_in_valid_S      : std_logic;
110
 
111
        signal dataword_out_S           : std_logic_vector(15 downto 0) := (others => '0');
112
        signal intermed_valid_S         : std_logic;
113
        signal data_out_valid_S         : std_logic;
114
 
115
begin
116
 
117
        clk_S                                           <=      clk;
118
        output_select_S         <=      output_select;
119
        indata_in_S                             <=      indata_in;
120
        mwd_in_S                                        <=      mwd_in;
121
        baseline_in_S                   <=      baseline_in;
122
        clamped_in_S                    <=      clamped_in;
123
        del_clamp_in_S                  <=      del_clamp_in;
124
        CFdev_clamp_in_S                <=      CFdev_clamp_in;
125
        cf_trace_in_S                   <=      cf_trace_in;
126
        integral_in_S                   <=      integral_in;
127
        zerox_in_S                              <=      zerox_in;
128
        eventdetect_in_S                <=      eventdetect_in;
129
        gate_in_S                               <=      gate_in;
130
        energy_in_S                             <=      energy_in;
131
        mux_data_in_S                   <=      mux_data_in;
132
        samplenr_in_S                   <=      samplenr_in;
133
        fraction_in_S(fraction_in'high downto 0)                                                         <= fraction_in;
134
        fraction_in_S(fraction_in_S'high downto fraction_in'high + 1)   <= (others => '0');
135
        mux_data_in_valid_S     <=      mux_data_valid_in;
136
        uar_data_valid_in_S     <=      fe_data_valid;
137
        dataword_out                    <= dataword_out_S;
138
        data_out_valid                  <=      data_out_valid_S;
139
 
140
        select_proc : process(clk_S)    --, output_select_S, indata_in_S, baseline_in_S, clamped_in_S, del_clamp_in_S, CFdev_clamp_in_S,
141
                                                                        --cf_trace_in_S, integral_in_S, zeroX_in_S, gate_in_S, energy_in_S, mux_data_in_S, mux_data_in_valid_S)
142
        begin
143
                if (clk_S'event and clk_S = '1') then           -- clocking this SOB gives 2 extra delays... laat maar
144
                        case conv_integer(output_select_S) is
145
                                when 0 =>
146
                                        dataLSB_out_S                                                                           <= indata_in_S(7 downto 0);
147
                                        dataMSB_out_S                                                                           <= indata_in_S(15 downto 8);
148
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
149
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
150
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
151
                                        data_out_valid_S                                                                        <= intermed_valid_S;
152
                                when 1 =>
153
                                        dataLSB_out_S                                                                           <= mwd_in_S(7 downto 0);
154
                                        dataMSB_out_S                                                                           <= mwd_in_S(15 downto 8);
155
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
156
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
157
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
158
                                        data_out_valid_S                                                                        <= intermed_valid_S;
159
                                when 2 =>
160
                                        dataLSB_out_S                                                                           <= baseline_in_S(7 downto 0);
161
                                        dataMSB_out_S                                                                           <= baseline_in_S(15 downto 8);
162
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
163
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
164
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
165
                                        data_out_valid_S                                                                        <= intermed_valid_S;
166
                                when 3 =>
167
                                        dataLSB_out_S                                                                           <= clamped_in_S(7 downto 0);
168
                                        dataMSB_out_S                                                                           <= clamped_in_S(15 downto 8);
169
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
170
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
171
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
172
                                        data_out_valid_S                                                                        <= intermed_valid_S;
173
                                when 4 =>
174
                                        dataLSB_out_S                                                                           <= del_clamp_in_S(7 downto 0);
175
                                        dataMSB_out_S                                                                           <= del_clamp_in_S(15 downto 8);
176
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
177
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
178
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
179
                                        data_out_valid_S                                                                        <= intermed_valid_S;
180
                                when 5 =>
181
                                        dataLSB_out_S                                                                           <= CFdev_clamp_in_S(7 downto 0);
182
                                        dataMSB_out_S                                                                           <= CFdev_clamp_in_S(15 downto 8);
183
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
184
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
185
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
186
                                        data_out_valid_S                                                                        <= intermed_valid_S;
187
                                when 6 =>
188
                                        dataLSB_out_S                                                                           <= cf_trace_in_S(7 downto 0);
189
                                        dataMSB_out_S                                                                           <= cf_trace_in_S(15 downto 8);
190
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
191
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
192
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
193
                                        data_out_valid_S                                                                        <= intermed_valid_S;
194
                                when 7 =>
195
                                        dataLSB_out_S                                                                           <= integral_in_S(7 downto 0);
196
                                        dataMSB_out_S                                                                           <= integral_in_S(15 downto 8);
197
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
198
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
199
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
200
                                        data_out_valid_S                                                                        <= intermed_valid_S;
201
                                when 8 =>
202
                                        dataLSB_out_S(7)                                                                        <= zeroX_in_S;
203
                                        dataLSB_out_S(6 downto 0)                                                <= (others => '0');
204
                                        dataMSB_out_S                                                                           <= (others => '0');
205
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
206
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
207
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
208
                                        data_out_valid_S                                                                        <= intermed_valid_S;
209
                                when 9 =>
210
                                        dataLSB_out_S(7)                                                                        <= eventdetect_in_S;
211
                                        dataLSB_out_S(6 downto 0)                                                <= (others => '0');
212
                                        dataMSB_out_S                                                                           <= (others => '0');
213
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
214
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
215
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
216
                                        data_out_valid_S                                                                        <= intermed_valid_S;
217
                                when 10 =>
218
                                        dataLSB_out_S(7)                                                                        <= gate_in_S;
219
                                        dataLSB_out_S(6 downto 0)                                                <= (others => '0');
220
                                        dataMSB_out_S                                                                           <= (others => '0');
221
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
222
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
223
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
224
                                        data_out_valid_S                                                                        <= intermed_valid_S;
225
                                when 11 =>
226
                                        dataLSB_out_S                                                                           <= energy_in_S(7 downto 0);
227
                                        dataMSB_out_S                                                                           <= energy_in_S(15 downto 8);
228
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
229
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
230
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
231
                                        data_out_valid_S                                                                        <= intermed_valid_S;
232
                                when 12 =>
233
                                        dataLSB_out_S                                                                           <= samplenr_in_S(7 downto 0);
234
                                        dataMSB_out_S                                                                           <= samplenr_in_S(15 downto 8);
235
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
236
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
237
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
238
                                        data_out_valid_S                                                                        <= intermed_valid_S;
239
                                when 13 =>
240
                                        dataLSB_out_S                                                                           <= samplenr_in_S(23 downto 16);
241
                                        dataMSB_out_S                                                                           <= samplenr_in_S(31 downto 24);
242
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
243
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
244
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
245
                                        data_out_valid_S                                                                        <= intermed_valid_S;
246
                                when 14 =>
247
                                        dataLSB_out_S                                                                           <= fraction_in_S(7 downto 0);
248
                                        dataMSB_out_S                                                                           <= fraction_in_S(15 downto 8);
249
                                        intermed_valid_S                                                                        <= uar_data_valid_in_S;
250
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
251
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
252
                                        data_out_valid_S                                                                        <= intermed_valid_S;
253
                                when others =>
254
                                        dataLSB_out_S                                                                           <= mux_data_in_S(7 downto 0);
255
                                        dataMSB_out_S                                                                           <= mux_data_in_S(15 downto 8);
256
                                        intermed_valid_S                                                                        <= mux_data_in_valid_S;
257
                                        dataword_out_S(7 downto 0)                                               <= dataMSB_out_S;
258
                                        dataword_out_S(15 downto 8)                                     <= dataLSB_out_S;
259
                                        data_out_valid_S                                                                        <= intermed_valid_S;
260
                        end case;
261
                end if;
262
        end process;
263
end Behavioral;
264
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.