关于使用FPGA三段式状态机的三点好处,你有什么看法?.doc
《关于使用FPGA三段式状态机的三点好处,你有什么看法?.doc》由会员分享,可在线阅读,更多相关《关于使用FPGA三段式状态机的三点好处,你有什么看法?.doc(9页珍藏版)》请在三一文库上搜索。
1、关于使用FPGA三段式状态机的三点好处,你有什么看法?用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点:1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护;2.更符合设计的思维习惯;3.代码少,比一段式状态机更简洁。对于第一点,我非常认可,后两点在Clifford E. Cummings著的(Synthesizable Finite State Machine Design Techniques Using theNew SystemVerilog 3.0 Enhancements和The Fundamentals ofEfficient Synthesiz
2、able Finite State Machine Design using NC-Verilog andBuildGates)中多次提到,我并不完全赞同,下面谈谈我的一些看法。先谈谈第二点关于思维习惯。我发现有些人会有这样一种习惯,先用一段式状态机实现功能,仿真ok后,再将其转成三段式,他们对这种开发方式的解释是一段式更直观,可以更便捷的构建功能框架,但是大家都说三段式性能会更好,所以最后又在搭好的逻辑框架下,将一段式转化为了三段式。这从一个侧面说明了,对一部人来说一段式更符合他们的思维习惯,但当已经习惯了一段式的思维方式后,再要换用三段式时,可就不这么容易了,一段式和三段式的写法之间存在着
3、思维陷阱,特权同学也曾经不小心在此失足过。举一个例子,初始状态是wr_st,q和p输出都为0,当计数器count计数到指定的数值10后,输出结束信号end,状态机接收到end有效后跳转为 rd_st,同时输出q变为1,在rd_st状态,如jump有效则跳转到erase_st,如end有效p输出0否则输出1,用一段式实现起来很简单,如下所示。assign end = (count = 10);always (posedge clk)begincase(state)wr_st: if(end) beginq = 1;state= rd_st;endelse beginq = 0;state= wr
4、_st;endrd_st: if(jump) beginp =1;state= erase_st;endelseif(end) beginp = 0;state= rd_st;endelse beginp = 1;state= rd_st;end。.endcaseend状态机一输出波形如下所示。换用三段式描述时,有些人会写成这样。always (posedge clk or negedge rst)beginif(!rst) state = wr_st;else state =nextstate;endalways (*)begincase(state)wr_st: if(end) nexts
5、tate = rd_st;else nextstate = wr_st;rd_st: if(jump) nextstate = erase_stelse nextstate = rd_st;。.endendcasealways (posedge clk)begincase(nextstate)wr_st: if(end) q = 1;else q= 0;rd_st: if(end) p = 0;else p = 1;。.endcaseend状态机二看似代码好像没有什么问题,但从输出波形可以看出,q没有正确输出。上图中状态转移正确,但是q输出错误,nextstate由组合逻辑输出,当end有效后
6、,nextstate立刻变为rd_st,导致A时刻q没有变化,在将一段式改为三段式的过程中,我们仍保留了一段式的思维习惯,想当然的利用了end信号去控制状态跳转,同时又控制了q的输出,这种思维误区由以下两点对三段式状态机的认知缺陷构成。1.书本网上大部分状态机例程的第三段都是基于nextstate输出的,很少看到有基于state输出的,这就形成了一种思维定势,认为三段式的第三段只能基于nextstate描述。2.当三段式状态机的输出基于nextstate描述时,无法用同一个输入信号即触发当前状态跳转,又控制当前状态输出正确逻辑,上述例子中A时刻q的错误输出印证了这一点,end可以触发状态从wr
7、_st跳转到rd_st,但无法同时让q输出1。有两种解决办法。第一种解决办法是增加状态,将wr_st拆分为wr_st0和wr_st1两个状态,end信号只控制状态跳转,q的输出跟随wr_st0和wr_st1变化,第一段不变,如下所示always (*)begincase(state)wr_st0: if(end) nextstate = wr_st1;else nextstate = wr_st0;wr_st1: nextstate= rd_st;rd_st: if(jump) nextstate = erase_st;else nextstate = rd_st;。.endendcaseal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 使用 FPGA 三段式 状态机 好处 什么 看法
链接地址:https://www.31doc.com/p-3387995.html