lcytms
发表于 2017-8-13 23:26:13
1202
我们知道3s3是闭节点,信号敏感表里面要出现时钟沿,并且不会引用它。
有且有一个沿信号没有被引用。
3s3也是用的原来2s2的代码。
我们看一下这张图,出现在输出的信号是什么?
就是outputs。
闭节点的输出。
包不包含next_state呢?
肯定没有。
所以说这一次,正好把next_state删掉,只留下输出。
所以说这一段,输出和转移逻辑是分开来写的。
lcytms
发表于 2017-8-13 23:28:05
1203
就这样,这样3s3就形成了。
我们看到count迭代的关系,它会出现在左右两侧,但是这一次是一个闭节点。
闭节点用寄存器隔离了。
所以说它不会直接反馈过来。
所以说闭节点的迭代是允许的。
这就得到了3s3的动作。
现在我们修改完了三段式的代码。
Ctrl+S、Ctrl+K。
我们同样做验证,三段式的验证。
新建divider_fsm3s_mealy_tb.v文件。
从一段式里面粘贴过来。
lcytms
发表于 2017-8-13 23:29:25
1204
只是换个名字而已嘛。
做仿真设置。
做一个跨平台检查。
查看仿真结果。
lcytms
发表于 2017-8-13 23:31:32
1205
高7低5。
就证明这张图我们分析是合理的。
这张图的一段和三段是闭节点的输出。
ON不可以,但是ON,两段式又是一种应用的模型,我们现在如何来处理它呢?
还有几分钟时间,做不完,我下午会接着做。
我们现在就做一个米利两段的模型。
这个模型呢,就首先要避免一件事情,因为ON要管理,用两段式来做状态机的话,就不可避免对计数器的管理。
我们一定要计数,这是第一件事。
因为只有计数了,我们才知道高电平的宽度和低电平的宽度,计数器是肯定要的。
这是第一件事。
lcytms
发表于 2017-8-13 23:32:19
1206
第二件事,就是这个计数器如果是内置的,必定要出现count=count+1,count必定会出现在赋值号的两侧。
可是出现在赋值号的两侧,就必定会迭代。
因此上必定会有迭代的问题,对计数器的管理的问题。
另外呢,也一定要有计数器,怎么做呢?
在两段式的模型下面,如果我们改成两段,那么所采用的方案,就不能采用count=count+1的处理的方式。
必须用控制信号来管理一个外置的计数器。
我们不能做count=count+1,而是用一个cnt_en,count enable来指挥一个count。
这个呢,我们把它稍微修改一下。
lcytms
发表于 2017-8-13 23:33:13
1207
这个呢改成两段式来实现的。
内置的count在它内部肯定是行不通的,因为内置就必定会出现count=count+1,这让它输出一个控制信号,叫cnt_en,en就是enable,让它指挥一个闭节点的count。
这是外置的一个count。
闭节点的。
闭节点的count呢,会输出对应的cnt的信号。
这个cnt的信号,我们仍然做成31:0,这个信号,我们在我们的代码里面把它反馈给状态机。
这个呢,对我们这个两段式的状态机,将会避免使用count=count+1,对它只需要驱动cnt_en这根信号,读到的却是count。
当cnt_en为低电平的时候,为假值的时候,就清零,为真值的时候就计数。
lcytms
发表于 2017-8-13 23:34:16
本帖最后由 lcytms 于 2017-8-13 23:35 编辑
1208
所以说这个count是很清楚的。
当cnt_en为假值的时候,为0的时候,count清零。
cnt_en为1的时候,时钟上升沿下面计数,现在我们来写它的状态转移图。
并且这段状态转移图呢,我们用NBD,古老的形式来写。
复位,同样来讨论。
在复位的时候,我们让输出为低电平。
这一点照写。
在复位的时候,原本我们是内置的计数器,让count清零,现在我们只需要做cnt_en清零。
当cnt_en为假值的时候,count就清零。
然后指向第一个状态s0。
lcytms
发表于 2017-8-13 23:36:59
1209
在s0这个状态的时候,原本我们有一段EBD。
是描述在这个上面等低电平的状态,低电平的状态呢,我们现在是由外置的计数器来发出。
也就是说,在s0上面,我们写它的NBD,因为这个cnt_en为0嘛,清零了,现在数低电平的周期,必定要让cnt_en为高电平。
当它为真时,count才计数。
这个时候写成一个NBD的形式。
分子是s0,分母是在这个节点上面驱动,转移还是要。
写NBD的驱动的时候,转移仍然是根据输入的条件做动作的。
这个时候呢,我们要做一件事情。
就是这个时候,有一个外置的计数器控制的时候,我们就不是减一了,而是减二,因为我们状态也会延伸出一拍。
lcytms
发表于 2017-8-13 23:38:15
1210
所以说这个时候,我们写它的EBD,如果这个EBD分子照写,这个时候呢,因为count是引入的信号,可以直接引用它。
Cnt原本是<LW-1,现在我们要增加一个状态,所以说要减二。
下面增加一个状态来控制它。
分母有没有呢,如果写了分母呢,就不是摩尔啦,就是米利了。
所以说在这个时候,输入只跟转移有关,输入跟输出无关,是摩尔。
这个时候,分母是无驱动的。
就省略分数线。
lcytms
发表于 2017-8-13 23:39:25
1211
然后在s0上面,在cnt_en打开的情况之下,数cnt为=的时候,相对条件,指向下一个状态,指向s1。
S1这个锋的条件是相对的条件,一定是≥LW-2,并且也是无驱动,条件完全相对,可以完全不写,显得简洁。
这个锋,不用做任何描述。
所以我们看见没有描述的锋,除了置位的锋,其它的锋没有写,就是全相对,无驱动。
然后在s1上做什么?
s1我们会增加一个状态,以后我们会说到为什么要增加一个状态。