首页 > 其他分享 >【FPGA基础】状态机

【FPGA基础】状态机

时间:2023-12-21 16:33:59浏览次数:32  
标签:状态 FPGA 输出 基础 fifo 状态机 state 输入

状态机由状态寄存器和组合逻辑电路组成;在不同的当前状态下,能够控制信号的变化进行状态的转移,从而实现相关信号的赋值,完成特定控制时序的设计。

状态机的三个基本要素:

       状态变迁(当前状态current_state和下一状态next_state

       输入条件(状态变化的触发事件

       输出赋值(状态机设计的主要目的

 

有限状态机(FSM)的分类

       若输出只和状态有关而和输入无关(无条件状态转移),则称为Moore状态机;

       输出不仅和状态有关而且和输入有关(有条件状态转移),则称为Mealy状态机;

(Moore型只在某些上电初始化中可能会用到,实际上以Mealy型为主。不过也无需太注意使用哪一种状态机实现方式。)

 

关于状态的变迁

       外部输入信号产生的“特定事件”通常是引起状态变迁的先决条件,但不是必要条件;(有些时候状态变迁是自然发生的,不需要外部输入)

       状态机可以在一些有限状态间进行“无限循环”;也可以进行“有限”循环或单次运行,最终进入只有一个复位才能退出的“终结状态”。

 

状态机设计方法(三段式或者又称两段式)

  第一段状态机:时序逻辑,状态锁存

  第二段状态机:组合逻辑,判断当前状态和输入信号变化,输出下一状态

  当前状态下,时序逻辑对输出信号赋值

 

例子:

用fifo的计数器控制,写半满时开始读,读半空时开始写,其它时间既读又写。

// 利用状态机对fifo进行半空半满的读写
module fifo_example;

// 三段式状态机
always @(posedge clk100m) begin
    if(Rst == 1'b1)
        curr_state <= #TCQ_STA_IDLE;
    else
        curr_state <= #TCQ_next_state;
end

// Calculate the next state
always @ ( * ) begin
    case(curr_state)
        STA_IDLE:begin
            if (full == 1'b0) // fifo IP核的性质,初始化状态full为1
                next_state <= STA_WRITING;
            else
                next_state <= STA_IDLE;
        end

        STA_WRITING:begin
            if (wr_data_count > 8'd200) // 已写入200个数
                next_state <= STA_READING;
            else
                next_state <= STA_WRITING;
        end
        
        STA_READING:begin
            if (rd_data_count < 6'd20)  // 可读取的数小于20
                next_state <= STA_WRITING;
            else
                next_state <= STA_READING;
        end

        default :begin
            next_state <= STA_IDLE;
        end
    endcase
end

// state output
always @(posedge clk100m) begin
    if (Rst == 1'b1) begin
        wr_en        <= #TCQ 1'b0;
        rd_en        <= #TCQ 1'b0;
        din          <= #TCQ 8'd0;
        din_r        <= #TCQ 8'd0;
    end
    else case (curr_state)
        STA_IDLE: begin
            wr_en        <= #TCQ 1'b0;
            rd_en        <= #TCQ 1'b0;
            din          <= #TCQ 8'd0;
            din_r        <= #TCQ 8'd0;
        end

        STA_WRITING:begin
            wr_en        <= #TCQ 1'b1;
            rd_en        <= #TCQ 1'b0;
            if (din == 8'd255)
                din      <= #TCQ 8'd0;
            else 
                din      <= #TCQ din + 8'd1;
            din_r        <= #TCQ din;
        end

        STA_READING:begin
            wr_en        <= #TCQ 1'b0;
            rd_en        <= #TCQ 1'b1;
        end
    endcase
end

endmodule //fifo_example

 

标签:状态,FPGA,输出,基础,fifo,状态机,state,输入
From: https://www.cnblogs.com/Ivan0506/p/17919361.html

相关文章

  • 性能测试基础
    软件八大质量特征 什么是性能测试:性能测试:属于软件测试范畴,旨在测试处于特点环境和配置下的系统在一定量的负荷下,系统的正确性、相应时间、速度TPS、成功率、稳定性、可恢复性等特性是否满足特性干系人需求的能力。系统性能关于用户的体验。性能属于产品的非功能质量特性。......
  • 高云FPGA的LVDS应用
    本板卡提供如下例程,主要基于具体案例,聚焦于摄像头采集,LCD屏驱动显示等图像处理相关。像GPIO,CLK,LED等这种简单的操作都放到具体实例中了,不再一一介绍,常用的IP也是非常简单的操作,高云文档有些写得不太仔细,如遇到不清楚的地方可以联系官方FAE或者我这边。3.1LVDS的应用LVDS使用......
  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    来自于:https://www.cnblogs.com/6b7b5fc3/p/17134421.html1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8+/服务端其他特性支持:GraalNative-Image......
  • ubuntu 18.04.6 编译Preloader提示 没有规则可制作目标 /host_tools/altera/preloader
     生成spl_bsp后,在spl_bsp路径下输入make 提示:没有规则可制作目标/host_tools/altera/preloader/uboot-socfpga.tar.gz 原来要先运行 ./embeddedcommandshell.sh,并在该终端窗口下输入make   ......
  • java基础之“获取系统类型,区分Windows和Linux系统”
    一、获取系统类型,区分Windows和Linux系统//判断是否是windows系统System.getProperties().getProperty("os.name").contains("Windows") 二、案例@TestpublicvoidtestWindows(){Stringproperty=System.getProperties().getProperty("os.name");......
  • C/C++语法基础目录
    目录C/C++语法基础目录前言程序语言简介三大控制结构批量数据存储模块化编程指针自定义数据类型文件面向对象封装继承多态C/C++语法基础目录前言使用过较多的教学书籍,有很多不错的书籍,但是并不是那么切合自身的教学习惯,于是此书被拉开了帷幕。本书的第一次落键是在2023年12月2......
  • python基础(一)常用数据类型
    Python3中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典)1.数字类型:3种数值类型:int/float/bool/complex2.String(字符串):使用英文双引号或英文单引号括起来。如果有多行内容,除了使用换行符之外,还可以使用"""MMMM"""来定义3.List(......
  • MySQL-基础篇
    索引的数据结构二叉树树高度普通二叉树最坏n.红黑树二叉平衡树,树高度logn+1.以20000000条数据为例,h=log20000000=25Hash表对索引的key进行一次hash计算就可以定位出数据存储的位置很多时候Hash索引要比B+Tree更高效仅能满足=、in,不支持范围查询hash冲突问题(数组+链表)......
  • 2023-2024-120231329《计算机基础与程序设计》第13周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html这个作业的目标《C语言程序设计》第12章并完成云班课测试作业正文https://www.cnblogs.com/xjn123/p/17......
  • 【SpringBootWeb入门-16】Mybatis-基础操作-多条件查询操作&XML文件配置SQL
    1、章节回顾上一篇文章我们讲解了Mybatis的增改查操作,本篇继续学习Mybatis的复杂查询操作(多条件查询)。2、增删改查操作-多条件查询操作根据条件姓名、性别、入职时间来查询员工表emp数据,其中员工姓名支持模糊匹配,性别进行精确匹配,入职时间进行范围查询,查询结果按照最后修改时间......