VHDL 信号影响简化

VHDL signal affectation simplification

我是 VHDL 的新手,我有一个愚蠢的问题。

我的代码中有一个巨大的 case 语句和一个信号,该信号仅在 1 种情况下为值(例如“1”),在所有其他情况下为“0”。 我想避免在所有情况下都写 th my_signal <= '0' 但受影响的情况下为 1(对于代码 readability/density/duplication)

为了可读性,我想在这个过程中保留这个信号的影响。

我想做的是

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

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

非常感谢!

你有两个选择:

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;

你原来的建议和我的建议都没有"multidriven"信号。您可以从一个进程驱动(分配给)一个信号任意多次,它永远不会是"multidriven"信号。对进程中信号的任何分配都会导致该信号上的驱动程序。如果您从多个进程 分配给一个信号 ,您只会得到一个 "multidriven" 信号,而您并没有这样做。当执行带有信号分配 (<=) 的一行代码时,实际发生的是一个 事件 被放置在 事件队列 (模拟器"To Do List")。该事件将在下一个 delta cycle(或 simulation cycle)发生,这是模拟的下一次迭代。如果在同一个仿真周期中执行多行分配给信号的代码,则事件队列中的任何事件都将被删除,并由最后一个信号分配生成的事件替换(a稍微过度简化,但现在就可以了)。