什么是有限状态机(FSM)
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路。
其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的,情况下才能从一个状态转向另一个状态。
究竟转向哪一状态不但取决于各个输入值,还取决于当前状态。
状态机可用于产生在时钟跳变时刻开关的复杂控制逻辑,是数字逻辑的控制核心。
- 状态迁移图
- 源码设计
// 两段式状态机
module ex_fsm(
input wire sclk,
input wire rst_n,
output reg K1,
output reg K2,
input wire A
);
parameter IDLE = 4'b0001; //显式的写出状态表达式
parameter START = 4'b0010;
parameter STOP = 4'b0100;
parameter CLEAR = 4'b1000;
reg [3:0] state; // 独热码(推荐)
//4'b0001 4'b0010 4'b0100 4'b1000 独热码占用寄存器数量多,但是组合逻辑资源少,每一个状态可以用1位表示
// if(state == 4'b0001)--->if(state[0] == 1'b1) //综合器优化后
//
// reg [1:0] state; // 二进制编码
//2'b00 2'b01 2'b10 2'b11 二进制编码用的寄存器数量少,但是用的组合逻辑较多
// if(state == 4'b1100)--->if(state == 4'b1100) //二进制编码综合器不会优化
//第一段描述状态机
always @(posedge sclk or negedge rst_n) begin
if (rst_n == 1'b0) begin
state <= IDLE;
end
else begin
case(state)
IDLE: if (A==1'b1)
state <= START;
START: if (A == 1'b0)
state <= STOP;
STOP: if (A == 1'b1)
state <= CLEAR;
CLEAR: if (A == 1'b0)
state <= IDLE;
default:state <= IDLE;
endcase
end
end
//第二段 描述变量状态
always @(posedge sclk or negedge rst_n)
if (rst_n == 1'b0)
K1 <= 1'b0;
else if (state == IDLE & A == 1'b1)
K1 = 1'b0;
else if (state == CLEAR & A == 1'b0)
K1 = 1'b1;
always @(posedge sclk or negedge rst_n)
if (rst_n == 1'b0)
K2 <= 1'b0;
else if (state == STOP & A == 1'b1)
K2 <= 1'b1;
else if (state == CLEAR & A == 1'b0)
K2 <= 1'b0;
endmodule
- tb激励代码
`timescale 1ns/1ns
module tb_ex_fsm();
reg sclk,rst_n;
reg in_A;
wire K,K2;
initial begin
sclk = 0;
rst_n =0;
#200
rst_n = 1;
end
initial begin
#500
in_data();
end
always #10 sclk = ~sclk;
ex_fsm ex_fsm_inst(
.sclk (sclk),
.rst_n (rst_n),
.K1 (K1),
.K2 (K2),
.A (in_A)
);
task in_data();
integer i;
begin
for(i=0;i<1024;i=i+1)
begin
@(posedge sclk)
if(i<50)
in_A <= 0;
else if (i<200)
in_A <= 1;
else if (i<700)
in_A <= 0;
else if (i<800)
in_A <= 1;
else if (i<900)
in_A <= 0;
end
end
endtask
endmodule
- Modelsim时序图