我对VHDL很陌生,我有个愚蠢的问题。
我的代码中有一个巨大的case语句,只有1种情况下是一个值(例如“1”),而在所有其他情况下都是“0”。我想避免在所有情况下都编写th 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';
.... 但在我看来这是一个多驱动的信号。要做到这一点,清洁的方法是什么?
非常感谢!
发布于 2016-10-28 09:17:08
你有两个选择:
( i)缺省转让
....
my_signal <='0';
case ...
when case2 =>
my_signal <='1';
....
end case;(二)其他分支:
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;你最初的建议和我的建议都没有“多驱动”的信号。您可以从一个进程中任意次数地驱动(分配)一个信号,而且它从来不是一个“多驱动”信号。进程中对信号的任何分配都会在该信号上产生驱动程序。只有当您将来自多个进程的信号分配给多个进程时,才会得到“多驱动”信号,而您并没有这样做。当执行带有信号分配(<=)的代码行时,实际发生的是将事件放在事件队列中(模拟器“要做列表”)。该事件将在下一个增量周期(或模拟周期)上发生,这是仿真的下一个迭代。如果在相同的模拟周期内执行多行信号赋值,则删除事件队列中的任何事件,并由上一次信号分配生成的事件替换(稍微过于简化,但现在可以)。
https://stackoverflow.com/questions/40301547
复制相似问题