与其他if-else语句具有相同条件的if-else语句不会产生相同的输出

时间:2019-10-22 15:17:35

标签: vhdl

所以我必须做一个工作,在这里我必须编写一个计数器,该计数器的递增计数模式= 1->递增= 5且递减计数模式= 0->递减= -9。计数器应跳过无效值-69。

还有上限和下限:-250到248。

为了测试我们的计数器,给出了一个测试平台。

我在进程内部使用了以下if-else语句,并将clk信号用作敏感度列表条目。

if((cnt_intern + 5) <= 248) then
    cnt_intern <= cnt_intern + 5;
end if;


if(cnt_intern = -69) then
    cnt_intern <= cnt_intern + 5;
end if;

这不起作用,因为它将cnt_intern设置为-69,第二个if语句应防止此情况。我将if语句重写为以下内容:

if(cnt_intern <= 243) then#
    if(cnt_intern = -73) then
        cnt_intern <= cnt_intern + 10;
    else
        cnt_intern <= cnt_intern + 5;
    end if;
end if;

这一次它确实起作用了,它跳过了vlaue -69直接跳到-64。

有人知道为什么吗?第一种方式有什么问题?

最好的问候

1 个答案:

答案 0 :(得分:2)

观察到的行为的原因是,过程内部的信号分配不会立即更改信号值。取而代之的是,在信号上安排事务,该事务将在进程挂起时(即,在进程结束或到达wait语句时生效)。

在您的第一个示例中,如果在流程开始时cnt_intern为-74,则第一个if语句计划为事务处理,这意味着信号值更改为-69将在操作结束时进行。如果没有其他分配安排在cnt_intern上进行交易,则该过程。但是,cnt_intern的实际值将保持为-74,直到该过程结束。因此,第二个if语句的计算结果将为false且不执行任何操作。在该过程结束时,将-69的值分配给cnt_intern

如果您开始使用硬件描述语言,这个概念似乎会令人困惑,但这是必不可少的。

您可以使用辅助变量来避免该问题并使代码保持可读性:

process(clk)
    variable v_cnt_intern : integer;
begin
    if rising_edge(clk) then
        v_cnt_intern := cnt_intern;

        if((v_cnt_intern + 5) <= 248) then
            v_cnt_intern := v_cnt_intern + 5;
        end if;

        if (v_cnt_intern = -69) then
            v_cnt_intern := v_cnt_intern + 5;
        end if;

        cnt_intern <= v_cnt_intern;
    end if;
end process;

其他解决方案类似于第二个示例中的代码,看起来不错。

相关问题