VHDL信号的影响简化

时间:2016-10-28 08:59:05

标签: signals vhdl

我是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';  
....  

但这看起来像是一个多驱动信号给我。 什么是干净的方法来实现这一目标?

非常感谢!

1 个答案:

答案 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周期(或模拟周期)上,这是模拟的下一次迭代。如果在同一模拟周期中执行了多个具有信号分配的行,那么事件队列上的任何事件都将被删除,并被最后一个信号分配所产生的事件所取代(略微超过简化,但它现在会做)。