硬件描述语言Verilog HDL设计进阶之:有限状态机的设计原理及其代码风格
码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。
采用了独热码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。
另外还可以用另一种风格的Verilog HDL模型来表示同一个有限状态。在这个模型中,我们用always语句和连续赋值语句把状态机的触发器部分和组合逻辑部分分成两部分来描述,如下所示。
例4.3:有限状态机模型3
module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] 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; //状态转换
assign Nextstate = //状态变换条件
(state == Idle ) ? (A ? Start : Idle):
(state==Start ) ? (!A ? Stop : Start ):
(state== Stop ) ? (A ? Clear : Stop ):
(state== Clear) ? (!A ? Idle : Clear) : Idle;
assign F = (( state == Stop) A ); //状态输出
assign G = (( state == Clear) (!A || !Reset)) //状态输出
endmodule
下面是第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)选定触发器的类型并求出状态方程、驱动方程和输出方程。
(5)按照方程得出逻辑图。
用Verilog HDL来描述有限状态机,可以充分发挥硬件描述语言的抽象建模能力,使用always块语句和case(if)等条件
VerilogHDL 有限状态机 FSM 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)