下面是第4种风格的Verilog HDL模型来表示同一个有限状态。在这个模型中,我们分别用沿触发的always语句和电平敏感的always语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。
例4.4:有限状态机模型4。
module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;
parameter //状态声明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset) begin
state <= Idle; //默认状态
end
else
state <= Nextstate; //状态转换
always @( state or A ) begin
F=0;
G=0;
if (state == Idle) begin //处于Idel状态时,对A判断
if (A)
Nextstate = Start; //Start状态
else
Nextstate = Idle; //保持Idel状态
G=1;
end
else if (state == Start) //处于Start状态时,对!A判断
if (!A)
Nextstate = Stop; //Stop状态
else
Nextstate = Start; //保持Start状态
else if (state == Stop) //处于Stop状态时,对A判断
if (A)
Nextstate = Clear; //Clear状态
else
Nextstate = Stop; //保持Stop状态
else if (state == Clear) begin //处于Clear状态时,对!A判断
if (!A)
Nextstate = Idle; //Idel状态
else
Nextstate = Clear; //保持Clear状态
F=1;
end
else
Nextstate= Idle; //默认状态
End
endmodule
上面4个例子是同一个状态机的4种不同的Verilog HDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。如用不同的综合器对这4个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。
下面讲解有限状态机设计的一般步骤。
(1)逻辑抽象,得出状态转换图。
就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述,这就需要完成以下任务。
① 分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条件)作为输入变量,取结果作为输出变量。
② 定义输入、输出逻辑状态的含意,并将电路状态顺序编号。
③ 按照要求列出电路的状态转换表或画出状态转换图。
这样,就把给定的逻辑问题抽象到一个时序逻辑函数了。
(2)状态化简。
如果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,并得到一样的输出,则称它们为等价状态。显然等价状态是重复的,可以合并为一个。电路的状态数越少,存储电路也就越简单。状态化简的目的就在于将等价状态尽可能地合并,以得到最简的状态转换图。
(3)状态分配。
状态分配又称状态编码。通常有很多编码方法,编码方案选择得当,设计的电路可以很简单。反之,若编码方案选得不好,则设计的电路就会复杂许多。
实际设计时,需综合考虑电路复杂度与电路性能之间的折衷。在触发器资源丰富的FPGA或ASIC设计中,采用独热编码(one-hot-coding)既可以使电路性能得到保证,又可充分利用其触发器数量多的优势。
(4)选定触发器的类型并求出状态方程、驱动方程和输出方程。
本文关键字:风格 电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制