搜索
bottom↓
回复: 7

有关if语句嵌套时产生的逻辑问题!CPLD和单片机区别理解!

[复制链接]

出0入0汤圆

发表于 2010-10-13 09:21:31 | 显示全部楼层 |阅读模式
最近编写了一些程序,查出了一些问题,和大家分享下

输入脉冲信号ain,bin,低电平有效,在每个时钟检查电平并改变计数器的值,下列程序编译正常:
always@(negedge rst or posedge clk)  
begin  
  if(!rst)
    begin
      cnumber = 323;
    end
  
  else if(!ain)
     cnumber = cnumber+1;  
  else if(!bin)
     cnumber = cnumber-1;  
  else
     cnumber = cnumber;
end  


但是实验发现,如果在本程序里面少写两个else,编译时会产生两个error!
Verilog HDL Conditional Statement error at <location>: cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct

always@(negedge rst or posedge clk)  
begin  
  if(!rst)
    begin
      cnumber = 323;
    end
  
  if(!ain)                          //该句提示errror!
     cnumber = cnumber+1;  
  if(!bin)                          //该句提示errror!
     cnumber = cnumber-1;  
  else
     cnumber = cnumber;
end  



于是很纳闷啊!这样的句子在C语言中是不会有错的啊!我分析了一下流程图,如下

(原文件名:未命名.JPG)


于是找出问题原因:在if else 嵌套语句中,仿真器能将内部执行语句综合为组合逻辑,而在if if 多次判断,由于无法保证时序和顺序,所以提示错误!(cannot match operand(s) in the condition to the corresponding edges ,即不能把它加到正确的触发边沿!)

这也是CPLD和单片机不一样的地方,在单片机里面由于有内部时钟,所以if if的多次判断便可在不同的时钟上面体现了,由于CPLD没有内部时钟,所以这种语句无法被综合。

所以,编写always的条件语句的时候,只能一次判断,一个分支,而不能多个顺序分支。

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

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

出0入0汤圆

 楼主| 发表于 2010-10-14 11:20:38 | 显示全部楼层
汗,写了半天居然没人响应

万马齐喑究可哀啊

出0入0汤圆

发表于 2010-10-14 11:31:42 | 显示全部楼层
非也!
楼主的这个问题是因为复位之后的判断有多行,而又没加begin和end,所以导致综合器不能将其综合为触发器

出0入0汤圆

发表于 2010-10-14 11:31:43 | 显示全部楼层
船哥的图画的不错。

出0入0汤圆

发表于 2010-10-14 11:40:52 | 显示全部楼层
回复【2楼】seemrain  
非也!
楼主的这个问题是因为复位之后的判断有多行,而又没加begin和end,所以导致综合器不能将其综合为触发器

-----------------------------------------------------------------------

早上我刚遇到,加了begin end就可以解决。这种时候不能偷懒啊

出0入0汤圆

发表于 2010-10-14 11:49:07 | 显示全部楼层
单个语句好像不用加“begin……end”是可以的

多个并联if是可以硬件实现的,没有else使用QII综合的时候会有警告,但仍可综合


从单片机的顺序执行转到逻辑器件的并行需要一些时间去适应。

出0入0汤圆

发表于 2010-11-15 21:45:57 | 显示全部楼层
不是吧。。。。这个有时候综合工具会自动优化,将多个if,else优化成类似case的结构


如果是上面这种情况,经过优化之后。。。

就不是顺序执行了。。。而是并行。。。就会有冲突

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 15:30

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

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