几个重要概念:
构成状态机的要素:状态机的输入、输出和状态。输入就是一些引发状态变化的条件,输出就是状态变化后引起的变化,状态变化可能是由当前状态或输入条件有关。状态就是由一些逻辑值来表示。
Mealy状态机: 时序逻辑的输出是由当前状态或输入条件有关
Moore状态机: 时序逻辑的输出只与当前状态有关
(在实际的电路设计中,两种状态机往往都会有的。)
状态机的典型设计:
1)单段式(时序控制较为简单时)---Gray编码
程序1
module fsm(
input clk,
input rst,
input A,
output reg K1,
output reg K2,
output reg[1:0] state
);
parameter Idle =2'b00,//Gray编码
Start=2'b01,
Stop=2'b10,
Clear=2'b11;
always @(posedge clk)
if(!rst)
begin
state<=Idle;
K1<=0;
K2<=0;
end
else
case(state)
Idle:if(A) begin //输入状态
state<=Start; //下一个状态
K1<=0; //输出状态
end
else begin
state<=Idle;
K1<=0;
K2<=0;
end
Start:if(!A) state<=Stop;
else state<=Start;
Stop:if(A) begin
state<=Clear;
K2<=1;
end
else begin
state<=Stop;
K1<=0;
K2<=0;
end
Clear: if(!A) begin
state<=Idle;
K1<=1;
K2<=0;
end
else begin
state<=Clear;
K1<=0;
K2<=0;
end
default: state <=2'bxx;//不定值
endcase
endmodule
程序2----独热编码 (在程序1上进行一下变动)
module fsm2(
input clk,
input rst,
input A,
output reg K1,
output reg K2
);
reg[3:0] state;
parameter Idle =4'b1000,//独热编码
Start=4'b0100,
Stop=4'b0010,
Clear=4'b0001;
always @(posedge clk)
if(!rst)
。。。。。
else
case(state)
Idle:。。。
Start:。。。。
Stop:。。。。
Clear:。。。。
default: state <=Idle;//确保回到Idle状态
endcase
endmodule
分析:
程序1 RTL图
程序2 RTL图
程序1 Technology 图
程序2 Technology 图
程序1报告
程序2报告
综合分析:
程序2采用独热码,对于FPGA实现的有限状态机建议采用该种方式。其虽然多增加了触发器和一些单元数,但是组合电路省了一些,使得电路速度和可靠性增加。
2)设计较为复杂的多输出状态机---多段式
可以采用这样的设计思路:将状态变化与输出部分的控制分成两部分考虑。另外,如果为了调试方便和比较容易发现问题,还可以把输出部分根据输出变量数目,细分为一个个独立的always组合块。
程序如下:
module fsm3(
input clk,
input rst,
input A,
output reg K1,
output reg K2
);
reg[3:0] state,nextstate;
parameter Idle =4'b1000,//独热编码
Start=4'b0100,
Stop=4'b0010,
Clear=4'b0001;
//*******在每一个时钟上升沿产生一次可能的状态变换*******//
always@(posedge clk)
if(!rst)
state<=Idle;
else
state<=nextstate;
//*******根据当前的状态和输入的变换产生下一个状态*******//
always@(state or A)
case(state)
Idle: if(A)
nextstate=Start;
else
nextstate=Idle;
Start:if(!A)
nextstate=Stop;
else
nextstate=Start;
Stop:if(A)
nextstate=Clear;
else
nextstate=Stop;
Clear: if(!A)
nextstate=Idle;
else
nextstate=Clear;
default: nextstate=Idle;//确保回到Idle状态
endcase
//*******产生输出K1的组合逻辑*******//
always@(state or A or rst)
if(!rst)
K1=0;
else if (state==Clear&&!A)
K1=1;
else
K1=0;
//*******产生输出K2的组合逻辑*******//
always@(state or A or rst)
if(!rst)
K2=0;
else if (state==Stop&&A)
K2=1;
else
K2=0;
endmodule
1)资源使用报告
2)RTL图
3)Technology 图
与程序2相比,程序2多了两个逻辑单元和两个K1,K2的寄存器输出!
有限状态机的设计步骤:
i分析给定逻辑问题,确定输入、输出以及电路的状态数,得出状态转换图
ii 将等价状态尽可能的合并,得到最简的状态转换图
iiiFPGA有丰富的触发器资源,可以利用独热编码,进行状态分配
iiii用Verilog HDL中的always 块语句和case(if)等条件语句描述有限状态机。
最后,可综合状态机小总结一下:
1)使用独热码---每一个状态只有一个寄存器置位,译码逻辑较为简单。
2)采用CASE语句建立状态机模型,不要忘记在CASE语句最后面写default默认项,以便告诉综合器制定了所有状态,删除不需要的译码电路
3)有一个异步或者同步的复位端,便于通电时候进入有效状态
以上内容是源于对夏老的Verilog数字系统设计教程的第12章内容的一点总结和心得吧!相关例程我也同步上传,希望对大家有所帮助!一起加油努力学习吧!!!
用户607435 2012-5-15 10:09