| // `define ASYNC_RESET | |
| module fsm_test(clk, reset, button_a, button_b, red_a, green_a, red_b, green_b); | |
| input clk, reset, button_a, button_b; | |
| output reg red_a, green_a, red_b, green_b; | |
| (* gentb_constant = 0 *) | |
| wire reset; | |
| integer state; | |
| reg [3:0] cnt; | |
| `ifdef ASYNC_RESET | |
| always @(posedge clk, posedge reset) | |
| `else | |
| always @(posedge clk) | |
| `endif | |
| begin | |
| cnt <= 0; | |
| red_a <= 1; | |
| red_b <= 1; | |
| green_a <= 0; | |
| green_b <= 0; | |
| if (reset) | |
| state <= 100; | |
| else | |
| case (state) | |
| 100: begin | |
| if (button_a && !button_b) | |
| state <= 200; | |
| if (!button_a && button_b) | |
| state <= 300; | |
| end | |
| 200: begin | |
| red_a <= 0; | |
| green_a <= 1; | |
| cnt <= cnt + 1; | |
| if (cnt == 5) | |
| state <= 210; | |
| end | |
| 210: begin | |
| red_a <= 0; | |
| green_a <= cnt[0]; | |
| cnt <= cnt + 1; | |
| if (cnt == 10) | |
| state <= 100; | |
| end | |
| 300: begin | |
| red_b <= 0; | |
| green_b <= 1; | |
| cnt <= cnt + 1; | |
| if (cnt == 5) | |
| state <= 310; | |
| end | |
| 310: begin | |
| red_b <= 0; | |
| green_b <= cnt[0]; | |
| cnt <= cnt + 1; | |
| if (cnt == 10) | |
| state <= 100; | |
| end | |
| endcase | |
| end | |
| endmodule | |