lcytms
发表于 2017-4-18 16:49:56
1037
所以说对于两段式的描述,最正确也最精简的方法,就是CS<=NS;。
把NS赋给它。
现在国内有些出版物上,我们不能一概而论地持批判态度,但是这一点是肯定的,理论模型就是这么做的,就是得到这个寄存器。
如果这个时候大家用复位信号、控制信号,它就不是状态机了,它不是状态机的理论模型了。
1/2多写一个信号都是画蛇添足,就是CS<=NS;即可。
然后呢,2/2。
2/2是ON,是一个开节点,开节点我们怎么描述?
开节点这个时候描述是谁就是谁,正所谓种瓜得瓜种豆得豆。
因为这个时候,你描述的是什么,就是什么。
意味着它的输出没有被加工,没有被加工成一个寄存器。
lcytms
发表于 2017-4-18 17:10:26
1038
那么我们写完,就描述ST。
ST,需要两个信号,一个是CS的信号,一个是现场的输入信号。
这两个信号都会出现在ST的赋值号的右侧,或者是if、case的括弧里面。
然后,ST的输出是什么?
是NS。
你描述的是ST,因为它是一个ON,它不会加工输出的信号。
这个ST,NS出现在赋值号的左侧的这个时候,EDA不会加工NS,不会为NS生成寄存器。
也就是说,你描述的是什么就是什么,所以说ST就直接输出了。
赋值号的左侧,就是这一段电路模型的输出。
lcytms
发表于 2017-4-18 17:13:35
1039
然后我们还需要在这段代码块里面,描述摩尔和米利。
刚刚我举例子的时候,我忘了描述米利,一段式的时候,摩尔的时候,我只引用了CS,米利的时候一段式大家自己去想。
同一个代码块里面还有输入信号,ST的部分有输入信号,直接引用。
现在我们描述摩尔。
摩尔要什么?
摩尔只要CS,CS这有,输入的部分有,CS是它的输入的端口嘛。
直接引用即可。
我们看摩尔输出什么?
状态机的输出,种瓜得瓜种豆得豆,未被加工的输出信号。
lcytms
发表于 2017-4-18 17:25:43
1040
这是摩尔。
如果是米利,这个输入信号正好也有,这个代码模块的输入端口上面也有,直接引用即可。
这就得到了2/2的模块。
这是第二个always语句块。
第一个always语句块是闭节点,第二个always语句块是开节点。
所以说这个模型,无论是米利还是摩尔,我们看得到它的输出都未被加工。
它是一个ON的输出。
两段式的模型,代码模型的关系,理论上是这么说的,是一个充分必要的理论模型。
就是,两段式的代码模型,是一个充要的一个模型。也就是说,理论模型有的,它有,理论模型没有,它没有。
lcytms
发表于 2017-4-18 20:52:08
本帖最后由 lcytms 于 2017-4-19 13:59 编辑
1041
所以说理论模型在两段式的描述里面,一个不多一个不少。
而这个理论模型呢,它是得到数学证明的。
很多时候,我们需要用这种两段式的模型,来得到工具的支持。
所以说早期的EDA的工具,Quartus的优化工具,它只强调一点,你必须写成两段,如果你没有写成两段,它支持不了。
它识别不到,识别不出这个模型来。
现在的高端应用也是这么说,就是说如果我们要做一个高速大规模比较复杂的系统,那么一定是非两段莫属。
一定用两段来写,所以两段是一个最优秀的东西,可以这么说。
因为它是一个充分必要的理论嘛。
两段是一个非常优秀的一个模型,但是不排除这一点,它并不是一个很轻松、很容易实现的模型。
两段式的建模是比较复杂的,因为它的输出是ON,开节点,或者说是电平敏感的输出。
lcytms
发表于 2017-4-18 21:01:58
1042
粗犷一点,是组合逻辑的输出。
对它的处理要特别地关注,要有一些特别的支持和手段。
所以两段式的模型通常都是用于高速有经验的设计者,高速复杂逻辑。
在两段式的模型里面,也有一样事情,在现在的编译器里面,是要关注的。
就是它的1/2部分只写一个转移,只写一个何时转移的部分,就是转移寄存器。
然后在2/2的部分呢,同时写了转移逻辑和输出逻辑。
也就是转移逻辑和输出逻辑,是在同一个输出语句块里面写的。
这一点呢,对于程序员来讲,对于设计者而言,它是轻松的。
因为转移和输出放在同一处写,我们来非常简单地做它的对比。
lcytms
发表于 2017-4-18 21:22:16
1043
所以说这一点,跟一段式类似。
一段式也是写在一起。
但是两段呢,它会更精确一点。
输出是没有带寄存器的。
带寄存器,我们应用,简单的应用会方便一点,高端应用的会带一些缺陷。
所以说这样的话呢,两段式的输出会有一些特别的问题。
第一,会有一些复杂。有些轻量级的问题,用它解决也就过于复杂了。
其实呢,它的输出可能会带有毛刺,虽然它的末端可能会寄存器捕获,也就对它的输出的信号的的处理,要有特殊的手段。
因为它是摩尔和米利。
以后我们会看到,无论是做节拍、潜伏期分析,还是做时序分析,组合逻辑电平敏感的情况之下,都会变得异常的复杂。
怎么办呢?
历史上就有人提出来了三段的方案。
lcytms
发表于 2017-4-18 21:34:36
1044
也就是说在两段的基础上,我单独地把摩尔或者米利提出来,单独地为它写一个闭节点,生成一个寄存器,由此来弥补它的不足。
现在我们就来讨论三段。
这张图不需要了,就是转换的关系,理解了即可。
现在我们来看第四张图,就是三段式的图。
用三个always语句块来写这个模型,就是在两段的基础上,单独地把输出,米利和摩尔提出来。
原来的1/2现在变成1/3,就是原来的1/2,是闭节点。
输入是什么,输出是什么?
我们刚才看到两段式的模型里面,为什么要写CS和NS,current state和next state?
它不是看不见的,它明明白白就是两个信号。
lcytms
发表于 2017-4-18 21:49:53
1045
所以说一定要出来。
一段为什么只写一个state呢?
因为NS是看不到的,RTL这一级是看不到的,所以说只写一个state。
所以说这边的输入应该是NS,这边的输出仍然是CS,就是原来的1/2。
2/3就是原来的2/2,是一个ON。
输入分别是CS和现场。
输出在三段式的里面,只留下一个NS。
刚刚2/2里面输出既有NS,还有状态机的输出。
状态机的输出提出来,不在这输出。
lcytms
发表于 2017-4-18 21:52:12
1046
所以说这个always语句块里面一个信号都不会出现在,状态机的输出信号一个信号都不会出现在这个always语句块的赋值号的左侧。
3/3,是一个闭节点,我们有意把3/3写成一个闭节点,原来2/2的米利摩尔的部分单独拿出来。
它的输入一模一样,跟原来的2/2,因为它是从2/2提出来的,仍然也是CS和现场,输出状态机的输出。
这张图是我们今天要说的第四张图,就这四张图。
这四张图要背下来。
这个状态机基本上就拿下。