2. top.v Sun Dec 06 14:24:10 2015
Page 2
second_5_timer;
47
48 //turn speaker on whenever light is active, use tone tied to light that is on
49 assign tone_sel = LED_on;
50 assign speaker_enable = LED_enable;
51
52 assign speaker = S_tone | F_tone | button_tone;
53
54 //debouncers for simon buttons
55 debouncer simon0(.pressed(s_pressed[0]), .held(s_held[0]), .button(s_button[0
]), .clk(clk), .reset(reset) );
56 debouncer simon1(.pressed(s_pressed[1]), .held(s_held[1]), .button(s_button[1
]), .clk(clk), .reset(reset) );
57 debouncer simon2(.pressed(s_pressed[2]), .held(s_held[2]), .button(s_button[2
]), .clk(clk), .reset(reset) );
58 debouncer simon3(.pressed(s_pressed[3]), .held(s_held[3]), .button(s_button[3
]), .clk(clk), .reset(reset) );
59
60 //deboucer for nexus button
61 debouncer nexus0(.pressed(n_pressed[0]), .held(n_held[0]), .button(n_button[0
]), .clk(clk), .reset(reset) );
62
63 //controls 7seg display
64 seg_ctrl seg1( .segments_n(seg), .anodes_n(anodes_n), .D(next0), .C(next1), .B(
next2), .A(next3), .clk(clk));
65
66 //controls lcd display
67 text_ctrl text1( .lcd_regsel(lcd_regsel), .lcd_read(lcd_read), .lcd_enable(
lcd_enable), .lcd_data(lcd_data), .message(message),
68 .score_ones(score_ones), .score_tens(score_tens), .clk(clk), .
reset(reset));
69
70 //generates random number for light sequence
71 PRNG prng1( .random(random), .step(step), .rerun(rerun), .randomize(randomize), .
clk(clk), .reset(reset)); //PRNG
72
73 //controls what lights are acitve
74 led_ctrl led1(.LED0(LED0), .LED1(LED1), .LED2(LED2), .LED3(LED3), .color(LED_on), .
enable(LED_enable), .clk(clk));
75
76 //decodes and remebers last button press on simon board
77 simon_button_decode sbd1(.button_value(simon_button_value), .button_selected(
simon_button_selected), .s_button(s_held), .save_button(save_button_enable), .clk(clk
));
78
79 //generates a sequence of tones on fail
80 fail_tone_generator FTG_1( .tone_finished(fail_tone_finished), .speaker(F_tone), .
fail_tone_enable(fail_tone_enable), .clk(clk), .reset(reset));
81
82 //generates a seqence of tones on successful round
83 success_tone_generator STG_1(.tone_finished(success_tone_finished), .speaker(S_tone
), .success_tone_enable(success_tone_enable), .clk(clk), .reset(reset));
84
85 //converts binary number to ones and tens place for use on LCD
86 binary_to_BCD BTBCD_1(.A(your_score), .ONES(score_ones), .TENS(score_tens), .
HUNDREDS());
87
3. top.v Sun Dec 06 14:24:10 2015
Page 3
88 //controls when the speaker is active
89 speakerCtrl SC_1(.speaker(button_tone), .tone_sel({1'b0, tone_sel}), .enable(
speaker_enable), .clk(clk));
90
91 //finds what the next four random numbers will be
92 look_ahead LA_1(.next0(next0), .next1(next1), .next2(next2), .next3(next3), .step(
step), .rerun(rerun), .randomize(randomize), .enable(switches[7]), .clk(clk), .reset(
reset) );
93
94 //=====================================================================================
=========================================================================
95
96 always @ (posedge clk) begin
97 if(reset) begin
98 current_state <= STATE_IDLE;
99 end
100 else begin
101 current_state <= next_state;
102
103 //5 second timer
104 if (reset) begin
105 second_5_timer <= `second_5;
106 end
107 if (second_5_timer <= 0)
108 second_5_timer <= `second_5;
109 else if (sec5_enable) begin
110 second_5_timer <= second_5_timer - 1;
111 end
112
113 //1 second timer
114 if (reset) begin
115 second_1_timer <= `second_1;
116 end
117 if (second_1_timer <= 0)
118 second_1_timer <= `second_1;
119 else if (sec1_enable) begin
120 second_1_timer <= second_1_timer - 1;
121 end
122
123 //second_3quarter timer
124 if (reset) begin
125 second_3quarter_timer <= `second_3quarter;
126 end
127 if (second_3quarter_timer <= 0)
128 second_3quarter_timer <= `second_3quarter;
129 else if (sec3_4_enable) begin
130 second_3quarter_timer <= second_3quarter_timer - 1;
131 end
132
133
134 //second_1quarter timer
135 if (reset) begin
136 second_1quarter_timer <= `second_1quarter;
137 end
138 if (second_1quarter_timer <= 0)
139 second_1quarter_timer <= `second_1quarter;
140 else if (sec1_4_enable) begin
4. top.v Sun Dec 06 14:24:10 2015
Page 4
141 second_1quarter_timer <= second_1quarter_timer - 1;
142 end
143
144 //step counter
145 if (reset | step_counter_reset)
146 step_counter <= 0;
147 else begin
148 if (step_counter_enable)
149 step_counter <= step_counter + 1;
150 end
151
152
153 //your score counter
154 if (reset | your_score_counter_reset)
155 your_score <= 0;
156 else begin
157 if (your_score_counter_enable)
158 your_score <= your_score + 1;
159 end
160 end
161 end
162
163
164
165 always @* begin
166
167 //===================================
168 //defaults
169 //===================================
170 next_state = current_state;
171
172 rerun = 0;
173 randomize = 0;
174 LED_enable = 0;
175 step = 0;
176 step_counter_enable = 0;
177 your_score_counter_enable = 0;
178
179 sec1_4_enable = 0;
180 sec3_4_enable = 0;
181 sec1_enable = 0;
182 sec5_enable = 0;
183
184 step_counter_reset = 0;
185 your_score_counter_reset = 0;
186
187 message = message_default;
188
189 save_button_enable = 0;
190
191 fail_tone_enable = 0;
192 success_tone_enable = 0;
193 //=====================================
194
195 case(current_state)
196
197 //do nothing and wait for game to begin
5. top.v Sun Dec 06 14:24:10 2015
Page 5
198 STATE_IDLE: begin
199 message = message_hello;
200 step_counter_reset = 1;
201 your_score_counter_reset = 1;
202 if (|s_pressed)
203 next_state = STATE_RANDOMIZE;
204
205 end
206
207 //randomize the color sequence
208 STATE_RANDOMIZE: begin
209 message = message_hello;
210 if (|s_held)
211 randomize = 1;
212 else begin
213 message = message_simon_playing;
214 sec1_enable = 1;
215 if (second_1_timer == 0)
216 next_state = STATE_SIMON_TONE;
217 end
218 end
219
220 //play sound and light
221 STATE_SIMON_TONE: begin
222 message = message_simon_playing;
223 LED_on = random;
224 LED_enable = 1;
225 sec3_4_enable = 1;
226 if(second_3quarter_timer == 0) begin
227 next_state = STATE_SIMON_TONE_REST;
228 end
229
230 end
231 //turn off speaker and lights, wait 1/4 second
232 STATE_SIMON_TONE_REST: begin
233 message = message_simon_playing;
234 LED_on = random;
235 LED_enable = 0;
236 sec1_4_enable = 1;
237
238 if(second_1quarter_timer == 0) begin
239 next_state = STATE_TONE_COUNT_CHECK;
240 step_counter_enable = 1;
241 step = 1;
242 end
243
244 end
245
246 //check if simon needs to play another tone
247 STATE_TONE_COUNT_CHECK: begin
248 message = message_simon_playing;
249 if (step_counter == (your_score + 1)) begin
250 next_state = STATE_CHEAT_OPTION;
251 rerun = 1;
252 step_counter_reset = 1;
253 end
254 else begin
6. top.v Sun Dec 06 14:24:10 2015
Page 6
255 next_state = STATE_SIMON_TONE;
256 end
257 end
258
259 //gives option to repeat pattern again before trying
260 STATE_CHEAT_OPTION: begin
261 message = message_player_turn;
262 if (n_pressed[0])
263 next_state = STATE_SIMON_TONE;
264 else if (|s_pressed)
265 next_state = STATE_AWAIT_INPUT;
266 end
267
268 //wait for any input from player
269 STATE_AWAIT_INPUT: begin
270 message = message_player_turn;
271 if (|s_held)
272 next_state = STATE_CHECK_INPUT;
273 end
274
275 //check if the input was correct
276 STATE_CHECK_INPUT: begin
277 message = message_player_turn;
278 if (|s_held) begin
279 LED_on = simon_button_value;
280 LED_enable = 1;
281 save_button_enable = 1;
282 end
283
284 else if (simon_button_selected == random) begin
285 if (step_counter == your_score) begin
286 next_state = STATE_DELAY_SUCCESS_TONE;
287 your_score_counter_enable = 1;
288 end
289 else begin
290 step = 1;
291 step_counter_enable = 1;
292 next_state = STATE_AWAIT_INPUT;
293 end
294 end
295 else if (simon_button_selected != random) begin
296 next_state = STATE_DELAY_FAIL_TONE;
297 end
298
299 end
300
301 STATE_DELAY_SUCCESS_TONE: begin
302 message = message_correct_round;
303 sec3_4_enable = 1;
304 if (second_3quarter_timer == 0) begin
305 next_state = STATE_SUCCESSFUL_ROUND;
306 success_tone_enable = 1;
307 end
308 end
309
310 STATE_DELAY_FAIL_TONE: begin
311 message = message_bad_round;
7. top.v Sun Dec 06 14:24:11 2015
Page 7
312 sec3_4_enable = 1;
313 if (second_3quarter_timer == 0) begin
314 next_state = STATE_FAIL_TONE;
315 fail_tone_enable = 1;
316 end
317 end
318
319
320 STATE_SUCCESSFUL_ROUND: begin
321 message = message_correct_round;
322 rerun = 1;
323 step_counter_reset = 1;
324
325
326 if (success_tone_finished) begin
327 next_state = STATE_SUCCESS_WAIT;
328 end
329 end
330
331 STATE_SUCCESS_WAIT: begin
332 message = message_correct_round;
333 nexus_LED[0] = 1;
334 sec3_4_enable = 1;
335
336 //wait 3/4 of a second
337 if (second_3quarter_timer == 0)
338 next_state = STATE_SIMON_TONE;
339 end
340
341
342 STATE_FAIL_TONE: begin
343 message = message_bad_round;
344 nexus_LED[7] = 1;
345 if (fail_tone_finished) begin
346 next_state = STATE_FAIL_WAIT;
347 end
348 end
349
350
351 STATE_FAIL_WAIT: begin
352 message = message_bad_round;
353 sec5_enable = 1;
354
355 //wait 5 seconds
356 if (second_5_timer == 0) begin
357 next_state = STATE_PLAY_AGAIN;
358 end
359 end
360
361 //option to play again
362 STATE_PLAY_AGAIN: begin
363 message = message_try_again;
364 if (|s_pressed) begin
365 next_state = STATE_IDLE;
366 end
367 end
368
8. top.v Sun Dec 06 14:24:11 2015
Page 8
369 endcase
370
371
372 end
373
374
375
376
377 endmodule
378