当前位置:   article > 正文

fpga学习——状态机_fpga状态机

fpga状态机

1.状态机

有限状态机是由寄存器和组合逻辑构成的硬件时序电路。其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。转向哪个状态不但取决于输入值,还取决于当前状态。其可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的核心控制。

  • Mealy状态机
    下一个状态 = F(当前状态,输入信号)
    输出信号 = G(当前状态,输入信号)
  • Moor状态机
    下一个状态 = F(当前状态,输入信号)
    输出信号 = G(当前状态)
    写状态机前,先弄清楚状态转移图!!!
    状态转移图

2.两段式描述状态机

module ex_fsm(
   input  wire  sclk,
   input  wire  rst,
   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
//四个状态:4'b0001,4'b0010,4'b0100,4'b1000。独热码占用寄存器数量多,但是组合逻辑资源消耗少,高速。
//用独热码时,每个状态用1比特表示。if(state == 4'b0001) ---> if(state[0] == 1'b1)
//四个状态:2'b00,2'b01,2'b10,2'b11。二进制编码用的寄存器数量少,但是用的组合逻辑资源较多

//第一段描述状态机
always @ (posedge sclk or negedge rst)
     if(rst == 1'b0)
	   state <= IDLE;
	 else  
	   case(state)
	     IDLE: if(A == 1'b1)   //输入A=1进行状态的跳转
		          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

//第二段用状态机控制变量输出---k1
always @ (posedge sclk or negedge rst)
     if(rst == 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;

//k2
always @ (posedge sclk or negedge rst)
     if(rst == 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

3.仿真文件

`timescale  1ns/1ns

module tb_ex_fsm;

reg  sclk,rst;
reg A;
wire  k1,k2;

initial begin
   sclk <= 0;
   rst <= 0;
   #100;
   rst <= 1;
end

initial begin
   #200;
   in_data();
end

always  #10  sclk <= ~sclk;

ex_fsm tb_ex_fsm(
   .sclk(sclk),
   .rst(rst),
   .k1(k1),
   .k2(k2),
   .A(A)
);

task in_data();   //产生数据A
   integer i;
   begin
      for (i=0;i<1024;i=i+1)
	  begin
	     @(posedge sclk);
		 if(i<50)
		   A <= 0;
		 else if (i < 200)
		   A <= 1;
		 else if (i < 700)
		   A <= 0;
		 else if (i < 800)
		   A <= 1;
		 else if (i < 900)
		   A <= 0;
	  end
   end
endtask

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

后仿真:带有器件延时文件的仿真。
.sdo文件是延时文件
.vo是网表文件
库文件:quartus—>eda—>sim_ilb

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/915473
推荐阅读
相关标签
  

闽ICP备14008679号