有限状态机
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。(这里指的是米里Mealy型有限状态机,而莫尔Moore型有限状态机究竟转向哪一状态只决于当前状态。)
- Mealy状态机:时序逻辑的输出不仅取决于当前状态,还取决与输入。
- Moore状态机:时序逻辑的输出只取决于当前状态。
在Verilog HDL中可以用许多种方法来描述有限状态机,最常用的方法是用always语句和case语句。下面的状态转移图表示了一个有限状态机,下例的程序就是该有限状态机的多种Verilog HDL模型之一:
上面的状态转移图表示了一个四状态的有限状态机,它的同步时钟是Clock,输入信号是 A 和 Reset,输出信号是 F 和 G。状态的转移只能在同步时钟(Clock)的上升沿时发生,往哪个状态的转移则取决于目前所在的状态和输入的信号(Reset 和 A)。下面的例子是该有限状态机的Verilog HDL模型之一:
例1
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [1:0] state ;
parameter Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
idle: begin
if (A) begin
state <= Start;
G<=0;
End
else state <= idle;
end
start: if (!A) state <= Stop;
else state <= start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
End
else state <= Clear;
end
endcase
endmodule
我们还可以用另一个Verilog HDL模型来表示同一个有限状态,见下例:
例2
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [3:0] state ;
parameter Idle = 4’b1000,//这里与上述不同
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;
always @(posedge clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
Idle: begin
if (A) begin
state <= Start;
G<=0;
end
else state <= Idle;
end
Start: if (!A) state <= Stop;
else state <= Start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
end
else state <= Clear;
end
default: state <=Idle;
endcase
endmodule
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。对于用FPGA实现的有限状态机建议采用独热码,因为虽然采用独热编码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。采用了独热编码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。
有限状态机设计的一般步骤:
- 逻辑抽象,得出状态转换图就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述。这就需要:
• 分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条
件)作为输入变量,取结果作为输出变量。
• 定义输入、输出逻辑状态的含意,并将电路状态顺序编号。
• 按照要求列出电路的状态转换表或画出状态转换图。这样,就把给定的逻辑问题抽象到一个时序逻辑函数了。 - 状态化简
如果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,并得到一样
的输出,则称它们为等价状态。显然等价状态是重复的,可以合并为一个。电路的状态数越少,存储电路也就越简单。状态化简的目的就在于将等价状态尽可能地合并,以得到最简的状态转换图。 - 状态分配
状态分配又称状态编码。通常有很多编码方法,编码方案选择得当,设计的电路可以简单,反
之,选得不好,则设计的电路就会复杂许多。实际设计时,需综合考虑电路复杂度与电路性能
之间的折衷,在触发器资源丰富的FPGA或ASIC设计中采用独热编码(one-hot-coding)既可以使电路性能得到保证又可充分利用其触发器数量多的优势。 - 选定触发器的类型并求出状态方程、驱动方程和输出方程。
- 按照方程得出逻辑图。