- 论坛徽章:
- 3
|
第一个进程比较容易理解,第三个进程也很容易理解.
关键在于第二个进程
网上有很多的说法,比如有的说,这样的三段式写法性能上会好,但会使用更多的触发器,这是一种误解,因为它并不会导致使用更多的触发器.
这就涉及到编译(并非综合)是如何进行的,第二个进程的敏感表中有太多的值,那么把它综合成一个时序电路显然是不显示的,于是编译器会往组合电路的方向去想.
但如果要正确编译为组合逻辑,首先,必须所有的输入都在敏感表中,这是最基本的要求.
其次,任何情况下都必须有输出,else后面悬挂的部分不写的话,逻辑是有问题的,原因就在于这是组合电路,不是时序电路.
always@(S2,S,stat)
case(stat)
0:if(S&!S2)nx_stat<=1;else nx_stat<=stat;
1:if(S&!S2)nx_stat<=2;else nx_stat<=stat;
2:if(S&!S2)nx_stat<=3;else nx_stat<=stat;
3:if(S&!S2)nx_stat<=0;else nx_stat<=stat;
endcase
网上有人说,这一段的逻辑应该用=,而不应该用<=
一个是阻塞赋值,一个是非阻塞.
这又是一个误解,无所谓的.
我发这个帖子的关键之处,是要说明为什么写三段式,这里误解就更多了.
和一段式一样,三段式只是一种RTL的写法,两种本质并无区别.
但是,三段式的写法逻辑和组合分开,这样做至少人看着会舒服很多,编译器也会舒服.
人看着舒服,修改起来就方便一些. |
|