所以我必须做一个工作,在这里我必须编写一个计数器,该计数器的递增计数模式= 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。
有人知道为什么吗?第一种方式有什么问题?
最好的问候
答案 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;
其他解决方案类似于第二个示例中的代码,看起来不错。