I have been working on a FSM which is implemented using Verilog HDL. In the case determining the next state outputs, I have two outputs that need to be assigned. So I tried to use begin
and end
to put two assignments into a single case. But it still doesn't work. I am not sure if there is some syntax errors which I can't write the code in this way.
module Vending_FSM(
input [2:0] INPUT,
input CLK,
output REL,
output [3:0] AMT
);
// Declaring state and next_state variable
reg[2:0] state, next_state;
// Declaring 6 state parameters
parameter
S0 = 3'b000, // WAIT
S1 = 3'b001, // $5
S2 = 3'b010, // $10
S3 = 3'b011, // $15
S4 = 3'b100, // $20
S5 = 3'b101; // $25
// Determning next state transition
always @(posedge CLK)
begin
state <= next_state; // Positive-edge triggering
end
// Determing next state input
always @(INPUT or state)
begin
case (state)
S0: case (INPUT) // WAIT
3'b000: next_state = S1; // $5
3'b001: next_state = S2; // $10
3'b010: next_state = S4; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S0; // $100
3'b101: next_state = S0; // PUR
3'b110: next_state = S0; // REF
endcase
S1: case (INPUT) // $5
3'b000: next_state = S2; // $5
3'b001: next_state = S3; // $10
3'b010: next_state = S5; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S1; // $100
3'b101: next_state = S1; // PUR
3'b110: next_state = S0; // REF
endcase
S2: case (INPUT) // $10
3'b000: next_state = S3; // $5
3'b001: next_state = S4; // $10
3'b010: next_state = S5; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S2; // $100
3'b101: next_state = S2; // PUR
3'b110: next_state = S0; // REF
endcase
S3: case (INPUT) // $15
3'b000: next_state = S4; // $5
3'b001: next_state = S5; // $10
3'b010: next_state = S5; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S3; // $100
3'b101: next_state = S3; // PUR
3'b110: next_state = S0; // REF
endcase
S4: case (INPUT) // $20
3'b000: next_state = S5; // $5
3'b001: next_state = S5; // $10
3'b010: next_state = S5; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S4; // $100
3'b101: next_state = S4; // PUR
3'b110: next_state = S0; // REF
endcase
S5: case (INPUT) // $25
3'b000: next_state = S5; // $5
3'b001: next_state = S5; // $10
3'b010: next_state = S5; // $20
3'b011: next_state = S5; // $50
3'b100: next_state = S5; // $100
3'b101: next_state = S0; // PUR
3'b110: next_state = S0; // REF
endcase
endcase
end
// Determing next state output
always @(INPUT or state)
begin
case (state)
S0: case (INPUT) // WAIT
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0000;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0000;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0000;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b0101;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b0; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0000;
end
endcase
S1: case (INPUT) // $5
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0000;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0000;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0000;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b0110;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b0; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0001;
end
endcase
S2: case (INPUT) // $10
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0000;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0000;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0001;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b0111;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b0; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0010;
end
endcase
S3: case (INPUT) // $15
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0000;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0000;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0010;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b1000;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b0; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0011;
end
endcase
S4: case (INPUT) // $20
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0000;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0001;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0011;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b1001;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b0; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0100;
end
endcase
S5: case (INPUT) // $25
3'b000: begin
REL = 1'b0; // $5
AMT = 4'b0001;
end
3'b001: begin
REL = 1'b0; // $10
AMT = 4'b0010;
end
3'b010: begin
REL = 1'b0; // $20
AMT = 4'b0100;
end
3'b011: begin
REL = 1'b0; // $50
AMT = 4'b1010;
end
3'b100: begin
REL = 1'b0; // $100
AMT = 4'b1011;
end
3'b101: begin
REL = 1'b1; // PUR
AMT = 4'b0000;
end
3'b110: begin
REL = 1'b0; // REF
AMT = 4'b0101;
end
endcase
endcase
end
endmodule
Thank you in advance.