为什么我会收到推断的闩锁错误?
Why am I getting an Inferred Latch Error?
我一直收到错误消息:[Synth 8-327] 在过去一小时内在行 address1 <= d(31 DOWNTO 0) 处推断变量 'd_reg' 的闩锁。我不确定为什么我没有收到此错误。我已将输入列表中的所有变量添加到流程中,并为代码中的所有 if 语句添加了 else。这就是我所知道的给出隐含闩锁的两个原因,但事实证明我仍然得到它们。
有人看到我的问题吗?
PORT (d : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
address : IN STD_LOGIC_VECTOR(31 DOWNTO 0) ;
ce_l : IN STD_LOGIC ;
oe_l : IN STD_LOGIC ;
we_l : IN STD_LOGIC ;
results : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --binary for which segments of digit to turn on
anodesList : INOUT STD_LOGIC_VECTOR(7 downto 0) := "00000000"; --binary for which annode to turn on
clk : IN STD_LOGIC) ;
(部分)我的代码:
SIGNAL address1 : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
SIGNAL check : STD_LOGIC_VECTOR(0 DOWNTO 0) := "0";
writeprocess:PROCESS(clk, ce_l,we_l, address1, check)
begin
IF (clk = '1' AND clk'event) THEN
IF(check = "1") THEN
IF (ce_l = '0' AND we_l = '0') THEN
address1 <= d(31 DOWNTO 0);
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
END PROCESS writeprocess ;
当您没有为进程中 if/else 或 case 语句的所有可能变体中的信号提供更新的分配时,您通常会得到推断锁存器。
在你的例子中,你的过程语句包括 5 个信号,但只有两个物质(clk 和 address1)。您有一个 "IF (clk = '1' AND clk'event) THEN" 的格式正确的同步条件语句,但是有一个 ELSE 子句可能是您出现问题的原因。除非您明确修改它,否则 VHDL 会将信号值保留在其先前的状态,因此不需要:
ELSE
address1 <= address1;
...我怀疑这是导致您看到的警告的原因,尽管它也可能是过程敏感性列表中不必要的信号。尝试没有不需要的信号和条件的简化版本:
writeprocess:PROCESS(clk)
begin
IF (clk = '1' AND clk'event) THEN
IF(check = "1") THEN
IF (ce_l = '0' AND we_l = '0') THEN
address1 <= d(31 DOWNTO 0);
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
END IF;
END PROCESS writeprocess ;
我一直收到错误消息:[Synth 8-327] 在过去一小时内在行 address1 <= d(31 DOWNTO 0) 处推断变量 'd_reg' 的闩锁。我不确定为什么我没有收到此错误。我已将输入列表中的所有变量添加到流程中,并为代码中的所有 if 语句添加了 else。这就是我所知道的给出隐含闩锁的两个原因,但事实证明我仍然得到它们。
有人看到我的问题吗?
PORT (d : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
address : IN STD_LOGIC_VECTOR(31 DOWNTO 0) ;
ce_l : IN STD_LOGIC ;
oe_l : IN STD_LOGIC ;
we_l : IN STD_LOGIC ;
results : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --binary for which segments of digit to turn on
anodesList : INOUT STD_LOGIC_VECTOR(7 downto 0) := "00000000"; --binary for which annode to turn on
clk : IN STD_LOGIC) ;
(部分)我的代码:
SIGNAL address1 : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
SIGNAL check : STD_LOGIC_VECTOR(0 DOWNTO 0) := "0";
writeprocess:PROCESS(clk, ce_l,we_l, address1, check)
begin
IF (clk = '1' AND clk'event) THEN
IF(check = "1") THEN
IF (ce_l = '0' AND we_l = '0') THEN
address1 <= d(31 DOWNTO 0);
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
END PROCESS writeprocess ;
当您没有为进程中 if/else 或 case 语句的所有可能变体中的信号提供更新的分配时,您通常会得到推断锁存器。
在你的例子中,你的过程语句包括 5 个信号,但只有两个物质(clk 和 address1)。您有一个 "IF (clk = '1' AND clk'event) THEN" 的格式正确的同步条件语句,但是有一个 ELSE 子句可能是您出现问题的原因。除非您明确修改它,否则 VHDL 会将信号值保留在其先前的状态,因此不需要:
ELSE
address1 <= address1;
...我怀疑这是导致您看到的警告的原因,尽管它也可能是过程敏感性列表中不必要的信号。尝试没有不需要的信号和条件的简化版本:
writeprocess:PROCESS(clk)
begin
IF (clk = '1' AND clk'event) THEN
IF(check = "1") THEN
IF (ce_l = '0' AND we_l = '0') THEN
address1 <= d(31 DOWNTO 0);
ELSE
address1 <= address1;
END IF;
ELSE
address1 <= address1;
END IF;
END IF;
END PROCESS writeprocess ;