1 | ----------------------------------------------------------------------------------
|
---|
2 | -- Company: ETH Zurich, Institute for Particle Physics
|
---|
3 | -- Engineer: Patrick Vogler
|
---|
4 | --
|
---|
5 | -- Create Date: March 11 2011
|
---|
6 | -- Design Name:
|
---|
7 | -- Module Name: FTM Timing counter
|
---|
8 | -- Project Name:
|
---|
9 | -- Target Devices:
|
---|
10 | -- Tool versions:
|
---|
11 | -- Description: 48 bit counter for time stamping and on-time counting
|
---|
12 | --
|
---|
13 | -- Dependencies:
|
---|
14 | --
|
---|
15 | -- Revision:
|
---|
16 | -- Revision 0.01 - File Created
|
---|
17 | -- Additional Comments:
|
---|
18 | --
|
---|
19 | --
|
---|
20 | -- modifications:
|
---|
21 | --
|
---|
22 | -- April 12 2011 by Patrick Vogler
|
---|
23 | --
|
---|
24 | -- May 18 2011 by Patrick Vogler
|
---|
25 | --
|
---|
26 | -- May 20, 2011, by Q. Weitzel
|
---|
27 | -- counting was wrong by one clock cycle (1 us)
|
---|
28 | --
|
---|
29 | -- May 23, 2011, by Q. Weitzel
|
---|
30 | -- counter reset changed from async to sync reset
|
---|
31 | -- reset, enable and read_counter removed from sensitity lists
|
---|
32 | --
|
---|
33 | ----------------------------------------------------------------------------------
|
---|
34 |
|
---|
35 | library IEEE;
|
---|
36 | use IEEE.STD_LOGIC_1164.ALL;
|
---|
37 | use IEEE.STD_LOGIC_ARITH.ALL;
|
---|
38 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
---|
39 |
|
---|
40 | use IEEE.NUMERIC_STD.ALL;
|
---|
41 |
|
---|
42 | ---- Uncomment the following library declaration if instantiating
|
---|
43 | ---- any Xilinx primitives in this code.
|
---|
44 | library UNISIM;
|
---|
45 | use UNISIM.VComponents.all;
|
---|
46 |
|
---|
47 | library ftm_definitions;
|
---|
48 | USE ftm_definitions.ftm_array_types.all;
|
---|
49 | USE ftm_definitions.ftm_constants.all;
|
---|
50 |
|
---|
51 |
|
---|
52 | entity Timing_counter is
|
---|
53 | port(
|
---|
54 |
|
---|
55 | -- Clock
|
---|
56 | -------------------------------------------------------------------------------
|
---|
57 | clk : in STD_LOGIC; -- 50 MHz system clock
|
---|
58 |
|
---|
59 | enable : in STD_LOGIC; -- enable counter
|
---|
60 | reset : in Std_LOGIC; -- reset counter
|
---|
61 |
|
---|
62 | -- handshake signal
|
---|
63 | read_counter : in STD_LOGIC; -- read counter
|
---|
64 | reading_started : out STD_LOGIC;
|
---|
65 | reading_valid : out STD_LOGIC; -- counter reading at output ready
|
---|
66 |
|
---|
67 | -- counter reading
|
---|
68 | counter_reading : out std_logic_vector (TC_WIDTH - 1 downto 0)
|
---|
69 | );
|
---|
70 | end Timing_counter;
|
---|
71 |
|
---|
72 |
|
---|
73 | architecture Behavioral of Timing_counter is
|
---|
74 |
|
---|
75 | type type_read_counter_state is (IDLE, COPY, SET_VALID, RESET_STARTED);
|
---|
76 | signal read_counter_state : type_read_counter_state := IDLE;
|
---|
77 |
|
---|
78 | signal counting : std_logic_vector (TC_WIDTH - 1 downto 0) := (others => '0');
|
---|
79 | signal counter_reading_sig : std_logic_vector (TC_WIDTH - 1 downto 0) := (others => '0');
|
---|
80 | signal precounting : std_logic_vector (PRECOUNT_WIDTH - 1 downto 0) := (others => '0');
|
---|
81 |
|
---|
82 |
|
---|
83 | begin
|
---|
84 | -- counting
|
---|
85 | -------------------------------------------------------------------------------
|
---|
86 | count : process (clk)
|
---|
87 | begin
|
---|
88 |
|
---|
89 | if rising_edge(clk) then
|
---|
90 | if (reset = '1') then
|
---|
91 | counting <= (others => '0');
|
---|
92 | precounting <= (others => '0');
|
---|
93 | elsif enable = '1' then
|
---|
94 | precounting <= precounting + 1;
|
---|
95 | if (precounting = (PRECOUNT_DIVIDER - 1)) then
|
---|
96 | counting <= counting + 1;
|
---|
97 | precounting <= (others => '0');
|
---|
98 | end if;
|
---|
99 | end if;
|
---|
100 | end if;
|
---|
101 |
|
---|
102 | end process count;
|
---|
103 |
|
---|
104 | -- read counter
|
---|
105 | -------------------------------------------------------------------------------
|
---|
106 | readout_counter : process (clk)
|
---|
107 | begin
|
---|
108 | if rising_edge(clk) then
|
---|
109 | case read_counter_state is
|
---|
110 |
|
---|
111 | when IDLE =>
|
---|
112 | if read_counter = '1' then
|
---|
113 | reading_valid <= '0';
|
---|
114 | reading_started <= '1';
|
---|
115 | read_counter_state <= COPY;
|
---|
116 | end if;
|
---|
117 |
|
---|
118 | when COPY =>
|
---|
119 | counter_reading_sig <= counting;
|
---|
120 | read_counter_state <= SET_VALID;
|
---|
121 |
|
---|
122 | when SET_VALID =>
|
---|
123 | read_counter_state <= RESET_STARTED;
|
---|
124 |
|
---|
125 | when RESET_STARTED =>
|
---|
126 | if read_counter = '0' then
|
---|
127 | reading_started <= '0';
|
---|
128 | reading_valid <= '1';
|
---|
129 | read_counter_state <= IDLE;
|
---|
130 | end if;
|
---|
131 |
|
---|
132 | end case;
|
---|
133 | end if;
|
---|
134 | end process readout_counter;
|
---|
135 |
|
---|
136 | counter_reading <= counter_reading_sig;
|
---|
137 |
|
---|
138 | end Behavioral;
|
---|