【FPGA入门】第四篇、有限状态机

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

目录

第一部分、一个关于有限状态机的例子

第二部分、学会有限状态机的准备知识

1、什么是有限状态机?

2、为什么需要状态机?

3、什么是竞争冒险?

3.1、什么情况下会发生竞争冒险?

3.2、为什么组合逻辑电路会产生竞争和冒险?

3.3、那什么是竞争?什么是冒险?

3.4、怎样降低竞争冒险?

4、关于状态编码问题

第三部分、二段式状态机的编写

第四部分、仿真效果

第五部分、总结


第一部分、一个关于有限状态机的例子

        啥时候需要用到状态机,首先我们来看一个例子。有一个自动饮料售货机,里面的货物3元一件,每次投币只能投1元。

        由数电的知识,我们将这个过程转换为状态转移图,如下:

【FPGA入门】第四篇、有限状态机

        接着问题就是,如何用verilog把这个售货机买东西的这个程序给设计出来???

第二部分、学会有限状态机的准备知识

1、什么是有限状态机?

        有限状态机(Finite State Meachine,FSM)简称状态机。我的理解是:它是去描述一个过程,也就是完成某一件事必须有几个步骤,只有完成这几个步骤才能到达终点,这个终点也是起点,是一个闭环的过程,经过几次状态跳转后总会回到起点。

2、为什么需要状态机?

        因为FPGA内部的Verilog HDL 的语句块都是并行执行的, 当我们希望执行按照顺序的方式进行时,引入状态机就可以很好的实现顺序执行。

3、什么是竞争冒险?

        在学会状态机怎么写之前,首先你要了解一个模电的基本常识,那就是竞争与冒险。

        3.1、什么情况下会发生竞争冒险?

        竞争和冒险主要发生在组合逻辑电路中。

        3.2、为什么组合逻辑电路会产生竞争和冒险?

        因为每个逻辑单元都会存在延迟问题,这可能和器件的制作工艺,材料有关系,我们设计时不可能保证信号经过每个逻辑器件的时间都是一致的,因次当两个信号再次汇聚时,总有一个先,一个后。

        3.3、那什么是竞争?什么是冒险?

        上面说到了,两个信号在电路的某一点汇聚时,顺序有限有后。

        那我们假设现在有一个与门,输入为a,b,输出为c。当前状态下 a = 0,b = 1,c = 0。此刻,我同时对a,b输入信号进行取反,这是 a = 1 ,b = 0;若a = 1的信号比b = 0的信号先到与门,那么c就会有那么一瞬间c = 1,进而就有一个尖峰脉冲。  

        如下图:

【FPGA入门】第四篇、有限状态机

        3.4、怎样降低竞争冒险?

        想降低竞争冒险那就应避免使用组合逻辑,多使用时序逻辑。那为啥时序逻辑就能降低竞争冒险现象呢?

       首先FPGA内部时钟一般是50M,1/50M = 20ns,也就是一个周期是20ns,而竞争冒险一般只有几个纳秒。

       而clk 的上升沿/下降沿采集到毛刺的概率就非常低。正常情况下,clk的沿都采集不到该毛刺,如下图:

【FPGA入门】第四篇、有限状态机

4、关于状态编码问题

        独热编码注意:多少个状态,对应的state状态一定有多少位;其次在modelsim一定要以二进制的方式检查state独热码的位数)。即 One-Hot 编码,一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,(3个状态3位,4个状态4位)每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。

        优点:每一个独热码的数据位只有一个为1,其它全为0,因此独热码的变化只需要一位转变即可。

        因此使用独热码可以提高运行速度。在高速系统中,无论个数均推荐使用独热码。

第三部分、二段式状态机的编写

        了解了什么是有限状态机,以及竞争冒险,那么采用的两个时序逻辑 always 块,不仅可以描述清楚状态转移和数据输出,又能消除组合逻辑带来的毛刺。

        售货机示例代码:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : fsm.v
// Create : 2023-04-12 17:01:02
// -----------------------------------------------------------------------------
module fsm(
	input wire clk,
	input wire rst_n,
	input wire pi_money,
	output reg po_drink
	);
//状态名称定义(独热码)
parameter IDLE = 3'b001;
parameter ONE  = 3'b010;
parameter TWO  = 3'b100; 

reg [2:0] state;
//状态转移
always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		state <= IDLE;
	end
	else begin
		case(state)
		IDLE:
			if(pi_money == 1'b1)begin//疑问,随机数来代替pi_money,如果一致为1怎么解决?
				state <= ONE; 
			end

		ONE:
			if(pi_money == 1'b1)begin
				state <= TWO;
			end

		TWO:
			if(pi_money == 1'b1)begin
				state <= IDLE;
			end
		default:
			state <= IDLE;
		endcase
	end
end


//状态输出(多个输出,用多个always语句块)
always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		po_drink <= 1'b0;
	end
	else if (state == TWO && pi_money == 1'b1) begin
		po_drink <= 1'b1;
	end
	else begin
		po_drink <= 1'b0;
	end
end

endmodule

第四部分、仿真效果

        仿真结果如下图,符合设计逻辑。

【FPGA入门】第四篇、有限状态机

第五部分、总结

        本章内容参考了以下资料:首先是这篇博客:http://t.csdn.cn/F3QAK;其次是V3学院的培训课程和指导手册。

        最后,希望我的总结对你有帮助😀😁,看到这里了,要不点个赞,意思一下?👍

        文章来源地址https://www.toymoban.com/news/detail-493710.html

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

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

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

相关文章

  • 操作系统第四篇

      前面章节用 x86 汇编语言写了引导记录 mbr.bin,并让 BIOS 引导到内存 0x07c00 处执行成功。然后用 x86 汇编语言写了 myos 的极简版 start.bin,并让 mbr.bin 加载到内存 0x10000处执行成功。接下来只要在 start.bin 的基础上增加操作系统的基本功能就可以了。start.bin是用 x86 汇编语言写

    2024年02月16日
    浏览(48)
  • ElasticSearch篇---第四篇

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 面试官:想了解 ES 集群的底层原理,不再只关注业务层面了。 前

    2024年02月03日
    浏览(36)
  • 第四篇Android--TextView使用详解

    TextView是View体系中的一员,继承自View,用于在界面中展示文字。 基本用法: 1.   设置点击事件: 2.设置文字颜色1): 上面方式设置的颜色只有一种状态。如果需要TextView展示时一种颜色,按下时展示另外一种颜色,可以通过设置selector实现。     设置文字颜色2):   在

    2024年02月07日
    浏览(40)
  • 第四篇 用户登录界面(WinForm版本)

    本编文章来教大家如何创建WinForm项目,以及如何使用WinForm创建自己的登录界面 1、新建项目,打开VS开发工具,创建新项目,选择Windows窗体应用(.Net Framework)。    2、输入项目名称,项目名称建议使用英文名称,避免后面因中文产生的各种异常错误,选择自己电脑上的项目存

    2024年02月09日
    浏览(39)
  • 第四篇:SQL语法-DDL-数据定义语言

    DDL英文全称是Data Definition Language(数据定义语言),用来定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象 1.列出所有已定义数据库 2.查询当前所处数据库 (注:尖括号内的内容是可选项) (注:尖括号内的内容是可选项) 使用以上命令进行测试~注意命

    2024年02月20日
    浏览(40)
  • 使用CentOS 7配置邮件服务-第四篇

    在上一章我们配置主和从服务器的DNS域名解析,这一章我们配置使用CentOS 7配置邮件服务 要求: 1、两台邮件服务器IP地址分别为192.168.1.学号及192.168.0.199 2、 两台邮件服务器域名为学生姓名。例如mail.zhangsan.com 及mail.zs.com。 3、在DNS服务器配置两台服务器的域名。 4、配置完成

    2024年02月12日
    浏览(35)
  • 【STM32基础】第四篇、控制PWM占空比

    目录 第一部分、STM32定时器的基本知识 1、STM32定时器的分类(图片来自野火文档) 2、开发过程中定时器的常用基础功能 3、定时器挂在的总线  第二部分、能用的代码   1、定时器计时代码 2、定时器输出PWM代码 第三部分、总结 1、STM32定时器的分类(图片来自野火文档)  

    2024年02月07日
    浏览(47)
  • openCV 第四篇 角点检测、图像特征、图片拼接

    本文原本打算直接简单介绍一下harris和sift,之后进行特征匹配,来一波图像拼接。 想来想去还是先介绍下原理吧,虽然没人看QAQ。可以直接点击右侧目录跳转到代码区。 角点检测  和  图像特征提取(就几行代码) 以及进行图像拼接代码,来完成如下操作: 上图我们可以清楚

    2024年01月17日
    浏览(52)
  • 微信小程序商城项目实战(第四篇:商品详情页)

    json里边设置一下页面标题 \\\"navigationBarTitleText\\\": \\\"商品详情\\\" 上方由一个轮播图展示, 中间为商品信息,后台会返回图文详情富文本,前台只需赋值 下方固定一个工具栏 客服 分享 购物车 添加购物车 立即购买 分享是将一个按钮隐藏且将其定位在分享处,客服也是一样的 加入购

    2024年02月09日
    浏览(74)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包