SlideShare a Scribd company logo
1 of 8
Download to read offline
top.v Sun Dec 06 14:24:10 2015
Page 1
1 `timescale 1ns / 1ps
2 `define second_3quarter 37500000
3 `define second_1quarter 12500000
4 `define second_1 50000000
5 `define second_5 250000000
6 //////////////////////////////////////////////////////////////////////////////////
7 // Company: George Fox University
8 // Engineers In Training: Jakob Michael & Dakota Musso
9 //
10 // Create Date: 12/6/2015
11 // Project Name: Final Project For ENGR 220
12 // Description: Version Of Milton Bradley Simon Says Game
13 //
14 //////////////////////////////////////////////////////////////////////////////////
15 module top(output [2:0] LED0, LED1, LED2, LED3, output speaker, output [7:0]seg,
output reg [7:0] nexus_LED, output [3:0]anodes_n, output lcd_regsel, lcd_read,
lcd_enable,
16 inout [7:0] lcd_data, input [7:0]switches, input [3:0] s_button_n,
input [3:0] n_button, input clk );
17
18 wire reset = switches[0];
19 wire [3:0] s_button = ~s_button_n;
20 wire [3:0] s_pressed, s_held, n_pressed, n_held;
21 wire [1:0] random, simon_button_value, simon_button_selected;
22 wire fail_tone_finished, success_tone_finished;
23 wire S_tone, F_tone, button_tone;
24 wire [3:0] score_ones, score_tens;
25 wire [1:0] tone_sel;
26 wire [3:0] next0, next1, next2, next3;
27
28 localparam light_0 = 0, light_1 = 1, light_2 = 2, light_3 = 3;
29
30 //state declarations
31 localparam STATE_IDLE = 0, STATE_RANDOMIZE = 1, STATE_SIMON_TONE = 2,
STATE_SIMON_TONE_REST = 3, STATE_TONE_COUNT_CHECK = 4, STATE_CHEAT_OPTION = 5,
STATE_AWAIT_INPUT = 6,
32 STATE_CHECK_INPUT = 7, STATE_DELAY_SUCCESS_TONE = 8,
STATE_DELAY_FAIL_TONE = 9, STATE_SUCCESSFUL_ROUND = 10, STATE_SUCCESS_WAIT = 11,
STATE_FAIL_TONE = 12,
33 STATE_FAIL_WAIT = 13, STATE_PLAY_AGAIN = 14;
34
35 //message declarations
36 localparam message_default = 0, message_hello = 1, message_simon_playing = 2,
message_player_turn = 3, message_correct_round = 4, message_bad_round = 5,
message_try_again = 6;
37
38 reg [7:0] step_counter, your_score;
39 reg [5:0] current_state, next_state;
40 reg LED_enable, timer_enable, step_counter_enable, your_score_counter_enable,
save_button_enable;
41 reg step_counter_reset, your_score_counter_reset;
42 reg sec1_4_enable, sec3_4_enable, sec1_enable, sec5_enable, fail_tone_enable,
success_tone_enable;
43 reg [1:0] LED_on;
44 reg [2:0] message;
45 reg randomize, rerun, step;
46 reg [30:0] second_3quarter_timer, second_1quarter_timer, second_1_timer,
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
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
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
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
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;
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
top.v Sun Dec 06 14:24:11 2015
Page 8
369 endcase
370
371
372 end
373
374
375
376
377 endmodule
378

More Related Content

Viewers also liked

Pesto chicken kebabs with roasted veg pasta
Pesto chicken kebabs with roasted veg pastaPesto chicken kebabs with roasted veg pasta
Pesto chicken kebabs with roasted veg pasta6sbradbury
 
ROOF-Sendstep-explanation
ROOF-Sendstep-explanation ROOF-Sendstep-explanation
ROOF-Sendstep-explanation Osman Çelik
 
James McCafferty CV 2015 Rev I
James McCafferty CV 2015 Rev IJames McCafferty CV 2015 Rev I
James McCafferty CV 2015 Rev IJames McCafferty
 
Present simple
Present simplePresent simple
Present simpleainabonet
 
Pawer point london
Pawer point londonPawer point london
Pawer point londonainabonet
 
Historia dibujo
Historia dibujoHistoria dibujo
Historia dibujoDannyRCA
 
My healthy meal homework
My healthy meal homeworkMy healthy meal homework
My healthy meal homework6sbradbury
 
Nc promotional powerpoint helvetica blackboard no clicks
Nc promotional powerpoint helvetica blackboard no clicksNc promotional powerpoint helvetica blackboard no clicks
Nc promotional powerpoint helvetica blackboard no clicksjkbirbeck
 
Getting started with outlook calendar
Getting started with outlook calendarGetting started with outlook calendar
Getting started with outlook calendarrobin fay
 
Freedom of Contract: or the lack of it
Freedom of Contract: or the lack of itFreedom of Contract: or the lack of it
Freedom of Contract: or the lack of itastrix
 
Contractual Provisions: What Do They Really Mean and How Can They Work for You?
Contractual Provisions: What Do They Really Mean and How Can They Work for You?Contractual Provisions: What Do They Really Mean and How Can They Work for You?
Contractual Provisions: What Do They Really Mean and How Can They Work for You?BoyarMiller
 
Nsaids new/cosmetic dentistry courses
Nsaids new/cosmetic dentistry coursesNsaids new/cosmetic dentistry courses
Nsaids new/cosmetic dentistry coursesIndian dental academy
 
Guía de prácticas fenómenos transitorios electromagnéticos
Guía de prácticas fenómenos transitorios electromagnéticosGuía de prácticas fenómenos transitorios electromagnéticos
Guía de prácticas fenómenos transitorios electromagnéticosGilberto Mejía
 

Viewers also liked (20)

Pesto chicken kebabs with roasted veg pasta
Pesto chicken kebabs with roasted veg pastaPesto chicken kebabs with roasted veg pasta
Pesto chicken kebabs with roasted veg pasta
 
ROOF-Sendstep-explanation
ROOF-Sendstep-explanation ROOF-Sendstep-explanation
ROOF-Sendstep-explanation
 
James McCafferty CV 2015 Rev I
James McCafferty CV 2015 Rev IJames McCafferty CV 2015 Rev I
James McCafferty CV 2015 Rev I
 
Brochure Winter DDS
Brochure Winter DDS Brochure Winter DDS
Brochure Winter DDS
 
Present simple
Present simplePresent simple
Present simple
 
Pawer point london
Pawer point londonPawer point london
Pawer point london
 
Historia dibujo
Historia dibujoHistoria dibujo
Historia dibujo
 
Brochure Norton Vulcan
Brochure Norton VulcanBrochure Norton Vulcan
Brochure Norton Vulcan
 
Brochure Norton Vulcan
Brochure Norton VulcanBrochure Norton Vulcan
Brochure Norton Vulcan
 
Brochure Winter DDS
Brochure Winter DDS Brochure Winter DDS
Brochure Winter DDS
 
My healthy meal homework
My healthy meal homeworkMy healthy meal homework
My healthy meal homework
 
Yorumla veya oyla
Yorumla veya oylaYorumla veya oyla
Yorumla veya oyla
 
Nc promotional powerpoint helvetica blackboard no clicks
Nc promotional powerpoint helvetica blackboard no clicksNc promotional powerpoint helvetica blackboard no clicks
Nc promotional powerpoint helvetica blackboard no clicks
 
aladdin CV
aladdin CValaddin CV
aladdin CV
 
Getting started with outlook calendar
Getting started with outlook calendarGetting started with outlook calendar
Getting started with outlook calendar
 
Freedom of Contract: or the lack of it
Freedom of Contract: or the lack of itFreedom of Contract: or the lack of it
Freedom of Contract: or the lack of it
 
Contractual Provisions: What Do They Really Mean and How Can They Work for You?
Contractual Provisions: What Do They Really Mean and How Can They Work for You?Contractual Provisions: What Do They Really Mean and How Can They Work for You?
Contractual Provisions: What Do They Really Mean and How Can They Work for You?
 
Atp draw-tutorial
Atp draw-tutorialAtp draw-tutorial
Atp draw-tutorial
 
Nsaids new/cosmetic dentistry courses
Nsaids new/cosmetic dentistry coursesNsaids new/cosmetic dentistry courses
Nsaids new/cosmetic dentistry courses
 
Guía de prácticas fenómenos transitorios electromagnéticos
Guía de prácticas fenómenos transitorios electromagnéticosGuía de prácticas fenómenos transitorios electromagnéticos
Guía de prácticas fenómenos transitorios electromagnéticos
 

Top Module

  • 1. top.v Sun Dec 06 14:24:10 2015 Page 1 1 `timescale 1ns / 1ps 2 `define second_3quarter 37500000 3 `define second_1quarter 12500000 4 `define second_1 50000000 5 `define second_5 250000000 6 ////////////////////////////////////////////////////////////////////////////////// 7 // Company: George Fox University 8 // Engineers In Training: Jakob Michael & Dakota Musso 9 // 10 // Create Date: 12/6/2015 11 // Project Name: Final Project For ENGR 220 12 // Description: Version Of Milton Bradley Simon Says Game 13 // 14 ////////////////////////////////////////////////////////////////////////////////// 15 module top(output [2:0] LED0, LED1, LED2, LED3, output speaker, output [7:0]seg, output reg [7:0] nexus_LED, output [3:0]anodes_n, output lcd_regsel, lcd_read, lcd_enable, 16 inout [7:0] lcd_data, input [7:0]switches, input [3:0] s_button_n, input [3:0] n_button, input clk ); 17 18 wire reset = switches[0]; 19 wire [3:0] s_button = ~s_button_n; 20 wire [3:0] s_pressed, s_held, n_pressed, n_held; 21 wire [1:0] random, simon_button_value, simon_button_selected; 22 wire fail_tone_finished, success_tone_finished; 23 wire S_tone, F_tone, button_tone; 24 wire [3:0] score_ones, score_tens; 25 wire [1:0] tone_sel; 26 wire [3:0] next0, next1, next2, next3; 27 28 localparam light_0 = 0, light_1 = 1, light_2 = 2, light_3 = 3; 29 30 //state declarations 31 localparam STATE_IDLE = 0, STATE_RANDOMIZE = 1, STATE_SIMON_TONE = 2, STATE_SIMON_TONE_REST = 3, STATE_TONE_COUNT_CHECK = 4, STATE_CHEAT_OPTION = 5, STATE_AWAIT_INPUT = 6, 32 STATE_CHECK_INPUT = 7, STATE_DELAY_SUCCESS_TONE = 8, STATE_DELAY_FAIL_TONE = 9, STATE_SUCCESSFUL_ROUND = 10, STATE_SUCCESS_WAIT = 11, STATE_FAIL_TONE = 12, 33 STATE_FAIL_WAIT = 13, STATE_PLAY_AGAIN = 14; 34 35 //message declarations 36 localparam message_default = 0, message_hello = 1, message_simon_playing = 2, message_player_turn = 3, message_correct_round = 4, message_bad_round = 5, message_try_again = 6; 37 38 reg [7:0] step_counter, your_score; 39 reg [5:0] current_state, next_state; 40 reg LED_enable, timer_enable, step_counter_enable, your_score_counter_enable, save_button_enable; 41 reg step_counter_reset, your_score_counter_reset; 42 reg sec1_4_enable, sec3_4_enable, sec1_enable, sec5_enable, fail_tone_enable, success_tone_enable; 43 reg [1:0] LED_on; 44 reg [2:0] message; 45 reg randomize, rerun, step; 46 reg [30:0] second_3quarter_timer, second_1quarter_timer, second_1_timer,
  • 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