状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
关于状态机的一个极度确切的描述是:它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。
状态机模块编写:
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;
//2'b00 2'b01 2'b10 2'b11二进制编码用的寄存器数量少,但是用的组合逻辑资源多
//4'b0001 4'b0010 4'b0100 4'b1000独热码占用寄存器数量多,但是组合逻辑资源少
//4个bit if(state==4'b0001)--->if(state[0]==1'b1)节省逻辑
//if(state==4'b1100)---->if(state==4'b1100)二进制编码
//第一段描述状态机
always@(posedge sclk or negedge rst_n)
if(rst_n==1'b0)
state<=IDLE;
else
case(state)
IDLE: if(A==1'b1)
state<=START;
START:if(A==1'b1)
state<=STOP;
STOP:if(A==1'b1)
state<=CLEAR;
CLEAR:if(A==1'b0)
state<=IDLE;
default:state<=IDLE;
endcase
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'b1)
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
测试模块编写
`timescale 1ns/1ns
module tb_ex_fsm;
reg sclk,rst_n;
reg in_A;
wire k1,k2;
initial begin
sclk<=0;
rst_n<=0;
#100;
rst_n<=1;
end
initial begin
#200;
in_data();
end
always #10 sclk<=~sclk;
ex_fsm ex_fsm_inst(
.sclk (sclk),
.rst_n (rst_n),
.k1 (k1),//例化模块时输出端口括号内必须是wire变量
.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
上述代码不是完整代码,需要自行补充!