是否可以在Verilog中简化此IF条件语句?

时间:2015-05-26 11:52:53

标签: 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;

2 个答案:

答案 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语句不是简化的,而是功能上的不同。