是否可以在 Verilog 中简化此 IF 条件语句?
Is it possible to simplify this IF conditional statement in Verilog?
我正在尝试创建一个二进制计数器,但是当我简化 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;
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 语句并没有被简化,而是在功能上有所不同。
你的代码的两个版本不等价。
在你原来的版本中,else
部分包含在的counter == 0
条件中,会在counter == 0
时执行和 LEDR >= 262143
:
if (counter==0)
if(LEDR<262143)
LEDR <= LEDR+1;
else // counter must be 0 here
LEDR<=0;
在"simplified"版本中,else
部分会在counter == 0 && LEDR < 262143
的对面为真时执行,是这样的如果 counter != 0
或 LEDR >= 262143
.
if (counter==0 && LEDR<262143)
LEDR <= LEDR+1;
else // counter could be different from 0
LEDR<=0;
您可以通过在 table:
中列出所有可能的组合来可视化差异
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
语句,因为这意味着您只能区分 两个 情况执行 LEDR <= LEDR + 1
或 LEDR <= 0
。但是在原始代码中有一个 third 情况(当 counter != 0
时)你执行 nothing at all 并离开 LEDR
未受影响。
我正在尝试创建一个二进制计数器,但是当我简化 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;
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 语句并没有被简化,而是在功能上有所不同。
你的代码的两个版本不等价。
在你原来的版本中,else
部分包含在的counter == 0
条件中,会在counter == 0
时执行和 LEDR >= 262143
:
if (counter==0)
if(LEDR<262143)
LEDR <= LEDR+1;
else // counter must be 0 here
LEDR<=0;
在"simplified"版本中,else
部分会在counter == 0 && LEDR < 262143
的对面为真时执行,是这样的如果 counter != 0
或 LEDR >= 262143
.
if (counter==0 && LEDR<262143)
LEDR <= LEDR+1;
else // counter could be different from 0
LEDR<=0;
您可以通过在 table:
中列出所有可能的组合来可视化差异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
语句,因为这意味着您只能区分 两个 情况执行 LEDR <= LEDR + 1
或 LEDR <= 0
。但是在原始代码中有一个 third 情况(当 counter != 0
时)你执行 nothing at all 并离开 LEDR
未受影响。