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

Subversion Repositories pulse_processing_algorithm

[/] [pulse_processing_algorithm/] [history_max.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
-----------------------------------------------------------------------------------------------
29
-- Company              :       KVI (Kernfysisch Versneller Instituut  -- Groningen, The Netherlands    
30
-- Author               :       P.J.J. Lemmens
31
-- Design Name  :       Feature Extraction
32
-- Module Name  :       peak_detect.vhd
33
-- Description  :       peak-detector keeps track of <DEPTH> samples. When a trigger occurs
34
--                                              the max value of these samples is determined and sent to max_out
35
--                                              accompanied by a max_valid signal. This process runs on the sample clock
36
--                                              and the <DEPTH> determines it's latency
37
--                                              
38
-----------------------------------------------------------------------------------------------
39
library IEEE;
40
use IEEE.STD_LOGIC_1164.ALL;
41
use IEEE.STD_LOGIC_ARITH.ALL;
42
use IEEE.STD_LOGIC_SIGNED.ALL;
43
 
44
 
45
entity history_max is
46
        generic(        MEM_PWR                 :       natural :=      1;              -- memory size = 2^MEM_PWR
47
                                DEPTH                           :       natural := 1            --      implemented buffer depth; should be < 2^MEM_PWR
48
                                );
49
        Port (  rst                     : in  STD_LOGIC;
50
                                clk                     : in  STD_LOGIC;
51
                                enable          : in  STD_LOGIC := '1';
52
                                trigger         : in    STD_LOGIC;
53
                                data_in         : in  STD_LOGIC_VECTOR;
54
                                max_valid       : out   STD_LOGIC;
55
                                max_out         : out   STD_LOGIC_VECTOR
56
                        );
57
end history_max;
58
 
59
architecture Behavioral of history_max is
60
 
61
        constant        WIDTH                                           : natural := data_in'length;
62
 
63
        component pipeline
64
                generic(        RAM_SIZE_PWR    : natural;
65
                                        DELAY                           :       natural);
66
                port (  rst                             : IN STD_LOGIC ;
67
                                        clk                             : IN STD_LOGIC ;
68
                                        enable                  : IN  STD_LOGIC := '1';
69
                                        data_in                 : IN STD_LOGIC_VECTOR;
70
                                        data_valid              : out   std_logic;
71
                                        data_out                        : OUT STD_LOGIC_VECTOR
72
                                );
73
        end component;
74
 
75
        signal rst_S                            : std_logic := '1';
76
        signal clk_S                            : std_logic;
77
        signal enable_S                 : std_logic := '1';
78
        signal trigger_S                        : std_logic := '1';
79
        signal data_in_S                        : std_logic_vector(WIDTH - 1 downto 0) := (others => '0');
80
        signal del_data_S                       : std_logic_vector(WIDTH - 1 downto 0) := (others => '0');
81
        signal max_valid_S              : std_logic := '0';
82
        signal max_out_S                        : std_logic_vector(WIDTH - 1 downto 0) := (others => '0');
83
 
84
        signal pipecount_S              : std_logic_vector(MEM_PWR downto 0) := (others => '0');
85
 
86
begin
87
 
88
                history_pipe : pipeline
89
                        generic map(RAM_SIZE_PWR        =>      MEM_PWR,
90
                                                        DELAY                           => DEPTH - 1) -- hier doen want ik voeg in deze file ook nog een stap toe !!
91
                        PORT MAP (      rst             => rst_S,
92
                                                        clk             => clk_S,
93
                                                        enable  =>      enable_S,                       -- this pipe is allways running !!
94
                                                        data_in => data_in_S,
95
                                                        data_out => del_data_S
96
                                                );
97
 
98
                clk_S                   <= clk;                                                                                                 -- connect clk PORT to internal clk-signal
99
                rst_S                   <= rst;
100
                enable_S        <= enable;
101
                trigger_S       <= trigger;
102
                data_in_S       <= data_in;
103
                max_valid       <=      max_valid_S;
104
                max_out         <=      max_out_S;
105
 
106
                get_max : process (clk_S, rst_S, data_in_S, trigger_S)
107
                begin
108
                        if (clk_S'event and clk_S = '1') then
109
                                if (rst_S = '1') then
110
                                        max_valid_S     <= '0';
111
                                        pipecount_S <= (others => '0');
112
                                else
113
                                        if (enable_S = '1') then
114
                                                if (trigger_S = '1') then
115
                                                        pipecount_S     <= conv_std_logic_vector(DEPTH - 1, MEM_PWR + 1);
116
                                                        max_out_S       <= del_data_S;
117
                                                else
118
                                                        if (pipecount_S > 0) then
119
                                                                pipecount_S <= pipecount_S - 1;
120
                                                                if (del_data_S > max_out_S) then
121
                                                                        max_out_S       <= del_data_S;  -- this is one extra delay
122
                                                                end if;
123
                                                        end if;
124
                                                end if;
125
 
126
                                                if (pipecount_S = 1) then
127
                                                        max_valid_S     <= '1';
128
                                                else
129
                                                        max_valid_S     <= '0';
130
                                                end if;
131
 
132
                                        end if;
133
                                end if;
134
                        end if;
135
                end process;
136
 
137
end Behavioral;

powered by: WebSVN 2.1.0

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