lcytms
发表于 2017-6-10 23:23:25
1031
这个带来了一个问题。
据说米德体系下面早期是用时标来做。
1ns,1ms,1ps,用时标来做。
这个时候时标由设计者来决定。
可是时标选大了不合适,选小了CPU的开销非常大,这个CPU每时每刻都要来处理这段行为。
所以在米德体系下面就想了一个办法,仅仅在需要的时候,仅仅由设计者来决定,需要的时候,非综合目的,让它来执行它。
所以说列出来@信号敏感表,在信号敏感表里面的信号发生变更的时候,非综合目的才来处理它。
这个时候,CPU的开销就很小了。
就是信号敏感表里面的信号发生变更的时候。
所以说在VHDL,严谨的EDA的体系下面,信号敏感表是和综合无关的。
lcytms
发表于 2017-6-10 23:24:43
1032
Moorby的体系一开始也是这么做的,也发现了同样的问题。
所以说Moorby也加上去了,但是呢,他的团队又没有完全注意到以前的米德的思想,就是综合跟信号敏感表无关。
它有关了。
它是怎么做的呢?
它是把信号敏感表里面列出了沿敏感信号,如果信号敏感表里面列出了有且有一个沿敏感信号。
这个叫什么名字不重要,重要的是它没有出现在begin块里面。
有且有一个沿敏感信号未被引用,它说这个时候综合器才真正地会综合出一个寄存器来。
我们把它的begin块里面全部写成FA。
被引用的是输入,被驱动的是输出。
那么你写FA,综合就会得到FA。
FA被引用的是输入,被驱动的是输出。
lcytms
发表于 2017-6-10 23:26:09
1033
如果信号敏感表里面,有且有一个沿敏感信号未被引用。
有两个未被引用不是,是跨时钟域。
没有沿敏感信号不是,是电平敏感。
有且有一个未被引用,那么Moorby他会送你一个寄存器。
他是这么做的。送一个寄存器。
你在这个FA里面,凡是在FA里面的输出信号,都会被这个寄存器捕获了以后,用这个时钟,唯一的一个未被引用的沿敏感信号,用它驱动。
所以说呢,这个就是CSS讨论,这样写代码,就一定会综合出这个结构,他一定会送你一个寄存器。
并且我们称之为开节点。
开节点、闭节点是同步电路的范畴。
在这里面作为它的基础,我们已经做过介绍。
lcytms
发表于 2017-6-10 23:27:42
1034
那么这样的话呢,用一个always语句块,写这个架构,称之为一段式。
两个,两段式。
三个,三段式。
然后呢,我们来看,写代码的时候,这段代码里面,被引用的信号是输入,被驱动的信号是输出。
称之为它的代码模型。
这是它的理论模型。
然后我们看它的一段式的代码模型。
代码里面,被引用的是输入,被驱动的是输出。
那么我们称之为闭节点。
一段的代码模型。就是用一个always语句块来写。
Begin块里面,哪些信号被引用了?
哪些信号被驱动了?
被引用的信号应该出现在赋值号的右侧,if、case的括弧里面。
被驱动的信号应该出现在赋值号的左侧。
如果是沿敏感,这个应该是非阻塞。
我们现在至芯的教学一直沿用的是经典的,好,它应该是怎样的代码模型。
lcytms
发表于 2017-6-10 23:29:17
1035
在一段里面,那个state,既会被引用,又会被驱动,是不是?
我们只需要声明一个state,因为那个NS看不到的。
就一个CS。
这个之间的装配关系我就不做复习了。
我就把代码模型写一下。
NS没有,就一个CS。
既然是CS,我们就称之为state。
所以说一段式的时候,我们总是写state。
这个state呢,我们写在代码里面,我们会写成case (state),这个state是被引用的。
然后呢,我们会驱动它,在哪个状态下面,state被转到什么地方?
所以state又是输出。
对于它而言,就是它的两个端口,一个是state的输入端口,是出现在case语句里面。
lcytms
发表于 2017-6-10 23:30:42
1036
一个是它的输出端口。
输入被引用,输出被驱动。
是它的两个端口,只不过同名而已。
同名就意味着什么呢?
在这个代码块所处的上层,是同一个信号,形成迭代。
由于是闭节点,允许迭代。
所以说,state,一段式,它一定是它的两个端口。
一个是被引用的输入端口,一个是被驱动的输出端口。
然后呢就是状态机的信号,状态机给出的输入信号。
状态机给出的输出信号。
这两个信号之间也允许迭代。
一个经典的例子就是那个cnt。
lcytms
发表于 2017-6-10 23:33:26
1037
Cnt,既引用了它,又驱动了它。
复位的时候,我们会让cnt=0,然后呢,我们可能会写成cnt=cnt+1这种形式,既出现在赋值号的左侧,是被驱动的信号。
又出现在赋值号的右侧,是输入信号。
所以说,它有可能会形成迭代,是允许的。
某些信号是允许迭代的。
因为它是闭节点,这个呢,就是一段的代码模型,这个我们应该很熟悉了。
我们至芯的课程,我们一直强调,我们三段都能够非常自由地转换了。
lcytms
发表于 2017-6-10 23:34:44
1038
你能写一段,你就能写两段,就能写三段。
应该很容易的。
这是一段。
两段是用两个always语句块来写。
两个always语句块的代码模型,第一段是一个闭节点,打两撇我们表示闭节点,这是状态机的两段的第一段。
我注意到国内有一些EDA的工程师,对基础的理论引进的不够,或者是他们的阅读量不够,一段的写法,有各种写法。
我们至芯的同学写的比较规范,跟国际比较接轨。
如果你不知道这个模型,你就会在一段里面还写复位,还写控制。
lcytms
发表于 2017-6-10 23:36:15
1039
它一段的模型就是这样。
输入的是NS,输出的是CS。
它没有别的信号。
在这个循环行为体里面,只有一个NS是输入,只有一个CS是输出。
在这个begin end块里面,只有一个信号被驱动了,就是CS。
它写的就是这个模型的寄存器。
如果你用其它的方式写,你就得不到这个模型了。
没有这个模型,就得不到状态机的性能支持了。
那就不是状态机了,可以说。
然后是第二段,第二段是开节点。
开节点输入CS,输出NS。
lcytms
发表于 2017-6-10 23:37:27
1040
然后是现场的输入,现场的输出。
引用的是输入,驱动的是输出。
当做两段的时候,是把这个部分,REG放进来,然后呢,写它的描述的时候呢,是用开节点写。
开节点就是种瓜得瓜种豆得豆。
当然会写ST,放到上面,把摩尔或者米利放到上面。
那么就会得到对应的结构。
这个是开节点的输出,所以说呢,开节点的输出是一个完备的、充分必要的理论级的模型。
就是理论级模型里面的框架、部件,它一个不多一个不少。
但是一段、三段,都会多出一个输出寄存器,在米粒和摩尔后面多出一个输出寄存器。