FSM状态机描述绘制小工具
对于工程师写代码来说,经常避免不了要使用状态机的方法来指导编程;
并且尤其对于我这样的使用画图软件来画状态机,比较丑陋,比较拿不出来对外面交流;
------->需求:比如使用类似使用JSON格式来描述状态机,然后进行转化成状态机工具<--------------
1 描述版状态机小工具
1.1 Mermaid
https://mermaid.js.org/syntax/stateDiagram.html
这个打开方便,并且提供了一个很好的demo示例,方便快速上手;
在这里我提供一个我改写状态机的例子:
---
title: TLP_DESC_FSM
---
%%test for diagram draw
%% stateDiagram-v2
%%[*] --> IDLE
%%IDLE --> [*]
%%IDLE --> Moving
%%Moving --> IDLE
%%Moving --> Crash
%%Crash --> [*]
stateDiagram-v2
%%======================================================================
%%===========================State Declare==============================
%%======================================================================
State1: IDLE
State2: DESC_ERR_CHK
State3: DESC_CALU_TLP_DESC
State4: DESC_CACHE_UPDATE
State5: DESC_TLP_GEN
%%======================================================================
%%===========================State Transition Jumb======================
%%======================================================================
[*] --> State1
State1 --> State2: packet_ready && cache_ready
State2 --> State3:
State3 --> State4:
State4 --> State5:
State5 --> Self: if not desc_eop
Self --> State5: If not desc_eop
Self --> [*]
%%======================================================================
%%===========================State Action Output========================
%%======================================================================
%% IDLE: do nothing, wait for the preparation
%% DESC_ERR_CHECK: Do the mrlg error check; Just as talked before,Mainly the length check
%%%%%%% 1.to get the reg: mrlg_err_code;
%%
生成状态机图如下图所示:
在这里一个不好的是,无法状态进行自己循环指自己,在这里我借助一个Self状态来中转表达一下;
1.2 Graphviz绘制状态机–Dot语言
https://liutos.github.io/2020/05/07/%E7%A8%8B%E5%BA%8F%E5%91%98%E7%89%B9%E6%9C%89%E7%9A%84%E7%94%BB%E5%9B%BE%E6%96%B9%E5%BC%8F%E2%80%94%E2%80%94%E8%AF%AD%E7%BB%98%E5%B7%A5%E5%85%B7%E5%B0%8F%E5%85%A5%E9%97%A8/
-------> https://www.cnblogs.com/chunk998/p/16814606.html
-------> https://graphviz.gitlab.io/Gallery/directed/fsm.html
-------> 直接更方便安装在VS code的插件上;十分的方便; https://marketplace.visualstudio.com/items?itemName=Stephanvs.dot
这个也是提供非常好的demo来使用
# https://hifpga.com/fsm/
#状态机示例
digraph fsm {
"a" -> "a" [label= "0/0"]
"a" -> "b" [label= "1/0"]
"b" -> "c" [label= "0/0"]
"b" -> "d" [label= "1/0"]
"c" -> "a" [label= "0/0"]
"c" -> "d" [label= "1/0"]
"d" -> "e" [label= "0/0"]
"d" -> "f" [label= "1/1"]
"e" -> "a" [label= "0/0"]
"e" -> "f" [label= "1/1"]
"f" -> "f" [label= "1/1"]
"f" -> "g" [label= "0/0"]
"g" -> "a" [label= "0/0"]
"g" -> "f" [label= "1/1"]
}
使用命令:dot eg.dot -T svg -o eg.svg
可以换成另一种风格的状态机风格:
命令:dot eg.dot -K circo -T png -o eg.png
1.3 安装软件使用
https://github.com/pytransitions/transitions?tab=readme-ov-file 不推荐相信上手入门还是有点时间成本的;
目前我用的是在线版的,但后续指定要转移到VScode插件上来更加方便使用;这也是最方便的;