问题描述
我正在为具有6种可能状态的简单FSM编写Verilog模块。该模块有4个Moore输出和其他模块的7个输入。我正在使用case语句确定状态的下一个值,但是出现综合错误
[Synth 8-151] case item 3'b100 is unreachable [line 40]
和
[Synth 8-151] case item 3'b101 is unreachable [line 41]
。
第40行指向SCLEAR: nS = Done ? SCLEARRET : SCLEAR;
第41行指向SCLEARRET: nS = allDone ? SWAIT : SCLEARRET;
这些错误导致FSM无法发送shipClr
变量。
这是整个模块:
module SsstateMachine(shipGRB,Done,Go,clk,reset,allDone,Ready2Go,Stop,nextLED,delay,lost,Clr,shipClr);
output shipGRB,shipClr;
input allDone,Clr;
input clk,reset;
reg [1:0] S,nS;
parameter SWAIT=3'b000,SSHIP=3'b001,SRET=3'b010,SDELAY=3'b011,SCLEAR=3'b100,SCLEARRET=3'b101;
// Set the next state on the rising edge of the clock
always @(posedge clk) begin
if(reset)
S <= SWAIT;
else
S <= nS;
end
// Determine the next value of the state based on the inputs
always @(Go,nextLED) begin
case(S)
SWAIT: if(Go) nS = SSHIP;
else if(Clr) nS = SCLEAR;
else nS = SWAIT;
SSHIP: nS = Done ? SRET : SSHIP;
SRET: if(allDone) begin
if(Stop || lost) nS = SWAIT;
else nS = SDELAY;
end
else nS = SRET;
SDELAY: nS = nextLED ? SSHIP : SDELAY;
SCLEAR: nS = Done ? SCLEARRET : SCLEAR;
SCLEARRET: nS = allDone ? SWAIT : SCLEARRET;
default: nS = SWAIT;
endcase
end
// Assign the outputs
assign Ready2Go = (S==SWAIT); // okay to press Go
assign shipGRB = (S==SSHIP); // send data bits
assign shipClr = (S==SCLEAR);
assign delay = (S==SDELAY);
endmodule
输入变量的说明:
Done
:从告诉FSM的其他模块可以过渡到SRET
或SCLEARRET
allDone
:从其他模块告诉FSM,它可以离开SRET
或SCLEARRET
Go
:按钮
Stop
:按钮
Clr
:按钮
nextLED
:从告诉FSM的其他模块可以从SDELAY
过渡到SSHIP
lost
:从告诉FSM的其他模块可以从SRET
过渡到SWAIT
我多次重画了过渡图,逐步执行了case语句,尝试重写它,但仍然找不到可能的错误。我不了解状态SCLEAR
和SCLEARRET
以及如何无法到达。如果按下Clr
,并且它处于状态SWAIT
,那么FSM是否不应该过渡到SCLEAR
?
解决方法
由于有6个状态,因此状态变量必须为3位宽,而不是2位。 更改:
example2
收件人:
resolve.modules
此外,您的显式灵敏度列表缺少reg [1:0] S,nS;
信号。您可以将列表替换为隐式列表。更改:
reg [2:0] S,nS;
收件人:
S
这种紧凑的语法会自动使用您需要的所有信号。