赞
踩
实践是最好的老师,通过项目实战才能把所学转化为实际的能力。——沃兹基
一.什么是状态机?
有限状态机(Finite State Machine,简称FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.一般分为三种:分别是Moore型,Mealy型,以及混合型。这个练习主要讲Mealy型有限状态机。
Mealy型有限状态机:由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。
状态转移图的解释:上图中Input 输入是时钟clk,输入信号为A,Reset,Output 为F和G
module MEALY_FSM(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G; //输出信号
reg F,G;
reg [1:0]state;//状态信号
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
always @(posedge clk) //总是在时钟上升沿触发
if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
begin
state <=idle;//无阻塞赋值,且起始状态为start
F<=0;//初始输出为0
G<=0;//初始输出为0
end
else
case(state)
idle: begin
if(A)//由图所知,A/G=0
begin
state<=start;//根据图所示,idle箭头指向start
G<=0;
end
else
state<=idle;
end
start:if(!A)
begin
state<=stop;//根据图所示,idle箭头指向stop
F<=1;//图中所示A/F=1
end
else
state<=start;//
stop: if(A)
begin
state<=clear;
G<=1;
end
else
state<=stop;
clear:if(!A)//
begin
state<=idle;
F<=0;
G<=1;
end
else
state<=clear;
endcaseendmodule
另一种写法
module MEALY_FSM_II(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G; //输出信号
reg F,G;
reg [3:0]state;//状态信号多用了两个寄存器,这叫独热编码,FPGA适合,上面的适合CPLD
/*定义四个状态的编码 1000,0100,0010,0001*/
parameter idle=4'b1000,start=4'b0100,
stop=4'b0010,clear=4'b0001;
always @(posedge clk) //总是在时钟上升沿触发
if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
begin
state <=idle;//无阻塞赋值,且起始状态为start
F<=0;//初始输出为0
G<=0;//初始输出为0
end
else
case(state)
idle: begin
if(A)//由图所知,A/G=0
begin
state<=start;//根据图所示,idle箭头指向start
G<=0;
end
else
state<=idle;
end
start:if(!A)
begin
state<=stop;//根据图所示,idle箭头指向stop
F<=1;//图中所示A/F=1
end
else
state<=start;//
stop: if(A)
begin
state<=clear;
G<=1;
end
else
state<=stop;
clear:if(!A)//
begin
state<=idle;
F<=0;
G<=1;
end
else
state<=clear;
endcaseendmodule
第三种写法
module MEALY_FSM_III(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G; //输出信号
reg [1:0]state;//寄存器状态,相当于把触发器和组合逻辑分开描述
wire [1:0] nextstate;// 定义两个状态,当前和下一个
wire F,G;
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
always @(posedge clk) //总是在时钟上升沿触发
if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
begin
state <=idle;//无阻塞赋值,且起始状态为start
end
else
state<=nextstate;//相当于把触发器和组合逻辑分开描述
assign nextstate=(state==idle)? (A?start:idle):
(state==start)? (!A?stop:start)://若为!A执行后面的,否则执行start
(state==stop)? (A?clear:stop):
(state==clear)? (!A?idle:clear):idle;
assign F =((state==stop)&&A);//根据逻辑状态得出来的
assign G =((state==clear)&&(!A|!Reset)); //
endmodule
第四种写法
module MEALY_FSM_IV(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G; //输出信号
reg F,G;//这里必须声明数据类型,不声明的话,你试试。
reg [1:0]state,nextstate;// 定义两个状态,当前和下一个
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
always @(posedge clk) //总是在时钟上升沿触发
if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
begin
state <=idle;//无阻塞赋值,且起始状态为start
end
else
state<=nextstate;//相当于把触发器和组合逻辑分开描述
always@(state or A) //因为受输入和当前状态影响
begin
F<=0;
G<=0;
if(state==idle)//从idle开始描述
begin
if(A)//
nextstate=start; //开始为1
else
nextstate=idle; //!A为isle
G<=1;
end
else
if(state==start)
if(!A)
nextstate<=stop;
else
nextstate<=start;
else
if(state==stop)
if(A)
nextstate<=clear;
else
nextstate<=stop;
else
if(state==clear)
begin
if(!A)
nextstate=idle;
else
nextstate=clear;
F<=1;
end
else
nextstate=idle;//阻塞赋值
end
endmodule
综合后的状态机视图如下所示
总结mealy型状态机的写法流程如下
1.获得状态转移图,通过逻辑抽象。就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述。
a)分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条件)作为输入变量,取结果作为输出变量。
b) 定义输入、输出逻辑状态的含意,并将电路状态顺序编号 c)按照要求列出电路的状态转换表或画出状态转换图。
2.状态化简
结果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,并得到一样的输出,则称它们为等价状态。显然等价状态是重复的,可以合并为一个。电路的状态数越少,存储电路也就越简单。状态化简的目的就在于将等价状态尽可能地合并,以得到最简的状态转换图。
3.状态分配
状态分配很重要,在分配的时候意味着使用的触发器的多少,对于FPGA由于触发器多,可以使用独热编码也就是4‘b1000,4’b0100这种方式,对于CPLD可以使用其他编码。
4选定触发器的类型并求出状态方程、驱动方程和输出方程。
5) 按照方程得出逻辑图
使用always块语句和case(if)等条件语句及赋值语句即可方便实现。具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。
读者朋友可以在留言区和我交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。