FSM状态机

什么是有限状态机(FSM)

有限状态机是由寄存器组和组合逻辑构成的硬件时序电路。

其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的,情况下才能从一个状态转向另一个状态。

究竟转向哪一状态不但取决于各个输入值,还取决于当前状态。

状态机可用于产生在时钟跳变时刻开关的复杂控制逻辑,是数字逻辑的控制核心。

  1. 状态迁移图
  2. 源码设计
// 两段式状态机
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
  1. 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

  1. Modelsim时序图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值