Vhdl 条件与其他If-else语句相同的If-else语句不会产生相同的输出

Vhdl 条件与其他If-else语句相同的If-else语句不会产生相同的输出,vhdl,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) th

所以我必须做一个分配,在这里我必须写一个计数器,其中递增模式=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;

if((cnt_intern+5)观察到的行为的原因是进程内的信号分配不会立即更改信号值。相反,在信号上调度事务,该事务将在进程挂起时生效(即当进程结束或到达
wait
语句时)

在第一个示例中,如果进程开始时
cnt\u intern
为-74,则第一个if语句将调度为事务,这意味着如果没有其他赋值在
cnt\u intern
上调度事务,则在进程结束时将信号值更改为-69。然而,
cnt\u的实际值tern
将保持-74直到进程结束。因此,第二个if语句的计算结果将为false且不执行任何操作。在进程结束时,将-69的值分配给
cnt\u intern

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

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

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;
过程(clk)
变量v_cnt_intern:integer;
开始
如果上升沿(clk),则
v_cnt_实习生:=cnt_实习生;

if((v_cnt_intern+5)第二个有效但第一个无效的原因是,第二个合并了if语句,而第一个是两个完全独立的if语句,没有连接。你结束if语句,然后再编写另一个-看看你是否能自己解决它(这是一个学习曲线!)但是如果你还在挣扎,那么回来,我会给你指出正确的方向。第一个不会阻止设置为-69,而是等到cnt设置为-69,然后再检查它。好的,明白了。变量cnt_intern实际上是一个辅助变量,我只是忘了在开始时用cnt_intern:=cnt;将它设置为cnt信号。我有将cnt_intern放入敏感度列表以使其工作(否则我会遇到编译器错误)。不知道为什么我的代码会工作,因为我从未设置cnt_intern。我还使用上升沿(clk)进行边缘检测。
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;