FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-所有问题-其他-正文

FPGA 状态机设计有什么最佳实践?

数字IC萌新数字IC萌新
其他
5小时前
0
0
5
写状态机时总是容易出 bug,比如卡死、重复进入。请问 FPGA 状态机设计有哪些最佳实践和常见坑?
数字IC萌新

数字IC萌新

这家伙真懒,几个字都不愿写!
210700
分享:
数字IC设计工程师的日常工作中,用SystemVerilog和用Verilog的体验和效率差距大吗?上一篇
FPGA面试手撕代码:如何判断一个Verilog实现的序列检测器(如检测“1011”)是否存在bug?下一篇
回答列表总数:5
  • FPGA学员5

    FPGA学员5

    我分享一个实际踩过的坑。之前写状态机,状态转移条件用了组合逻辑的‘与或’表达式,结果发现有时候会重复进入某个状态。后来发现是条件表达式在某个时刻有毛刺,导致一个时钟周期内次态变化了多次。

    解决办法:把状态转移条件用寄存器锁存。比如,在时钟上升沿采样条件,生成一个使能信号,这个使能信号有效期间,状态才转移。这样即使条件有毛刺,只要时钟边沿没抓到,就不会误动作。

    另外,状态机输出如果控制计数器之类,要注意输出和状态转移的时序关系。最好画个时序图,理清楚每个信号在时钟沿前后的变化,再写代码。

    5小时前
  • 数字系统初学者

    数字系统初学者

    从验证角度聊聊。状态机 bug 经常是仿真没发现,上板子才出问题。除了前面说的同步输入,还要注意跨时钟域信号处理。如果状态机涉及多个时钟,一定要用 FIFO 或握手同步,不能直接拿过来用。

    设计时,可以在代码里加一些安全机制。比如,在状态转移的 default 分支里,不是简单保持现态,而是强制跳回初始状态,并拉个错误标志。这样万一跑飞了,能自己恢复,也方便调试。

    还有,状态机代码别写太复杂。一个 always 块搞定所有,看起来简洁,但容易乱。分开写,虽然代码长点,但好维护。

    5小时前
  • 逻辑设计新人甲

    逻辑设计新人甲

    简单说几个要点吧。

    第一,状态编码建议用独热码(one-hot),特别是状态不多的时候。虽然浪费寄存器,但逻辑简单,速度快,不容易出错。工具对独热码优化也好。

    第二,输出尽量用时序逻辑,别用组合逻辑。组合输出容易有毛刺,而且如果输出作为其他模块的使能,时序不好控制。用时序逻辑输出,虽然延迟一个周期,但稳定。

    第三,初始化别忘了。上电后状态机要有个确定初始状态,一般复位时强制到 IDLE 状态。

    5小时前
  • FPGA学号5

    FPGA学号5

    我补充一点,状态机设计最容易掉坑里的就是状态转移条件有毛刺,或者条件在时钟边沿变化,导致次态判断不准。

    我的经验是,所有状态转移条件尽量用寄存器打一拍,确保同步。比如外部输入信号,先经过同步器再给状态机用。还有,状态机本身的状态输出如果作为条件,也要注意时序,别组合逻辑环回。

    另外,仿真很重要。写个 testbench,覆盖所有状态路径,特别是边界条件。有时候卡死是因为某个罕见输入组合没处理,仿真跑久一点能发现。

    5小时前
  • FPGA入门生

    FPGA入门生

    状态机卡死、重复进入,多半是状态转移条件没覆盖全,或者条件有重叠。我一般用三段式状态机,就是分开写状态寄存、次态逻辑和输出逻辑。这样代码清晰,综合器也好优化。

    具体步骤:第一段用同步 always 块,只做状态寄存,就是 always @(posedge clk) current_state <= next_state。第二段用组合逻辑 always 块,根据 current_state 和输入条件,用 case 语句给 next_state 赋值,这里一定记得写 default 分支,防止锁死。第三段输出逻辑,可以用组合逻辑,也可以用时序逻辑,看需求。

    注意:组合逻辑部分要避免 latch,所有条件分支都赋值。还有,状态编码用 parameter 定义,别直接用数字,可读性好。

    5小时前
我要回答answer.notCanPublish
回答被采纳奖励100个积分
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
请先登录