基于Verilog表达的FSM状态机

2024-06-13 21:04
文章标签 状态机 verilog 表达 fsm

本文主要是介绍基于Verilog表达的FSM状态机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于Verilog表达的FSM状态机

  • 1 FSM
    • 1.1 Intro
    • 1.2 Why FSM?
    • 1.3 How to do

在这里聚焦基于Verilog的三段式状态机编程;

1 FSM

1.1 Intro

状态机是一种代码实现功能的范式;一切皆可状态机;
状态机编程四要素:–
1.状态State:
2.转态跳转Condition Jump:
3.行为Action:
4.次态–>现态Transform:
基本范式:systemverilog是Verilog的超集,使用可综合语句即可综合成电路;使用三段式转态机对应的综合电路:


这样看更直观:



module enum_fsm (input clk, reset, input int data[3:0], output int o);
enum int unsigned { S0 = 0, S1 = 2, S2 = 4, S3 = 8 } state, next_state;
always_comb begin : next_state_logicnext_state = S0;case(state)S0:if(xxx) next_state = S1;else if(xxx)next_state = S2;else 	next_state = S0;	S1: next_state = S2;S2: next_state = S3;S3: next_state = S3;endcase
end
always_comb begincase(state)S0: o = data[3];S1: o = data[2];S2: o = data[1];S3: o = data[0];endcase
end
always_ff@(posedge clk or negedge reset) beginif(~reset)state <= S0;elsestate <= next_state;
end
endmodule

1.2 Why FSM?

无论是设计复杂的系统还是处理简单的逻辑流程,状态机都能提供清晰健壮、可维护且易于扩展的代码实现;
状态机思想提供了一种结构化、模块化和可扩展的思维方式进行功能逻辑实现;

  • 逻辑清晰:状态机思想通过将系统行为划分为不同的状态和状态之间的切换,使得系统的逻辑更加清晰。可以帮助明确知道系统当前处于哪个状态,以及在不同状态下应该执行哪些动作;----有助于逻辑思考和代码可读性;
  • 易于维护:状态机将系统的行为模块化,每个状态及转换都是相对独立的;这帮助解耦,使得修改和拓展该模块功能时,可以专注于特定的状态和转换,而不用再考虑整个系统的复杂性了;
  • 可拓展性:状态机思想使得添加新的状态或转换变得相对简单。开发者只需要定义新的状态、转换条件和动作,然后将其集成到现有的状态机中即可。
  • 错误处理:状态机通常包含对错误状态的处理机制。当系统遇到异常情况或无效输入时,状态机可以将其引导到错误处理状态,执行相应的错误恢复操作。
  • 逻辑调试:状态机将系统的行为划分为有限数量的状态和转换,这使得在调试和测试阶段更容易追踪和定位问题。开发者可以通过模拟不同的状态转换和输入条件来测试系统的行为,从而确保系统的正确性和稳定性。
    最后一句话:状态机思想为开发者提供了一种结构化、模块化和可扩展的方法来处理系统的复杂行为。通过采用状态机思想,开发者可以设计出更加清晰、健壮和易于维护的软件系统。

1.3 How to do

在状态机编程思想中:正确的顺序应该是先有状态转换图,而后才指导程序,程序应该是根据设计好的状态图写出来的。
即使是流水线也是状态机表达的一种特殊形式

  • 状态描述图:首先需要描述确定下来,自己根据功能逻辑框图进行细化出来,先按照流水线的顺畅转态转移路线;
    这个就是不要怕,自己先拍板定义状态及转态跳转关系;大胆的画出来;

根据review过的状态机,指导开始写代码,在写的过程中不断加深理解,再优化,不下手是永远不行的;

学会一种好的编程框架或者一种编程思想----会受用终生!比如模块化编程、框架式编程、状态机编程等,都是一种好的框架。

【Refer】

  1. https://blog.csdn.net/u012915636/article/details/136963178
  2. https://cloud.tencent.com/developer/article/2215987
  3. https://blog.51cto.com/oliverHuang/6503930
  4. https://blog.csdn.net/weixin_43070186/article/details/82085463

这篇关于基于Verilog表达的FSM状态机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058413

相关文章

【第十三课】区域经济可视化表达——符号表达与标注

一、前言 地图最直接的表达就是使用符号表达。使用符号可以把简单的点线面要 素渲染成最直观的地理符号,提高地图的可读性。只要掌握了 ArcGIS 符号制 作的技巧,分析符号并总结出规则,就可以制作符合要求的地图+符号。 (一)符号的选择与修改 符号的选择在制图中至关重要,使用符号选择器对话框可从多个可用样式 中选择符号,并且每个符号都有一个标签用来描述其图形特征,如颜色或类型, 利用这些标签可

哺乳细胞重组表达人鼠嵌合抗体:制备与应用

重组抗体是一类具有广泛应用价值的蛋白质,在药物研发和生物医学研究中发挥着重要作用。本文将介绍重组抗体的表达方式,重点关注嵌合抗体制备和哺乳细胞重组表达人鼠嵌合抗体的技术原理和应用。 重组抗体表达的原理和方法 重组抗体表达是通过将人或动物源的免疫球蛋白基因导入表达宿主细胞,并使其表达出特异性抗体蛋白质。常用的表达系统包括细菌、哺乳细胞和真核微生物等。 嵌合抗体制备的步骤和优势 选择适当的抗原

「学转录组入门生信」第二周来获取表达量矩阵

我们第二周目标有四个: 整理数据RNA-seq格式了解数据质控数据比对read定量 首先,我们得要知道我们在转录组分析过程中会遇到很多格式,建议先通过搜索查找了解这些格式是什么 fasta/fas/fagtf/gffbedsam/bamcsv/tsv/txt 接着,我们会在分析过程中时刻检查我们的数据质量,所以你要尝试回答下面这几个问题 数据质控要在哪个阶段做不同阶段要看什么标准质控有哪

一个整数使用英文表达的字母计数

题目: 把1到5写成英文单词分别是:one、two、three、four、five。这些单词一共用了3+3+5+4+4 = 19 个字母。 如果把1到1000都写成英文单词,一共要用多少个字母? 注:不计入空格和连字符,例如,342,three hundred and forty-two, 包含23哥字母,而115(one hundred and fifteen)包含20个字母。单词“and

PIE原则——编程要表达出意图

PIE 英文:Program Intently and Expressively 中文:编程要表达出意图 是什么 在写代码时,明确表达意图十分重要,这与写诗、写随笔、写博客和写信是一个道理。 这是因为代码是写给人看的,而不是写给编译器看的。 因此,在写代码的时候要在表达上多花心思,将软件运行方式直接地传送给阅读代码的人。 为什么 代码是我们正确、完整地了解软件运行方式的唯一线索。

使用 TinyFSM 和 BehaviorTree.CPP 构建状态机与行为树示例

文章目录 0. 概述1. 有限状态机(FSM)原理状态机示例(FSM) 2. 行为树(BT)原理行为树示例(BT) 3. 结合FSM和BT项目结构4. 代码实现5. 总结6. 参考 0. 概述 在现代软件开发中,有限状态机(FSM)和行为树(BT)是两种常用的工具,用于实现复杂的逻辑控制和决策。本文将展示如何结合使用 TinyFSM 和 BehaviorTree.CPP 创建

嵌合抗体设计与表达服务:哺乳细胞重组表达的利器

嵌合抗体是一类具有重要生物学功能和药物研发应用的蛋白质,其设计和表达对于相关研究至关重要。本文将介绍嵌合抗体设计与表达服务的原理和方法,重点关注哺乳细胞重组表达的技术进展和应用。 嵌合抗体设计与表达服务 嵌合抗体设计服务是通过计算机辅助设计等方法,设计出具有特定结构和功能的嵌合抗体分子。嵌合抗体表达服务则是在设计完成后,利用哺乳细胞等系统进行表达,并提供纯化等后续服务。 哺乳细胞重组表达的重

【FPGA】`include 和 verilog header的区别

作用域区别 include 是把文件 粘贴到当前位置,作用域也仅限当前文件header 作用域是整个工程 .f添加方式的区别 include “xxx.v” 写在当前文件中,.f文件无需另外添加header文件用+incdir+./…/pathname/ fpga添加方式的区别 include “xxx.v” 写在当前文件中,.f文件无需另外添加header文件需要设置filetype

Verilog中端口应该设置为wire形还是reg形

初学Verilog时,一直搞不清Verilog描述模块时端口应该取什么类型;是reg形?还是wire形?模块对应测试文件的端口类型为什么又与模块的端口类型不一样?因此有必要进行学习与整理: 先写结论: verilog中的端口具有三种传输方向:input、output、和inout,所有的端口均默认为wire类型; 模块描述时,input端口只能为线网形,output端口可以为线网/reg,in

根据状态转移写状态机-二段式

目录 描述 输入描述: 输出描述: 描述 题目描述:    如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。 要求: 1、 必须使用对应类型的状态机 2、 使用二段式描述方法 注意rst为低电平复位 信号示意图: 波形示意图: 激励描述如下: