| `default_nettype none |
| |
| module FSM( |
| input wire a, |
| output reg x, |
| input wire clock, clear |
| ); |
| |
| parameter S_A = 32'd0, S_B = 32'd1, S_C = 32'd2; |
| reg [31:0] currentState, nextState; |
| |
| always @(posedge clock) |
| if(clear) begin |
| currentState <= S_A; |
| end else begin |
| currentState <= nextState; |
| end |
| |
| always @* begin |
| nextState = currentState; |
| case(currentState) |
| S_A: nextState = a ? S_B : S_C; |
| S_B: nextState = a ? S_A : S_B; |
| S_C: nextState = S_A; |
| endcase |
| end |
| |
| always @* begin |
| x = 1'b0; |
| case(currentState) |
| S_A: x = ~a; |
| S_B: x = 1'b1; |
| S_C: x = 1'b0; |
| endcase |
| end |
| |
| endmodule |