每个分配信号的并发语句都有该信号的驱动程序。并发信号赋值(在本例中为条件信号赋值)是并发语句。进程是并发语句。
所以有两个驱动:
gpo <= gpo_int;
和:
write : process
std_logic_vector 是一种已解析的数据类型。 std_logic_vector 信号gpo_int 的有效值是其所有驱动程序的解析值(您有两个显示)。对于gpo_int 的每个元素,来自两个驱动程序中的每一个的相应值用于通过使用包std_logic_1164 主体中定义的分辨率表查找两个值的交点处的值来确定gpo_int 的有效值:
CONSTANT resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |
);
因此,当它们的对应元素不解析相同的值时,存储值 (gpo_int <= gpo_int when n_wr = '1') 和进程中分配的值可能会导致冲突。
例如,如果一个驱动程序的gpo_int(7) 是'1',而另一个驱动程序是'0',则该元素的解析值为'X'。
如果你想把gpo_int当作一个latch试试:
gpo <= gpo_int;
WRITE:
process (n_en, n_wr, data)
begin
if n_wr = '0' and n_en ='0' and addr(11 downto 8) = x"F0" then
gpo_int <= data;
else
gpo_int <= gpo_int; -- the else clause is optional for some synthesis tools
end if;
end process;
忘记gpo_int 的并发信号赋值语句。当 if 语句中的三个条件都为真时,分配给gpo_int 的流程语句保留其值 accept。
data 列在敏感度列表中的原因是它在n_wr 或n_en 之后转换。
您可以在现已废除的 IEEE Std 1076.6-2004 6.2.1.1 级别敏感存储中从带有敏感度列表的进程中找到推断锁存器的公认方法的描述,或描述支持的 VHDL 语言结构的供应商文档。
通常,系统会通过确保其中一个转向信号(在这种情况下为n_wr 和n_en)在其他信号转换(例如addr 是稳定的)。是的,您可以在零时间模型中获得一个 delta 周期长的组合事件。