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稍微过度简化,但现在就可以了)。
我是 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稍微过度简化,但现在就可以了)。