我用的CPLD,里面有4路的相同模块,每个模块有一个状态机,开始我用的一段式状态机,发现资源不够,进行了各种优化后,还是不够,于是我抱着试试看的态度将1段式状态机改为三段式,发现资源够用了,一共降低了大约7%,从理论上来讲,为什么3段状态机比一段状态机节省资源???
应该是代码综合成其它浪费逻辑的东西
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
从理论上来说,三段式状态机综合出来的电路确实要比一段式更费逻辑,但是也不是绝对的,可能某些特殊的结构,三段式反而综合了电路更加简洁。具体的,如果你愿意,可以把两种形式的代码发上来我们一起分析。
其实那三段式的问题我也支持分开写省资源。而且我觉得还有办法进一步省资源。方法是状态机用卡诺图化简的方法手工变为组合逻辑,使整个代码风格越“硬件”化。 因为我以前仔细比对过可综合的verilog生成的具体电路。原理很简单:都写在一个always块中的状态机由于变量太多,综合时会很复杂。情况更容易定义不全。比如编译器经常会报“生成潜在锁存器”的情况。总而言之,这种代码风格会对编译器编译、编译、综合、布线带来难度。进而增加资源占用率。
分多个always写结构更清晰。写的时候按照电路的样子一块一块写。编译器一下子就可以理解。因为每个always块都是最基本的结构。这样减少了复杂的交错结构。资源使用量自然不增反减。
总结一下:行为级的描述方法更接近c语言,代码简单。但如果以写“软件”的思路写虽然功能能实现,可如果要节省资源就很难做到了。
结构化的描述更接近硬件本身,按照一块一块电路的模式去写,虽然代码会长一些,但是综合起来绝对省资源。
Best,
Jack