首先回答一下:
1)stateCAD没有用过,不过我感觉用这个东东在构建大的系统的时候似乎不是很方便。也许用system C或者system Verilog更好一些。
2)同步、异步的叫法是我所在公司的习惯叫法,不太对,不过已经习惯了,呵呵。
这次讲一下latch。
latch的危害已经说过了,这里不再多说,关键讲一下如何避免。
1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。
always @( * ) begin
if ( sig_a == 1'b1 ) sig_b = sig_c;
end
这个是绝对会产生latch的。
正确的应该是
always @( * ) begin
if ( sig_a == 1'b1 ) sig_b = sig_c;
else sig_b = sig_d;
end
另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。
always @( * ) begin
if ( rst == 1'b1 ) counter = 32'h00000000;
else counter = counter + 1;
end
但如果是时序逻辑进程,则不存在该问题。
2)case语句的default一定不能少!
原因和if语句相同,这里不再多说了。
需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。
3)组合逻辑进程敏感变量不能少也不能多。
这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。
顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。
到年底了,工作越来越紧了,可能后续的日志写作时间会不规律且长度不定,请大家谅解啊!
另外,有空请各位多推荐推荐,拜谢!
我希望能通过这个blog结交更多的FPGA设计爱好者,共同提高,共同进步。
用户208385 2006-12-20 19:02
我用的就是简单的分频,和一些可控的PWM输出。但是也会莫名其妙的产生结果与预期逻辑不符合的情况。我在分频的时候经常会用到COUNT=COUNT+1的情况,这会有什么危害吗?如果不用这样的逻辑,应该如何替换?
希望多更新,我会支持。
用户61970 2006-11-28 22:10
to riple:
再补充一下,双进程FSM的组合逻辑进程如果改成寄存器输出,实际上就成了单进程FSM了,也失去了双进程FSM的所有好处了。