十二 · 2021年11月26日

三分钟告诉你如何获取StateMachine中的状态做DFX

本文用三分钟时间告诉你如何获取StateMachine中的当前状态用作设计中的DFX。

StateMachine中的currentState

关于SpinalHDL中StateMachine的使用,之前已有过介绍:兄弟,要几段?

image.png

SpinalHDL中的StateMachine设计思路让我个人觉得耳目一新,写出来的代码如同伪代码般令人读着如同一种享受。然而在有些设计里会有要求是能够通过HPI实时获取状态机当前的状态用于监控,然而如何在SpinalHDL中获取当前的state来做DFX难倒了不少人。
本篇以下面这个简单的example为例:

1794bce41ce5d6a51d4f4ed0077b720d.png

这里的example很简单,io.result只在stateB状态的最后一个cycle才会为高电平。至于语法,就不过多讲解了,简洁明了~      

获取currentState

1a555ac7014d3f54b7725e92d9c2f462.png

如果你去看过SpinalHDL中StateMachine,那么你会发现其实现里通过stateReg来标记当前状态,而这里通过addPrePopTask中将其赋值到io.currentState中去。

之所以要将赋值放置在addPrePopTask中而不是直接进行赋值,主要原因在于当我们使用StateMachine时其真正映射成电路是通过下面的代码来实现的:

Component.current.addPrePopTask(() => {
  if(parentStateMachine == null)
    build()
}

而stateReg的真正映射为Reg是在build函数中实现的,因而对于stateReg中的获取赋值给其他电路对象也就只能在addPrePopTask中去执行,故而我们的赋值也就只能在addPrePopTask中去实现(该任务是写在声明StateMachine之后,故而在PrpPopTask执行阶段会先执行StateMachine的build而后执行我们的赋值操作)。

看下最终的方针波形:

fdf407529bdfdf641f007711343f23f8.png

可以看到,这里currentState与stateReg保持一致,也就意味着当前的状态机状态。

☆ END ☆

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/IbsQOwYZnr7tGM2NvjDlWw
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
1 阅读 155
推荐阅读
0 条评论
关注数
1513
内容数
72
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息