FPGA状态机的理解与设计

这篇具有很好参考价值的文章主要介绍了FPGA状态机的理解与设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA状态机的理解

1.状态机的分类

moore型状态机

功能框图:

FPGA状态机的理解与设计,FPGA,fpga开发

mealy型状态机

功能框图

FPGA状态机的理解与设计,FPGA,fpga开发

2.二者的区别

moore型状态机的输出G只与当前的状态有关,而mealy状态机的输出不但与当前的状态有关还与输入有关
注:在实际的生活中,mealy型状态机的出现场景较多。

3.状态机的设计(三段式)

无论是moore型状态机还是mealy型的状态机,一般都使用三段式状态机来设计。在设计之前首先要明白在什么情况下应该使用状态机,virelog语言表示的思想是并行思想,这就在将fpga用于处理先后发生的事件的情况下,verilog并行处理思想就显得不合适,于是我们可以知道,只有在发生有先后顺序的情况下,状态机应运而生,以此来解决问题。
首先,通过上面的两幅图片,我们可以知道三段式状态机分别是哪三段。

第一段----状态寄存器

在这一段我认为是最好写的,甚至可以当作模板来写,下面是第一段状态机通常情况下的代码展示。

always @(posedge sys_clk or negedge sys_rst) begin
    if(!sys_rst)
        current_state <= IDLE;
    else 
        current_state <= next_state;
end

但是这里有一个值得注意的点,current_state和next_state的位宽应该与状态变量相同。例如:使用独热码设置分别设计四个状态:

localparam  IDLE    	=   4'b0001;
localparam  START   	=   4'b0010;
localparam  RD_DATA =   4'b0100;
localparam  STOP    	=   4'b1000;

那么current_state和next_state也应该要定义为4位,如果不同位,则会少状态。

第二段–组合逻辑表示状态转移

在这一阶段,我们要明白每个状态在什么条件下会发生状态的转移。例如以串口接受状态机为例。

always @(*) begin
	next_state = IDLE;
    case(current_state)
        IDLE:
            if(work_en == 1'b1)
                next_state = START;
            else 
                next_state = IDLE;
        START:
            if(boud_cnt == BAUD_CNT_MAX - 1'b1)
                next_state = RD_DATA;
            else 
                next_state = START;
        RD_DATA:
            if((bit_cnt == 4'd7)&&(boud_cnt == BAUD_CNT_MAX - 1'b1))
                next_state = STOP;
            else    
                next_state = RD_DATA;
        STOP:
            if(boud_cnt == BAUD_CNT_MAX/2- 1'b1)
                next_state = IDLE;
            else    
                next_state = STOP;
        default:next_state = IDLE;
    endcase
end

以IDLE到START状态为例,当work_en信号为高时,才发生状态的转移。同理可以理解其他时刻的状态转移,有关串口接受状态机的具体分析我将会在下一节具体分析,这里只以实际例子作为讲解。

第三段----产生输出的组合/时序逻辑

以串口发送模块的状态的第三段为例:

always @(posedge sys_clk or negedge sys_rst) begin
    if(!sys_rst)
        tx_data_r <= 1'b1;
    else 
        case(current_state)
            IDLE:
                tx_data_r <= 1'b1;
            START:
                tx_data_r <= 1'b0;
            TX_DATA:
                tx_data_r <= tx_data_latch[Bit_cnt];
            STOP:
                tx_data_r <= 1'b1;
            default: tx_data_r <= 1'b1;
        endcase

end

这一段的意思就是在相应的状态下,系统的输出是什么,这一点可以根据波形图来确定。
状态机的实际使用练习将在下一节串口通信讲解具体怎么用。

总结:

又功能框图可知,状态机的使用重要的是确定输入和输出,状态有哪些,以及在各个状态下系统的输出是什么和状态跳转的条件,只有清楚的知道这些,状态机的编写才是轻松的,不迷糊的。文章来源地址https://www.toymoban.com/news/detail-758070.html

到了这里,关于FPGA状态机的理解与设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA开发基础之三段式状态机

    状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,程序的运行其本质也是状态机,根据输入完成输出,得到新的状态。 在平时硬件电路的设计中经常需要用到状态机,例如CPU的取指、译码、执行,这个流程可以使用状态机来控制

    2024年02月04日
    浏览(45)
  • FPGA入门学习笔记(十)Vivado设计状态机实现UART多字节数据发送

    使用串口发送5个字节数据到电脑 1、ADC采样的结果为12位,如何使用串口发送 2、16位数据,如何通过串口发送 3、多个字节的数据,如何通过串口发送 UART规定,发送的数据位只能有6、7、8位,若直接修改发送位数,接收模块将不适配。 两种情况: 1、没有开始发送(上一次的

    2024年02月12日
    浏览(50)
  • FPGA在校学习记录系列---实验4不同状态的LED+开发板(Verilog HDL)

    此系列记录FPGA在学校的学习过程。 FPGA系列 需要用到的软硬件: 软件:Quartus II 15.0 (64-bit) 硬件: 5CEBA4F23C7芯片 链接: FPGA在校学习记录系列—新建一个FPGA工程编写程序并仿真(Verilog HDL) 创建的工程名字为:LED (这次不用仿真,直接用开发板验证) 编译文件 按键资源:

    2024年04月09日
    浏览(49)
  • 【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

    🎉欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 模块设计: 🥝 按键消

    2024年02月12日
    浏览(45)
  • FPGA嵌入式开发一些Xilinx SDK库函数的理解

    最近在测试AXI Quad SPI这个IP核的端口时序,搭建BD后导出到硬件,在SDK中导入xspi_intr_example.c的源文件,在师兄的帮助下,浅浅研究了一下代码。 首先,需要修改源程序中的错误,参照CSDN文章:ZYNQ中断示例修改 做出以下修改: 此外,还要对中断驱动实例名称进行修改: 以下

    2024年02月12日
    浏览(50)
  • FPGA 开发必备:从零开始学习 FPGA 设计

    FPGA 开发必备:从零开始学习 FPGA 设计 FPGA 是一种可编程逻辑器件,可以在不用重新设计硬件电路的情况下修改其功能。它是数字电路设计中最重要的组成部分之一。FPGA 的广泛应用领域包括通信、计算机、图像处理、音频处理等。 要想成为一名合格的 FPGA 工程师,你需要了

    2024年02月07日
    浏览(60)
  • FPGA开发设计

    FPGA是可编程逻辑器件的一种,本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性,是一种广泛应用的半定制电路。 采用基于SRAM工艺的查位表结构(LUT),LUT用于实现实际逻辑电路的功能,LUT本质上是一个RAM,事先将相应的结果

    2024年01月17日
    浏览(37)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

    2024年02月13日
    浏览(54)
  • FPGA设计开发(基础课题):七人表决器设计

    一、设计目的 1、熟悉MAX+PLUSⅡ、QUARTUSⅡ软件的使用; 2、熟悉EDA/SOPC、FPGA基本结构; 3、熟悉EDA开发的基本流程。 二、设计原理 所谓表决器就是对于一件事,由多个人投票,如果同意的票数过半,就认为此事可行;否则如果否决的票数过半,则认为此事不行。 七人表决器顾

    2024年02月08日
    浏览(82)
  • SOC FPGA介绍及开发设计流程

    目录 一、SoC FPGA简介 二、SoC FPGA开发流程 2.1 硬件开发 2.2 软件开发          SOC FPGA是在FPGA架构中集成了基于ARM的硬核处理器系统(HPS),包括处理器、外设和存储器控制器。 相较于传统的仅有ARM处理器或 FPGA 的嵌入式芯片,SOC FPGA既拥有ARM处理器灵活高效的数据运算和事务

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包