FPGA_状态机工作原理
FPGA_状态机介绍和工作原理
- 状态机工作原理
- Mealy 状态机模型
- Moore 状态机模型
- 状态机描述方式
- 代码格式
- 总结
状态机工作原理
状态机全称是有限状态机(Finite State Machine、FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机。摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态)。米利有限状态机的输出不止与其输入有关还于它的当前状态相关,这也是与摩尔有限状态机的不同之处。
➢ Mealy 状态机:组合逻辑的输出不仅取决于当前状态,还取决于输入状态。
➢ Moore 状态机:组合逻辑的输出只取决于当前状态。
Mealy 状态机模型

Moore 状态机模型

状态机描述方式
可分为一段式、两段式以及三段式。
一段式,整个状态机写到一个 always 模块里面。在该模块中既描述状态转移,又描述状态的输入和输出。
两段式,用两个 always 模块来描述状态机。其中一个 always 模块采用同步时序描述状态转移,另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律及其输出。
三段式,在两个 always 模块描述方法基础上,使用三个 always 模块,一个 always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。实际应用中三段式状态机使用最多,因为三段式状态机将组合逻辑和时序分开,有利于综合器分析优化以及程序的维护;并且三段式状态机将状态转移与状态输出分开,使代码看上去更加清晰易懂,提高了代码的可读性,推荐大家使用三段式状态机,本文也着重讲解三段式。
三段式状态机的基本格式是:
第一个 always 语句实现同步状态跳转;
第二个 always 语句采用组合逻辑判断状态转移条件;
第三个 always 语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。在开始编写状态机代码之前,一般先画出状态跳转图,这样在编写代码时思路会比较清晰,下面以一个 7 分频为例(对于分频等较简单的功能,可以不使用状态机,这里只是演示状态机编写的方法),状态跳转图如下图所示:

代码格式
状态跳转图画完之后,接下来通过 parameter 来定义各个不同状态的参数,如下
parameter S0 = 7'b0000001; //独热码定义方式
parameter S1 = 7'b0000010;
parameter S2 = 7'b0000100;
parameter S3 = 7'b0001000;
parameter S4 = 7'b0010000;
parameter S5 = 7'b0100000;
parameter S6 = 7'b1000000;
这里是使用独热码的方式来定义状态机
接下来还需要定义两个 7 位的寄存器,一个用来表示当前状态,另一个用来表示下一个状态,如下所示:
reg [6:0] curr_st ; //当前状态
reg [6:0] next_st ; //下一个状态
接下来就可以使用三个 always 语句来开始编写状态机的代码,第一个 always 采用同步时序描述状态
转移,第二个 always 采用组合逻辑判断状态转移条件,第三个 always 是描述状态输出,一个完整的三段
式状态机的例子如下代码所示:
module divider7_fsm (
//系统时钟与复位
input sys_clk ,
input sys_rst_n ,//输出时钟
output reg clk_divide_7
);//parameter define parameter S0 = 7'b0000001; //独热码定义方式parameter S1 = 7'b0000010;parameter S2 = 7'b0000100;parameter S3 = 7'b0001000;parameter S4 = 7'b0010000;parameter S5 = 7'b0100000;parameter S6 = 7'b1000000; //reg define reg [6:0] curr_st ; //当前状态reg [6:0] next_st ; //下一个状态//*****************************************************//** main code//***************************************************** //状态机的第一段采用同步时序描述状态转移always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)curr_st <= S0;elsecurr_st <= next_st;end//状态机的第二段采用组合逻辑判断状态转移条件always @(*) begincase (curr_st)S0: next_st = S1;S1: next_st = S2;S2: next_st = S3;S3: next_st = S4;S4: next_st = S5;S5: next_st = S6;S6: next_st = S0;default: next_st = S0;endcaseend//状态机的第三段描述状态输出(这里采用时序电路输出)always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)clk_divide_7 <= 1'b0;else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))clk_divide_7 <= 1'b0;else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))clk_divide_7 <= 1'b1; else;endendmodule
总结
从代码中可以看出,输出的分频时钟 clk_divide_7 只与当前状态(curr_st)有关,而与输入状态无关,所以属于摩尔型状态机。状态机的第一段对应摩尔状态机模型的状态寄存器,用来记忆状态机当前所处的状态;状态机的第二段对应摩尔状态机模型产生下一状态的组合逻辑 F;状态机的第三段对应摩尔状态机产生输出的组合逻辑 G,因为采用时序电路输出有很大的优势,所以这里第三段状态机是由时序电路
输出的。

状态机时序电路输出模型
采用这种描述方法虽然代码结构复杂了一些,但是这样做的好处是可以有效地滤去组合逻辑输出的毛刺,同时也可以更好的进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对齐,减小总线数据间的偏移,从而降低接收端数据采样出错的频率。
相关文章:
FPGA_状态机工作原理
FPGA_状态机介绍和工作原理 状态机工作原理Mealy 状态机模型Moore 状态机模型状态机描述方式代码格式 总结 状态机工作原理 状态机全称是有限状态机(Finite State Machine、FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学…...
【python练习】python斐波那契数列超时问题
计算斐波那契数列第n项的数字 Description计算斐波那契数列第n项的数字,其中f(1)f(2)1,f(n)f(n-1)f(n-2),如1,1,2,3,5,......Input 正整数n(n<100)Output 一个整数f(n)Sample Input 1 8 Sample Output 1…...
SpringCloud 微服务全栈体系(五)
第七章 Feign 远程调用 先来看我们以前利用 RestTemplate 发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂 URL 难以维护 Feign 是一个声明式的 http 客户端,官方地址:https://github.…...
msvcp140.dll丢失的正确解决方法
在使用电脑中我们经常会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题,我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将介绍6个不同的解决方法,帮助读者解决…...
go pprof 如何使用 --chatGPT
gpt: pprof 是 Go 语言的性能分析工具,它可以用来检测 CPU 使用情况、内存使用情况、以及阻塞情况。你可以使用 pprof 来帮助诊断程序的性能问题,包括内存泄漏。 以下是如何使用 pprof 来分析内存泄漏的基本步骤: 1. **导入 pprof 包**&am…...
大数据可视化BI分析工具Apache Superset实现公网远程访问
大数据可视化BI分析工具Apache Superset实现公网远程访问 文章目录 大数据可视化BI分析工具Apache Superset实现公网远程访问前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网…...
软考系统架构师知识点集锦二:软件工程
一、考情分析 二、考点精讲 2.1 软件过程模型 (1)原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…...
Go并发:使用sync.Pool来性能优化
简介 在Go提供如何实现对象的缓存池功能?常用一种实现方式是:sync.Pool, 其旨在缓存已分配但未使用的项目以供以后重用,从而减轻垃圾收集器(GC)的压力。 快速使用 sync.Pool的结构也比较简单,常用的方法…...
git stash的使用方法
git stash的使用方法 应用场景 当我们在开发一个新功能的时候,或者开发到一半,然后就收到了线上master 出现了bug,当分支开发已经进行了或者进行到一半了,这时怎么办呢? 这时解决方案有两种:一种是先先将当…...
【影刀演示_发送邮件的格式化HTML留存】
发送邮件的格式化HTML留存 纯文本: 亲爱的小张: 端午节将至,公司为了感谢大家一年以来的辛勤工作和付出,特别为大家准备了京客隆超市福利卡,希望为大家带来些许便利和节日的喜悦。 以下是您的福利卡卡号和密码,请您…...
深度学习(4)---生成式对抗网络(GAN)
文章目录 一、原理讲述1.1 概念讲解1.2 生成模型和判别模型 二、训练过程2.1 训练原理2.2 损失函数 三、应用 一、原理讲述 1.1 概念讲解 1. 生成式对抗网络(Generative Adversarial Network,GAN)是一种深度学习模型,是近年来复杂…...
ThinkPad电脑HDMI接口失灵如何解决?
ThinkPad电脑HDMI接口失灵如何解决? 如果平时正常使用的外接显示器,某天突然无法使用了,重新插拔依然无信号的话,可以打开系统的设备管理器(快捷键winx),首先看一下监视器的识别情况,…...
第四部分:JavaScript
一:jQuery 1.1:jQuery介绍 什么是jQuery? jQuery是JavaScript和查询(Query),它是辅助JavaScript开发的js类库 jQuery的核心思想 核心思想是write less,do more,所以它实现了很多浏览…...
【游戏开发】【心法】游戏设计心法系列1-以玩法为核心去设计游戏
游戏的本质 游戏的魔法在于寻找隐藏事物之间的联系。 游戏的魅力在于随着玩家逐渐发现并了解游戏世界的方方面面,他会得到一种丰富而深厚的体验。 挑战,竞争和互动是游戏玩法的三大要素。 规则,过程,目标则是游戏内容的要素。 如…...
chrome谷歌浏览器取消网页所有剪切板的授权方法步骤
地址栏输入 chrome://settings/content/clipboard选择 不允许网站查看您剪贴板中的文字或图片 ———————————————— 版权声明:本文为CSDN博主「一切V随缘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明…...
目标检测算法改进系列之嵌入Deformable ConvNets v2 (DCNv2)
Deformable ConvNets v2 简介:由于构造卷积神经网络所用的模块中几何结构是固定的,其几何变换建模的能力本质上是有限的。在DCN v1中引入了两种新的模块来提高卷积神经网络对变换的建模能力,即可变形卷积 (deformable convolution) 和可变形…...
最新发布!阿里云卓越架构框架重磅升级
云布道师 10 月 19 日阿里云峰会山东上,阿里云重磅升级《阿里云卓越架构白皮书》,助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相,这是阿里云基于多年服务各行各业客…...
如何监听/抓取两个设备/芯片之间“UART串口”通信数据--监视TXD和RXD
案例背景:全网仅此一篇!!! 两个设备/芯片之间采用UART串口通信。我们如何实现芯片1 TXD – > 芯片2 RXD,芯片2 TXD --> 芯片1 RXD两个单线链路上的数据抓取和监听?这篇博客将告诉您。 目录 1 什么是…...
JDK项目分析的经验分享
基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util.function下的函数表…...
Java创建一个长度为10的数组,利用Arrays.sort(), 为数组元素排序
程序要求:1)创建一个整型数组,数组的长度为10. 2)给数组元素赋值,要求乱序。 3)利用fori循环将数组元素依次输出。 4)利用Arrays.sort(), 为数组元素排序 5)采用增加for循环将排…...
新手福音:在快马平台用自然语言生成你的第一个powershell脚本
今天想和大家分享一个特别适合 PowerShell 新手的入门实践。作为一个从零开始学习 PowerShell 的菜鸟,我发现用自然语言描述需求就能生成可运行的脚本,这个体验真的太友好了。 变量定义与数据结构 刚开始学习时,最基础的就是理解变量和数据结…...
Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析
Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析 在Java并发编程领域,ReentrantLock和Semaphore是两个至关重要的同步工具。它们虽然都属于JUC(java.util.concurrent)包中的并发控制机制,但设计理…...
AI命理工具实测:主流大模型八字紫微能力对比及避坑指南
1. AI命理新风向:当大模型碰撞传统术数 最近身边刮起了一阵“AI命理”的热潮:做开发的朋友电脑里存着排盘工具包,运营岗的同事午休时在研究紫微斗数星曜含义,就连开策划会的间隙,都有人拿着AI输出的六爻结果讨论项目走…...
FastAPI + SQLite:从基础CRUD到安全并发的实战指南
核心摘要本文将带你超越FastAPI SQLite的基础CRUD搭建,聚焦于安全防护(认证、授权、输入验证)与并发处理(数据库连接池、异步优化)两大实战痛点。你会获得一套可直接复用的项目骨架,并理解其背后的设计逻辑…...
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践 1. 引言 作为一名数字艺术创作者,我一直在寻找能够提升创作效率和质量的技术工具。最近在尝试使用EasyAnimateV5-7b-zh-InP进行艺术创作时,发现这个模型在图像到视频的转换方面表现出色ÿ…...
暗黑破坏神2重制版智能辅助:自动化流程与效率提升完全指南
暗黑破坏神2重制版智能辅助:自动化流程与效率提升完全指南 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 在《暗黑破坏神2:重制版》的冒险旅程中,你是否曾因重复刷怪、繁琐的装备拾取而感…...
3步实现GitHub资源精准获取:DownGit带来的开发者效率革命
3步实现GitHub资源精准获取:DownGit带来的开发者效率革命 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 在日常开发工作中,每个开发者平均每周需要从GitHub获取3-5次代码资源…...
Python EXE逆向解密终极指南:从打包程序到源码还原完整教程
Python EXE逆向解密终极指南:从打包程序到源码还原完整教程 【免费下载链接】python-exe-unpacker A helper script for unpacking and decompiling EXEs compiled from python code. 项目地址: https://gitcode.com/gh_mirrors/py/python-exe-unpacker Pyt…...
Snes9x音频系统深度探索:Blargg SPC库如何实现高保真声音模拟
Snes9x音频系统深度探索:Blargg SPC库如何实现高保真声音模拟 【免费下载链接】snes9x Snes9x - Portable Super Nintendo Entertainment System (TM) emulator 项目地址: https://gitcode.com/gh_mirrors/sn/snes9x Snes9x作为一款经典的Super Nintendo Ent…...
LangChain框架使用说明
LangChain框架的安装与环境配置 LangChain的安装可通过Python包管理器快速完成。核心库包括langchain、langchain-community和langchain-core,建议使用以下命令进行完整安装: pip install langchain langchain-community langchain-core openai环境配…...
