我是VHDL的新手,我有一个愚蠢的问题。
我的代码中有一个巨大的案例陈述,以及一个只有1个案例的值(例如' 1')和' 0'在所有其他情况下。 我想避免写下my_signal< =' 0'在所有情况下,但受影响的情况为1(代码可读性/密度/重复)
为了便于阅读,我想在这个过程中保持这种信号影响。
我想做的是像
my_signal <='0';
case
case0
....
case1
....
case2
my_signal <='1';
....
case3
....
case4
....
避免
case
case0
my_signal <='0';
....
case1
my_signal <='0';
....
case2
my_signal <='1';
....
case3
my_signal <='0';
....
case4
my_signal <='0';
....
但这看起来像是一个多驱动信号给我。 什么是干净的方法来实现这一目标?
非常感谢!
答案 0 :(得分:1)
您有两种选择:
i)默认分配:
....
my_signal <='0';
case ...
when case2 =>
my_signal <='1';
....
end case;
ii)其他分支:
case ...
when case2 =>
my_signal <='1';
....
when others =>
my_signal <='0';
end case;
....
选择(ii)可能更有用,因为VHDL中的case
语句要求包含所有可能性,因此选择(i)时,您可能只需要一个when others =>
分支满足这个条件,即(i)必须是:
....
my_signal <='0';
case ...
when case2 =>
my_signal <='1';
....
when others =>
null; -- do nothing
end case;
您的原始建议和我的建议都没有“多驱动”信号。您可以从一个进程驱动(分配给)多次信号,它绝不是“多路驱动”信号。对过程中的信号的任何分配都会导致该信号上的驱动器。如果您从多个进程分配信号,则只会获得“多驱动”信号,而您没有这样做。当执行具有信号分配(<=
)的代码行时,实际发生的是事件被放置在事件队列上(模拟器“To”列表“)。该事件将发生在下一个 delta周期(或模拟周期)上,这是模拟的下一次迭代。如果在同一模拟周期中执行了多个具有信号分配的行,那么事件队列上的任何事件都将被删除,并被最后一个信号分配所产生的事件所取代(略微超过简化,但它现在会做)。