引言
在实际的数字电路设计中,状态机是最常用的逻辑,而且往往是全部逻辑的核心部分,所以状态机的质量,会在比较大的程度上影响整个电路的质量。
本小节我们通过一个简单的例子(三进制脉动计数器)来说明一下状态机的4中写法。
1,模块功能
由于我们的目的在于说明状态机的写作方式,所以其逻辑越简单有利于理解。就是一个简单的脉动计数器,每个三个使能信号输出一个标示信号。
2,一段式
状态机的写法,一般有四种,即一段式,两段式,三段式,四段式。对于一段式的写法,整个状态机的状态转移、转移条件、对应状态的输出都写在一个always块里,故称‘一段式’。那么,脉动计数器状态机的一段式写法该怎么写呢?如下所示:
/*
* file : fsm1.v
* author: Rill
* date : 2014-05-11
*/
module Mfsm1
(
clk,
rst,
enable,
done
);
input wire clk;
input wire rst;
input wire enable;
output reg done;
parameter s_idle = 4'd0;
parameter s_1 = 4'd1;
parameter s_2 = 4'd2;
parameter s_3 = 4'd3;
reg [3:0] state;
always @(posedge clk)
begin
if(rst)
begin
done <=1'b0;
state <= s_idle;
end
else
begin
case(state)
s_idle:
begin
if(enable)
state <= s_1;
done <= 1'b0;
end
s_1:
begin
if(enable)
state <= s_2;
done <= 1'b0;
end
s_2:
begin
if(enable)
begin
state <= s_3;
done <= 1'b1;
end
else
begin
done <= 1'b0;
end
end
s_3:
begin
state <= s_idle;
done <= 1'b0;
end
default:
begin
state <= s_idle;
done <= 1'b0;
end
endcase
end
end
endmodule
3,两段式
状态机的另外一种写法是‘两段式’的。两段式的写法,整个状态机由两个always块组成,第一个块只负责状态转移,第二个块负责转移条件和对应状态的输出。其中第一个块是时序逻辑,第二个块是组合逻辑。脉动计数器状态机的两段式写法又是怎样的呢?
/*
* file : fsm2.v
* author: Rill
* date : 2014-05-11
*/
module Mfsm2
(
clk,
rst,
enable,
done
);
input wire clk;