[FPGA入门笔记](九):有限状态机学习,三段式FSM代码编写

简介

今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。开发板输入时钟为50MHz。
有限状态机可以实现对外部激励和当前状态的有效相应机制,在数字通信、自动化控制、指令集设计等方面均有重要作用,应用广泛。当前的程序化设计方法使得有限状态机的设计得以极大简化,从过去数字电路教学中较复杂的设计内容演变为基础教学内容,提升了设计效率,这也符合行业对于数字电路系统设计的需求。
定义:有限状态机(Finite State Machine, FSM)简称状态机,是用来表示系统中的有限个状态及这些状态之间的转移和动作的模型。这些转移和动作依赖于当前状态和外部输入,它下一步的状态逻辑通常是重新建立的,也称之为随机逻辑。

有限状态机优点

高效的顺序控制模型:
克服了纯硬件数字系统顺序方式控制不灵活的缺点,在其运行方式上类似于控制灵活和方便的CPU,是高速高效控制的首选。
容易利用现成的EDA工具进行优化设计:
①状态机构建简单,设计方案相对固定,使用HDL综合器可以发挥其强大的优化功能;
②性能良好的综合器都具备许多可控或自动优化状态机的功能
稳定性能:
状态机容易构成良好的同步时序逻辑模块,可用于解决大规模逻辑电路设计中的竞争和冒险现象。
高速性能:
在高速通信和高速控制方面,状态机更具有其巨大的优势,一个状态机的功能类似于CPU的功能。
高可靠性能:
①状态机是由纯硬件电路构成,不存在CPU运行软件过程中许多固有的缺陷;
②状态机的设计中能使用各种容错技术
③当状态机进入非法状态并从中跳出,进入正常状态的时间短暂,对系统的危害不大。

状态机分类

状态机主要分为两种类型:
1. Moore型状态机:下一状态只由当前状态决定。即:
** 次态=f(现状,输入),输出=f(现状);**
Mooer状态机的输出只与当前的状态有关,也就是由当前的状态决定输出,而与此时的输入无关,输入只决定状态机的状态改变,不影响电路最终的输出。
在这里插入图片描述
2. Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关,即:
次态=f(现状,输入),输出=f(现状,输入);
Mealy状态机的输出不仅与当前的状态有关,还与当前的输出有关,即当前的输入和当前的状态共同决定当前的输入。
在这里插入图片描述

有限状态机的表示方法:状态转移图

在这里插入图片描述
图中这个有限状态机包含三个状态、两个信号输入、一个Moore输出和一个Mealy输出。当有限状态机在S0或S1状态时,y1输出高电平;当状态机处于S0状态且a、b均为1的时候,y0也为高电平。

有限状态机代码实现

`timescale 1ns / 1ps
module fsm_ex
    (
    input clk,reset,
    input a,b,
    output y0,y1
    );
    // 状态符号声明
    localparam  s0 = 2'b00,
                s1 = 2'b01,
                s2 = 2'b10;
    //信号声明
    reg [1:0]  state_curt , state_next;
    // 状态切换
    always @ (posedge clk , posedge reset )
    if ( reset )
        state_curt<= s0;
    else
        state_curt<= state_next ;
    //  次态逻辑
    always  @*
        case ( state_curt )
         s0:  if ( a )
                if ( b )
                    state_next = s2 ;
                else
                    state_next = s1 ;
                else
                    state_next = s0;
         s1:   if  ( a )
                    state_next = s0;
               else
                    state_next = s1;
         s2:        state_next = s0;
        default: state_next = s0;
        endcase
       // Moore型逻辑输出
        assign  y1 = (state_curt == s0)||(state_curt == s1) ;
      // Mealy型逻辑输出
        assign  y0 = (state_curt == s0) & a & b ;

endmodule

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值