状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为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;elsecase(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;endcasealways@(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/1nsmodule tb_ex_fsm;reg sclk,rst_n;reg in_A;wire k1,k2;initial beginsclk<=0;rst_n<=0;#100;rst_n<=1;endinitial begin#200;in_data();endalways #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;beginfor(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;endendendtaskendmodule
上述代码不是完整代码,需要自行补充!