我正在尝试创建一个二进制计数器,但是当我简化了IF语句时,它就停止了工作。
此代码有效:
if(counter<500000)
counter<=counter+1;
else
counter<=0;
if (counter==0)
if(LEDR<262143)
LEDR <= LEDR+1;
else
LEDR<=0;
这不是:
if(counter<500000)
counter<=counter+1;
else
counter<=0;
if (counter==0 && LEDR<262143)
LEDR <= LEDR+1;
else
LEDR<=0;
答案 0 :(得分:3)
您的代码的两个版本不相同。
在原始版本中,else
部分包含 counter == 0
条件,并将在counter == 0
和 LEDR >= 262143
:
if (counter==0)
if(LEDR<262143)
LEDR <= LEDR+1;
else // counter must be 0 here
LEDR<=0;
在“简化”版本中,当else
的相反为真时,counter == 0 && LEDR < 262143
部分将被执行,如果counter != 0
< strong>或 LEDR >= 262143
。
if (counter==0 && LEDR<262143)
LEDR <= LEDR+1;
else // counter could be different from 0
LEDR<=0;
您可以通过在表格中列出所有可能的组合来可视化差异:
counter == 0 | LEDR < 262143 | LEDR <= 0 executed | LEDR <= LEDR+1 executed
| | orig. new | orig. new
-------------+---------------+--------------------+------------------------
false | false | no *yes* | no no
false | true | no *yes* | no no
true | false | yes yes | no no
true | true | no no | yes yes
如您所见,counter != 0
时新版本的行为有所不同。
实际上,不可能将所需行为简化为单个if-else
语句,因为这意味着您只能区分执行{{1}的两个情况}或LEDR <= LEDR + 1
。但是在原始代码中有一个第三个案例(当LEDR <= 0
时),你根本不执行,并保持counter != 0
不受影响。
答案 1 :(得分:0)
if (counter==0)
if(LEDR<262143)
LEDR <= LEDR+1;
else
LEDR<=0;
与
if (counter==0 && LEDR<262143)
LEDR <= LEDR+1;
else
LEDR<=0;
两者的第一个条件相同但你改变了第二个参数的条件。
第一个例子是if ((counter==0) && !(LEDR<262143))
第二个例子是if !(counter==0 && LEDR<262143)
使用de-morgans法则第二个例子可能是:
if (counter!=0 || !(LEDR<262143) )
或
if (counter!=0 || (LEDR=<262143))
因此,if语句不是简化的,而是功能上的不同。