搜索
bottom↓
回复: 12

CPLD软件仿真有异常,求助大家

[复制链接]

出0入57汤圆

发表于 2012-8-8 10:00:19 | 显示全部楼层 |阅读模式
在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不变。请问这是怎么回事?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-8 10:29:26 | 显示全部楼层
你把if(new_count>=1200)new_ount<=1200;放到if(!..)......;前面试试!

出0入57汤圆

 楼主| 发表于 2012-8-8 10:37:40 | 显示全部楼层
谢谢楼上的提示!
这个办法确实有效!现在程序仿真正常了。
但我搞不懂,出现这样现象是什么原因?

出0入0汤圆

发表于 2012-8-8 10:50:31 | 显示全部楼层
同时符合条件时产生的竞争,你将if(new_count>=1200)改成else if(new_count>=1200)也会正常的

出0入0汤圆

发表于 2012-8-8 10:57:28 | 显示全部楼层
顶LS 不过在实际硬件上会好一点 仿真是没法做到并行的 都是顺序操作的

出0入57汤圆

 楼主| 发表于 2012-8-8 10:59:25 | 显示全部楼层
本帖最后由 mrf245 于 2012-8-8 11:03 编辑

再次感谢大家回复。
现在情况是一个产品的CPLD工作不稳定,目前检查就发现是这个部分造成的。
由于以前没怎么接触过CPLD,所以不太明白:
1楼的代码,有两个if条件判断语句,如果发生竞争时,就只执行后面那个if判断吗?

出0入0汤圆

发表于 2012-8-8 11:00:53 | 显示全部楼层
4楼说的对,楼主刚学吧!

出0入57汤圆

 楼主| 发表于 2012-8-8 11:04:55 | 显示全部楼层
sunshinecoast 发表于 2012-8-8 11:00
4楼说的对,楼主刚学吧!

刚开始在工作中接触。
看了下教材,如果我没搞错,那两个if语句执行顺序是不可预测的?

出0入0汤圆

发表于 2012-8-8 11:06:24 | 显示全部楼层
把<=全换成=应该也没有问题吧
lz的主要问题是阻塞和非阻塞的问题
估计是以前写C语言现在还没转过劲来

出0入0汤圆

发表于 2012-8-8 11:31:44 | 显示全部楼层
korgo 发表于 2012-8-8 11:06

顶楼上。。。。。

出0入57汤圆

 楼主| 发表于 2012-8-9 11:38:44 | 显示全部楼层
小弟就来刨根问底一次。。望大侠们指教:
最开始那段语句是在always循环语句里面的一段。
请问造成一开始那个问题的根本原因是什么?两个if同时检测呢,还是两个赋值语句发生冲突?或者其他原因?

出0入0汤圆

发表于 2012-8-9 12:50:57 | 显示全部楼层
本帖最后由 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 到底是多少呢?

出0入57汤圆

 楼主| 发表于 2012-8-9 13:18:17 | 显示全部楼层
原始完整代码是这样:

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教程里说是顺序执行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表