是否可以在 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 + 1LEDR <= 0。但是在原始代码中有一个 third 情况(当 counter != 0 时)你执行 nothing at all 并离开 LEDR 未受影响。