Ian11122840 发表于 2010-10-13 09:21:31

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

最近编写了一些程序,查出了一些问题,和大家分享下

输入脉冲信号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语言中是不会有错的啊!我分析了一下流程图,如下
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_589365AJY61S.JPG
(原文件名:未命名.JPG)


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

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

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

Ian11122840 发表于 2010-10-14 11:20:38

汗,写了半天居然没人响应

万马齐喑究可哀啊

seemrain 发表于 2010-10-14 11:31:42

非也!
楼主的这个问题是因为复位之后的判断有多行,而又没加begin和end,所以导致综合器不能将其综合为触发器

yuphone 发表于 2010-10-14 11:31:43

船哥的图画的不错。

90999 发表于 2010-10-14 11:40:52

回复【2楼】seemrain
非也!
楼主的这个问题是因为复位之后的判断有多行,而又没加begin和end,所以导致综合器不能将其综合为触发器

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

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

Jigsaw 发表于 2010-10-14 11:49:07

单个语句好像不用加“begin……end”是可以的

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


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

gc56198 发表于 2010-11-15 21:45:57

不是吧。。。。这个有时候综合工具会自动优化,将多个if,else优化成类似case的结构


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

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

YFM_LMM 发表于 2010-11-16 11:07:46

LZ 不应把c和 Verilog 相提并论
页: [1]
查看完整版本: 有关if语句嵌套时产生的逻辑问题!CPLD和单片机区别理解!