lcytms
发表于 2017-4-17 22:00:11
1009
虽然输入和输出可能是相同的信号,可能会形成迭代,允许形成迭代。
除了这个之外,我们时钟忽略掉,有一件事是必须要说明的。
就是state。
我们在这只写成state,而没有写成CS,current state,这个state是迭代的,这张图上。
这个state信号既被引用了,也被驱动了。
被引用就说明它可能会出现在赋值号的右侧,可能会出现在if、case的括弧里面。
它被驱动了就说明它一定会出现在赋值号的左侧。
右边这个称之为代码模型。
而我们的左图是称之为理论模型。
lcytms
发表于 2017-4-17 22:02:17
1010
理论模型如何变成代码模型的呢?
我们来看看之间的关系。
我们知道,我们在写这个循环行为体的时候,我们循环行为体的内部,我们用行为语句来描述。
如果是一段CN,描述的是什么,就是什么,它的输出,所有这段的输出,就会用一个寄存器来替代,用寄存器用时钟来驱动它。
好,我就用这种方法来描述。
对于这个逻辑而言,我们用一个语句块描述ST。
在语句块里面描述ST。
ST写出来,ST有输入,有输出。
ST的输入是理论模型的CS的输入。
lcytms
发表于 2017-4-17 22:03:26
1011
它的输出是NS,在代码里面描述ST的部分,就得到它。
但是由于我是做闭节点的描述CN,信号敏感表里面会出现一个沿信号,有且有一个未被引用。
它就会为所有的输出,当然现在是ST,为它生成一个寄存器,用所声明的时钟来驱动。
时钟我就不绘制了。
然后输出。
现在我们看到,如果用寄存器驱动了NS的输出,这个输出就是,在理论模型上,这个输出就是CS。
形成这个结构。
lcytms
发表于 2017-4-17 22:12:05
1012
当你描述ST,是闭节点的描述,就会生成这个寄存器。
也就是这个寄存器并不是你显式声明的,是用约定的方式在信号敏感表里面描述那个沿,你并没有描述它,但是EDA就会给你生成这个寄存器,verilog综合器就会给你生成它。
ST描述它,就会得到它。
这个呢,就形成我们的always的一段结构,always的一段语句块。
但是ST不够啊,光用ST,ST的部分除了CS的描述,还有现场的输入。
也就是说这个CS的信号和inputs的信号,我们都会出现在对应的always代码块的引用的部分,或者是赋值号的右侧,或者是if、case的括弧里面。
lcytms
发表于 2017-4-17 22:13:45
1013
这段代码综合的电路一定是这种形式。
CS和inputs一定是进入这个电路的,输入这个电路的。
现在我们再描述摩尔或者米利。
举个例子,如果我们描述摩尔,那么在这个代码块里面,摩尔需要什么呢?
需要CS。
CS在代码块里面已经有输入信号了,公共的CS的输入信号,从这接过来。
CS已经有了,直接装配即可。
lcytms
发表于 2017-4-17 22:34:48
1014
摩尔的输出,是状态机的输出。
但是当我们写闭节点的时候,摩尔的输出同样会生成一个寄存器。
这个时候,EDA无论你怎么写,所有的你写的begin块里面,就是always的begin块里面这些描述,输出的所有的输出都会生成寄存器。
所以说同样可以生成寄存器。
这是摩尔。
从摩尔机我们可以看得到什么呢?
lcytms
发表于 2017-4-17 22:54:04
1015
这种模型,这个代码块,我们称之为FSM_1S的模型。
它描述的这个电路,跟理论模型的这个电路呢,是有差别的,是不是?
虽然它把这个理论模型全部都写了,但是它多写了一样东西。
输出寄存器。
输出寄存器并不是理论模型必须的,所以说一段式并不是一个必须的模型。
虽然它是一个必要的模型,但是它不是一个必须的模型。
理论模型有的它有,但理论模型没有的它也有。
是这么个关系。
没有的是什么?
一个输出寄存器。
这个输出寄存器起个什么作用呢?
它的理论模型呢,它的米利、摩尔应该是电平敏感的输出。
粗犷一点讲,是组合逻辑的输出。组合逻辑的输出,就显然会有毛刺,冒险竞争这些问题。
重要的是,对一个电路,它的末端应该会有寄存器捕获吧,绝对不会允许毛刺、冒险竞争的存在。
lcytms
发表于 2017-4-17 23:05:43
本帖最后由 lcytms 于 2017-4-19 13:56 编辑
1016
并且呢,我们在分析的时候也会存在一些困难。
所以说对这个,用一段式的这种描述,如果它输出的部分本身就是一个同步电路,就已经屏蔽了毛刺,避免了冒险竞争,那么使得电路的处理呢,变得更简单。
那么这个时候呢,我们写一段式会更容易一些。
我们在写一段式代码里面,在一段式语句块里面,既写了状态的转移,也写了输出的逻辑,就是状态转移和输出逻辑是在同一个地点写的,同一个always语句块里面写的。
对于程序员而言,是比较轻松的,所以一段式呢,比较适合初学者,比较适合快速的实现。
以后我们的代码里面,尽量地用一段。
但是一段也有它的缺陷,缺陷就是什么呢?
这个时候,它并不是一个必要的理论结构模型,它多出了一个输出寄存器。
lcytms
发表于 2017-4-18 10:12:23
1017
这一点很重要,在高速电路里面,很可能它的末端要形成对应的时序延迟关系,尤其构成高速逻辑必须的一些细节,这一点一段式是做不到的,一段式他已经在内部做了。
我们在后续的时序分析的一些课程里面,一段式的一些高端应用这个过程之中呢,综合器它要仔细地分辨转移逻辑和输出逻辑。
需要综合器来分辨这一点,那么早期的综合器呢分辨是有差异的,会造成一些面积和速度的损失。
但是现在,现代的综合器做得越来越聪明,smart。
据说一段式的处理的方式,跟两段、三段几乎都没有区别。
所以说我们现在看到的文件里面,特别强调,避免写一段式。
一段式仍然是可用的,因为现在的编译器、仿真、EDA也足够聪明,能够分辨这两段逻辑。
lcytms
发表于 2017-4-18 10:25:58
1018
我们现在看见,在理论模型和代码模型的关系上面,装配上面,代码模型只有state,而没有next state,这是为什么?
因为只有CS的端口,NS的端口是内部的。
描述ST是在这个always语句的内部,门级结构的内部,门级网表上看得到它,所以说RTL这一级是看不到NS的,只有一个CS。
CS上层是形成闭环的,叫相同的名字。
所以说这样的话呢,在一段式的代码里面呢,只有一个CS,就不再需要特别强调它是current state,直接写state。
换了个名字,因为NS是看不到的。
页:
1
2
3
4
[5]
6
7
8
9
10
11
12
13
14