1
|
--------------------------------------------------------------------------------
|
2
|
-- BEST CHRONOMETER EVER -------------------------------------------------------
|
3
|
--------------------------------------------------------------------------------
|
4
|
library IEEE;
|
5
|
|
6
|
-- Required by the use of "std_logic_vector".
|
7
|
use IEEE.STD_LOGIC_1164.ALL;
|
8
|
|
9
|
entity best_chronometer_ever is
|
10
|
port
|
11
|
(
|
12
|
i_clock: in std_logic;
|
13
|
i_reset: in std_logic;
|
14
|
i_start_bp: in std_logic;
|
15
|
i_raz_bp: in std_logic;
|
16
|
o_display: out std_logic_vector (6 downto 0);
|
17
|
o_an: out std_logic_vector (3 downto 0)
|
18
|
);
|
19
|
end best_chronometer_ever;
|
20
|
|
21
|
architecture Behavioral of best_chronometer_ever is
|
22
|
-- Signals ------------------------------------------------------------------
|
23
|
signal new_centisecond: std_logic;
|
24
|
signal raz: std_logic;
|
25
|
signal enable: std_logic;
|
26
|
signal limit_reached: std_logic;
|
27
|
signal synced_start_bp: std_logic;
|
28
|
signal synced_raz_bp: std_logic;
|
29
|
signal numeral_display: natural range 0 to 9;
|
30
|
signal curr_0001_time: natural range 0 to 9;
|
31
|
signal curr_0010_time: natural range 0 to 9;
|
32
|
signal curr_0100_time: natural range 0 to 9;
|
33
|
signal curr_1000_time: natural range 0 to 5;
|
34
|
|
35
|
-- Components ---------------------------------------------------------------
|
36
|
component centisecond_timer is
|
37
|
generic
|
38
|
(
|
39
|
---- For implementation:
|
40
|
-- g_clock_cycle_per_centisecond: natural := 500000
|
41
|
---- For testing, we recommend using:
|
42
|
g_clock_cycle_per_centisecond: natural := 8
|
43
|
);
|
44
|
port
|
45
|
(
|
46
|
i_clock: in std_logic; -- System clock.
|
47
|
i_reset: in std_logic; -- System reset.
|
48
|
i_raz: in std_logic; -- User triggered raz.
|
49
|
i_enable: in std_logic; -- Time is passing.
|
50
|
o_new_centisecond: out std_logic -- Centisecond pulse.
|
51
|
);
|
52
|
end component;
|
53
|
|
54
|
component crossdomain_sync is
|
55
|
port
|
56
|
(
|
57
|
i_clock: in std_logic; -- System clock.
|
58
|
i_reset: in std_logic; -- System reset.
|
59
|
i_signal: in std_logic; -- Asynchronous signal.
|
60
|
o_signal: out std_logic -- Synchronous signal.
|
61
|
);
|
62
|
end component;
|
63
|
|
64
|
component display_manager is
|
65
|
generic
|
66
|
(
|
67
|
---- For implementation:
|
68
|
-- g_clock_cycle_per_display: natural := 125000
|
69
|
---- For testing, we recommend using:
|
70
|
g_clock_cycle_per_display: natural := 2
|
71
|
);
|
72
|
port
|
73
|
(
|
74
|
i_clock: in std_logic; -- System clock.
|
75
|
i_reset: in std_logic; -- System reset.
|
76
|
i_curr_0001_time: in natural range 0 to 9; -- Centiseconds
|
77
|
i_curr_0010_time: in natural range 0 to 9; -- deciseconds
|
78
|
i_curr_0100_time: in natural range 0 to 9; -- seconds
|
79
|
i_curr_1000_time: in natural range 0 to 5; -- decaseconds
|
80
|
o_display: out natural range 0 to 9; -- number on display
|
81
|
o_an: out std_logic_vector (3 downto 0) -- selected display
|
82
|
);
|
83
|
end component;
|
84
|
|
85
|
component numeral_to_display is
|
86
|
generic
|
87
|
(
|
88
|
-- To be moved into a converter.
|
89
|
g_display_value_0: std_logic_vector(6 downto 0) := B"0000001";
|
90
|
g_display_value_1: std_logic_vector(6 downto 0) := B"1001111";
|
91
|
g_display_value_2: std_logic_vector(6 downto 0) := B"0010010";
|
92
|
g_display_value_3: std_logic_vector(6 downto 0) := B"0000110";
|
93
|
g_display_value_4: std_logic_vector(6 downto 0) := B"1001100";
|
94
|
g_display_value_5: std_logic_vector(6 downto 0) := B"0100100";
|
95
|
g_display_value_6: std_logic_vector(6 downto 0) := B"0100000";
|
96
|
g_display_value_7: std_logic_vector(6 downto 0) := B"0001111";
|
97
|
g_display_value_8: std_logic_vector(6 downto 0) := B"0000000";
|
98
|
g_display_value_9: std_logic_vector(6 downto 0) := B"0000100";
|
99
|
g_display_value_error: std_logic_vector(6 downto 0) := B"0110000"
|
100
|
);
|
101
|
port
|
102
|
(
|
103
|
i_numeral_time: in natural range 0 to 9; -- numeral input
|
104
|
o_display: out std_logic_vector(6 downto 0) -- display output
|
105
|
);
|
106
|
end component;
|
107
|
|
108
|
component time_wizard is
|
109
|
port
|
110
|
(
|
111
|
i_clock: in std_logic;
|
112
|
i_reset: in std_logic;
|
113
|
i_raz: in std_logic;
|
114
|
i_new_centisecond: in std_logic;
|
115
|
o_limit_reached: out std_logic;
|
116
|
o_curr_0001_time: out natural range 0 to 9;
|
117
|
o_curr_0010_time: out natural range 0 to 9;
|
118
|
o_curr_0100_time: out natural range 0 to 9;
|
119
|
o_curr_1000_time: out natural range 0 to 5
|
120
|
);
|
121
|
end component;
|
122
|
|
123
|
component user_handler is
|
124
|
port
|
125
|
(
|
126
|
i_clock: in std_logic; -- System's clock.
|
127
|
i_reset: in std_logic; -- System reset.
|
128
|
i_synced_start_btn: in std_logic; -- User input. Synchronized.
|
129
|
i_synced_raz_btn: in std_logic; -- User input. Synchronized.
|
130
|
i_limit_reached: in std_logic; -- Time Wizard has reached limit.
|
131
|
o_enable: out std_logic; -- Enable time passing.
|
132
|
o_raz: out std_logic -- Reset system.
|
133
|
);
|
134
|
end component;
|
135
|
begin
|
136
|
START_BP_SYNCHRONIZER: crossdomain_sync port map
|
137
|
(
|
138
|
i_clock => i_clock,
|
139
|
i_reset => i_reset,
|
140
|
i_signal => i_start_bp,
|
141
|
o_signal => synced_start_bp
|
142
|
);
|
143
|
|
144
|
RAZ_BP_SYNCHRONIZER: crossdomain_sync port map
|
145
|
(
|
146
|
i_clock => i_clock,
|
147
|
i_reset => i_reset,
|
148
|
i_signal => i_raz_bp,
|
149
|
o_signal => synced_raz_bp
|
150
|
);
|
151
|
|
152
|
CNTSCD_TM: centisecond_timer port map
|
153
|
(
|
154
|
i_clock => i_clock,
|
155
|
i_reset => i_reset,
|
156
|
i_raz => raz,
|
157
|
i_enable => enable,
|
158
|
o_new_centisecond => new_centisecond
|
159
|
);
|
160
|
|
161
|
DSPLY_MGR: display_manager port map
|
162
|
(
|
163
|
i_clock => i_clock,
|
164
|
i_reset => i_reset,
|
165
|
i_curr_0001_time => curr_0001_time,
|
166
|
i_curr_0010_time => curr_0010_time,
|
167
|
i_curr_0100_time => curr_0100_time,
|
168
|
i_curr_1000_time => curr_1000_time,
|
169
|
o_display => numeral_display,
|
170
|
o_an => o_an
|
171
|
);
|
172
|
|
173
|
DSPLY_TRSLTR: numeral_to_display port map
|
174
|
(
|
175
|
i_numeral_time => numeral_display,
|
176
|
o_display => o_display
|
177
|
);
|
178
|
|
179
|
TM_WZRD: time_wizard port map
|
180
|
(
|
181
|
i_clock => i_clock,
|
182
|
i_reset => i_reset,
|
183
|
i_raz => raz,
|
184
|
i_new_centisecond => new_centisecond,
|
185
|
o_limit_reached => limit_reached,
|
186
|
o_curr_0001_time => curr_0001_time,
|
187
|
o_curr_0010_time => curr_0010_time,
|
188
|
o_curr_0100_time => curr_0100_time,
|
189
|
o_curr_1000_time => curr_1000_time
|
190
|
);
|
191
|
|
192
|
USR_HNDLR: user_handler port map
|
193
|
(
|
194
|
i_clock => i_clock,
|
195
|
i_reset => i_reset,
|
196
|
i_synced_start_btn => synced_start_bp,
|
197
|
i_synced_raz_btn => synced_raz_bp,
|
198
|
i_limit_reached => limit_reached,
|
199
|
o_enable => enable,
|
200
|
o_raz => raz
|
201
|
);
|
202
|
end;
|