网站重新上线,多谢朋友们的关心
Jan 16
网上看到一篇关于Finite State Machine (FSM) - 有限状态机的文章《有限状态机的VHDL优化设计》,写得挺详细,有些感想和经验记录于此:

1. 关于使用的语言 - VHDL和Verilog大同小异,想法是一样的,万变不离其宗。

2. 模板 - 大家都会讨论是一段两端还是三段。争执在两端和三段的情况时有发生。其实只要综合器能综合出设计者期望的电路,怎么写都无所谓。代码是给人看的,如果能让别人更容易读懂,就是好代码。我偏好两段,因为这样在察看代码时能一眼看出某一个state的跳出条件和输出信号。如果状态机的状态数很多,需要上下翻阅才能分别得知跳出条件和输出信号,真是太麻烦了。

3. 结构 - 当前状态用时钟驱动,next_state由组合逻辑生成,这些都是固定的。唯一可能有争议的是输出信号需不需要加寄存器打一拍?
点击在新窗口中浏览此图片

不加寄存器的输出


点击在新窗口中浏览此图片

输出由寄存器驱动



一般来说,如果是模块的输出,我会用寄存器打一拍,保证模块所有输出都由寄存器驱动(因为无法预测负载要经过多少级LUT才能到达下一级寄存器)。这样一来有个坏处:某个状态的输出信号要到下一个时钟才有效,而不是和state一起变化。在某些设计中这个限制会导致一些问题。因此如果是本模块自己使用的信号,我就不用寄存器打一拍了,只要布局布线后能满足Period约束就可以。

4. 状态转换输出 - 对于输出信号的赋值,通常会有两种状况:某个state时需要保持的输出;状态跳转的时候需要一个脉冲的输出。对于第二种输出要求,可以把输出信号写在状态跳转条件的if语句中。

5. 我的模板
Tags: , ,
Jul 18
[UPDATE@2009.03.18]
谢谢HJU的留言,让我再记起这篇文章。
由于这是很早的时候写的,重新看一遍感觉我原来的理解应该还是有些问题的。
原始出错的工程已经找不到了,暂时没办法再去探究原来出错的原因到底是什么。
最近写的《有限状态机编写》一文有更多的理解,我也会再根据各位同学的留言来更新那篇文章。
这篇文章就不要参考了,下月会将它下架:)


背景:在做Blackjack Project时,做到FSM模块,由于涉及到的usersum和robotsum两个(时序的状态转换,组合的状态译码和组合的输出译码)时, usersum和robotsum形成Latch。并且map report中也显示生成门控时钟。宏观上,整个设计下载到试验板上状态机运行不正确。
Tags: ,
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]