基于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

相关文章

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

systemverilog、verilog的部分常用内部函数

1. $ceil 作用:将给定的实数或浮点数向上取整。示例:$ceil(3.2) 返回 4。 2. $floor 作用:将给定的实数或浮点数向下取整。示例:$floor(3.9) 返回 3。 3. $value$plusargs 作用:从命令行读取传递给仿真器的参数。格式:$value$plusargs("格式", 变量),格式 用来匹配命令行的参数,变量 是用来存储匹配到的值。示例:$

STM32F4按键状态机--单击、双击、长按

STM32F4按键状态机--单击、双击、长按 一、状态机的三要素二、使用状态机原因2.1资源占用方面2.2 执行效率方面:2.3 按键抖动方面: 三、状态机实现3.1 状态机分析3.1 程序实现 百度解析的状态机概念如下 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(

Verilog语法+:和-:有什么用?

Verilog语法+:和-:主要用于位选择,可以让代码更简洁。 一、位选择基础 在Verilog中,位选择可以通过直接索引来实现,例如: reg [7:0] data; wire select_a; wire [2:0] select_b;   assign select_a = data[3]; assign select_b = data[2:0]; 二、+: 和 -: 语法

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、

AS3中正则表达式中如何表达“或”

var reg:RegExp=/\r|\n|\t/g;                 var msg:String="123\rabc\n\tabc\ta\123";                 msg=msg.replace(reg,"");                 trace(msg);

FPGA第 10 篇,Verilog 中的运算符和分支语句

前言 我们都知道 Verilog 作为一种硬件描述语言,不仅用于设计和仿真数字电路,还为开发者提供了强大的工具,用于控制和优化硬件的行为。其中运算符和分支语句是 Verilog 中的两大核心组成部分,它们负责执行逻辑操作、数学运算以及决定逻辑流的控制。 运算符 在 Verilog 中用于进行各种计算和逻辑操作,它们类似于软件编程中的运算符,但特定于硬件操作,涵盖了算术、逻辑、按位操作、移位操

verilog仿真激励

简介         本章节主要描述verilog激励仿真函数的介绍。 initial         主要针对寄存器初始化值,基本所有仿真都会使用到该语句,使用如下: initial beginsys_clk = 'd0; sys_rst_n = 'd0; #2000;sys_rst_n = 'd1; end repeat         重复有限次数地执行一段代码,使用如下:

【正则表达】同时包含2个甚至多个关键字 content.contains(keyword1)content.contains(keyword2)

有三个字符串如何匹配同时包含两个关键字的字符串 str1 = "this is the first check run" str2 = "the first run" str3 = "the first time runing" 有两个关键字(“first ”、”check “) 正则表达式怎么写 然后匹配到str1 // regExp (?=.*我是谁)(?=.*C)^.*

Spring 状态机

文章目录 使用 Spring 状态机构建订单处理系统什么是 Spring 状态机?示例场景:订单处理系统步骤 1: 添加依赖步骤 2: 定义状态和事件步骤 3: 配置状态机步骤 4: 使用状态机步骤 5: 测试状态机Spring 状态机原理详细说明核心概念实现机制 使用 Spring 状态机构建订单处理系统 在构建复杂的业务流程时,状态机是一种强大的工具。它帮助我们定义状态、