在Verilog中描述有限状态机,可以有三种形式,可分为一段式、二段式和三段式。这三种描述主要根据其输入、输出和状态来分类。
一段式状态机:一段式状态机只选择一个状态标志位,这个状态标志位会在输入的决定下选择跳转到下一个状态还是维持原有状态,在每一个状态下检测状态标志位及输入来决定其状态的跳转及输出。其输出和状态的切换在一个always循环块中执行。
eg:always()
begin
S0:begin state = (in)? S0:s1;out = ; end
S1:begin state = (in)? S1:s2;out = ; end
S2:.....................................
end
二段式状态机:二段式状态机将状态分为当前状态和此状态,其系统会自动将次状态更新到当前状态,其输入更新在次状态上,其决定系统的状态切换和输出。其输出和状态的切换在两个个always循环块中执行,第一个always块决定系统状态标志的自动跳转,第二个always块决定系统根据不同状态下的输入进行状态的跳转及输出。
eg: always()
begin
state=next_state
end
always()
begin
S0:begin next_state = (in)? S0:s1;out = ; end
S1:begin next_state = (in)? S1:s2;out = ; end
S2:.....................................
end
三段式状态机:二段式状态机将状态分为当前状态和此状态,其系统会自动将次状态更新到当前状态,系统的输入更新在次状态上,其决定系统的状态切换,系统会根据其当前状态决定输出的值。其输出和状态更新和状态切换在三个always块中,第一个always块决定系统状态标志的自动跳转,第二个always块决定系统根据不同状态下的输入进行状态的切换,第三个always块根据系统的当前状态决定输出的值。
eg: always()
begin
state=next_state
end
always()
begin
S0:next_state = (in)? S0:s1;
S1:next_state = (in)? S1:s2;
S2:.....................................
end
always()
begin
S0:out = ;
S1:out = ;
S2:.....................................
end