CPLD软件仿真有异常,求助大家
在Quartus2 8.0里写MAX2 CPLD代码,其中有一段如下图所示:工作原理很简单:如果HW_F8K为低电平,就把New_count的值清零。如果New_count的值大于1200则New_count自动保持为1200。
现在仿真情况是:
在New_count的值没有到达1200之前,将HW_F8K设低电平,New_count就能被清零并重新计数;如果在New_count值达到1200后,不管送多少个HW_F8K负脉冲,New_count一直保持1200不变。请问这是怎么回事? 你把if(new_count>=1200)new_ount<=1200;放到if(!..)......;前面试试! 谢谢楼上的提示!
这个办法确实有效!现在程序仿真正常了。
但我搞不懂,出现这样现象是什么原因? 同时符合条件时产生的竞争,你将if(new_count>=1200)改成else if(new_count>=1200)也会正常的 顶LS 不过在实际硬件上会好一点 仿真是没法做到并行的 都是顺序操作的{:lol:} 本帖最后由 mrf245 于 2012-8-8 11:03 编辑
再次感谢大家回复。
现在情况是一个产品的CPLD工作不稳定,目前检查就发现是这个部分造成的。
由于以前没怎么接触过CPLD,所以不太明白:
1楼的代码,有两个if条件判断语句,如果发生竞争时,就只执行后面那个if判断吗? 4楼说的对,楼主刚学吧! sunshinecoast 发表于 2012-8-8 11:00 static/image/common/back.gif
4楼说的对,楼主刚学吧!
刚开始在工作中接触。
看了下教材,如果我没搞错,那两个if语句执行顺序是不可预测的? 把<=全换成=应该也没有问题吧
lz的主要问题是阻塞和非阻塞的问题
估计是以前写C语言现在还没转过劲来 korgo 发表于 2012-8-8 11:06 static/image/common/back.gif
把
顶楼上。。。。。 小弟就来刨根问底一次。。望大侠们指教:
最开始那段语句是在always循环语句里面的一段。
请问造成一开始那个问题的根本原因是什么?两个if同时检测呢,还是两个赋值语句发生冲突?或者其他原因? 本帖最后由 cmdrainsy 于 2012-8-9 12:53 编辑
begin
if(!HW_F8K)
New_count <= 0;
else if (New_count >= 1200)
New_count <= 1200;
else
New_count <= New_count + 1;
end
这样写肯定没错
你那程序是并行的满足条件的时候 New_count 到底是多少呢? 原始完整代码是这样:
always @(negedge BP_LRST or posedge HW_C8M )
begin
if(!BP_LRST)
begin
New_count<=0;
end
else
begin
New_count<=New_count+1'b1;
if(!HW_F8K)//帧同步脉冲到来,计数器强制清零
New_count<=0;//have 2048 posedge HW_C8M
if(New_count>=1200)//no HW_F8K(at all times the HW_F8K is low level or the HW_F8K is high level)
New_count<=1200;
end
end
在always里面的语句的if语句也是并行执行的吗?VHDL教程里说是顺序执行。
页:
[1]