UFO 发表于 2010-6-26 01:42:50

如何猜分状态机

本帖最后由 fpgaw 于 2010-11-18 16:01 编辑

写状态机的时候,典型的写法是 case ( state ) ... next_state = .. . always @ ( clk )state = next_state ; 那么在什么情况下,可以使得状态机的速度更快呢,有人提出猜分状态机,用流水链式处理代替。那样可以能够分解状态机,提供时钟频率。谁能提供一个例子说明一下问题。希望能通过这个问题,把状态机的一些相关问题理解清楚。

HDL 发表于 2010-6-26 02:56:07

<br>
我写过的状态机在系统中一直都是逻辑相对简单,延迟比较短的部分了,<br>
还从来没有成为关键路径。<br>
如果觉得状态机太复杂了,我倒是常常采用一个中心状态机控制几个<br>
从控状态机的办法,这样开发速度快,电路也更简单。流水线状态机<br>
没有听说过。<br>

ngtim 发表于 2010-6-26 04:05:50

与liuth同感。

inter 发表于 2010-6-26 05:02:30

"一个中心状态机控制几个从状态机"该怎样理解呢?<br>
可以解释一下吗,谢谢!

interige 发表于 2010-6-26 06:41:19

是啊,愿闻其详

CHA 发表于 2010-6-26 08:23:04

举个例子,假如设计一个使用FFT计算的IMDCT。<br>
IMDCT包括几个步骤:<br>
1.cross<br>
2.rotate<br>
3.fft<br>
4.bit reverse<br>
4.除以N<br>
5.rotate<br>
电路公用一个buffer_ram。<br>
以上步骤有一定的顺序,需要对公用的buffer_ram进行读写,<br>
还有乘法器、加法器进行控制,不同的步骤不一样。<br>
如果设计一个大的状态机控制整个流程,哇!那这个状态机<br>
有好多状态,每个状态要负责的任务很多很复杂。<br>
于是,我们可以为以上每个功能设计一个状态机,它们负责<br>
产生自己的读写信号和其他控制信号。然后再设计一个中心<br>
控制器,这个控制器规划了整个流程,它负责启动其中一个<br>
子状态机,并且从各个状态机产生的控制信号中挑选出激活<br>
的子状态机产生的信号,让这些信号去控制buffer_ram和<br>
运算单元,而且负责data path的正确连接,这样设计就简<br>
单多了。<br>
比如轮到fft这个步骤的时候,由fft控制单元产生的读写信号<br>
和加法、乘法单元的控制信号就被连接到buffer_ram和运算单元<br>
上,其他控制单元的类似信号就不起作用,相当于只有fft控制<br>
单元在工作,其他控制单元被闲置了。等fft单元工作完毕后,<br>
中央控制单元再把数据总线和控制总线的权利交给bit reverse<br>
控制单元。如此循环。<br>

AAT 发表于 2010-6-26 09:30:48

画个示意图。

CCIE 发表于 2010-6-26 10:34:35

thanks liuth . 按照我的理解,子状态机主要是为了两个目的:简化单一状态机,逻辑结构清晰,易理解和维护。猜分状态机可以避免状态机成为关键路径。<br>
那么既然状态机容易描述逻辑功能,那么我们是否在RTL级设计的时候尽量使用状态机呢。这里怎么取舍呢。

VVC 发表于 2010-6-26 11:47:46

我想,是否尽量使用状态机,这个跟各人的风格有关吧,<br>
不过状态机的确是非常重要,而且经常用到的。

FFT 发表于 2010-6-26 12:22:25

当系统时钟太快时,会使状态机出现非法状态,这也是一个问题啊.
页: [1] 2
查看完整版本: 如何猜分状态机