From 4b6e0102d20d9ab060ce930e4b846c8be446bb06 Mon Sep 17 00:00:00 2001 From: Vasil Zlatanov Date: Mon, 12 Dec 2016 21:51:10 +0000 Subject: public push --- part_2/ex9/fsm.v | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 part_2/ex9/fsm.v (limited to 'part_2/ex9/fsm.v') diff --git a/part_2/ex9/fsm.v b/part_2/ex9/fsm.v new file mode 100644 index 0000000..2e3888a --- /dev/null +++ b/part_2/ex9/fsm.v @@ -0,0 +1,245 @@ +module fsm( + input CLOCK_MS, + input CLOCK_HS, + + input KEY, + input TIME_OUT, + + output reg START_DELAY, + output reg EN_LFSR, + output reg [9:0] LEDR, + output reg COUNT, + output reg COUNT_CLEAR +); + reg [3:0] state; + + parameter wait_key_press=0, wait_key_release=1, led_one=2, led_two=3, led_three=4, led_four=5, led_five=6, led_six=7, led_seven=8, led_eight=9, led_nine=10, led_ten=11, delay=12, led_zero=13, response=14, response_end=15; + + always @ (state) + begin + case (state) + wait_key_press: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + wait_key_release: + begin + EN_LFSR <= 1'b1; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b1; + end + led_zero: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_one: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1000000000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_two: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1100000000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_three: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1110000000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_four: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111000000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_five: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111100000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_six: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111110000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_seven: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111111000; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_eight: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111111100; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_nine: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111111110; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + led_ten: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b1111111111; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + delay: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b1; + LEDR [9:0] <= 10'b1111111111; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + response: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b1; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b1; + COUNT_CLEAR <= 1'b0; + end + response_end: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + default: + begin + EN_LFSR <= 1'b0; + START_DELAY <= 1'b0; + LEDR [9:0] <= 10'b0; + COUNT <= 1'b0; + COUNT_CLEAR <= 1'b0; + end + endcase + end + + always @(posedge CLOCK_MS) + begin + case (state) + wait_key_press: + if (~KEY) + state = wait_key_release; + else + state = wait_key_press; + wait_key_release: + if (KEY) + state = led_zero; + else + state = wait_key_release; + led_zero: + if (CLOCK_HS) + state = led_one; + else + state = led_zero; + led_one: + if (CLOCK_HS) + state = led_two; + else + state = led_one; + led_two: + if (CLOCK_HS) + state = led_three; + else + state = led_two; + led_three: + if (CLOCK_HS) + state = led_four; + else + state = led_three; + led_four: + if (CLOCK_HS) + state = led_five; + else + state = led_four; + led_five: + if (CLOCK_HS) + state = led_six; + else + state = led_five; + led_six: + if (CLOCK_HS) + state = led_seven; + else + state = led_six; + led_seven: + if (CLOCK_HS) + state = led_eight; + else + state = led_seven; + led_eight: + if (CLOCK_HS) + state = led_nine; + else + state = led_eight; + led_nine: + if (CLOCK_HS) + state = led_ten; + else + state = led_nine; + led_ten: + if (CLOCK_HS) + state = delay; + else + state = led_ten; + delay: + if (TIME_OUT) + state = response; + else + state = delay; + response: + if (~KEY) + state = response_end; + else + state = response; + response_end: + if (KEY) + state = wait_key_press; + else + state = response_end; + endcase + end +endmodule -- cgit v1.2.3-54-g00ecf