微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 case-when 中修复“可能从不完整的 case 或 if 语句中生成闩锁”消息?

如何解决如何在 case-when 中修复“可能从不完整的 case 或 if 语句中生成闩锁”消息?

请帮帮我

我试图用选择器为 4 位做 ALU。 我收到这样的错误

**WARNING:Xst:737 - 找到信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

WARNING:Xst:737 - 发现信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

WARNING:Xst:737 - 发现信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

WARNING:Xst:737 - 找到信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

警告:Xst:737 - 发现信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

WARNING:Xst:737 - 发现信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

WARNING:Xst:737 - 发现信号 > 的 1 位锁存器。锁存器可能由不完整的 case 或 if 语句产生。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。**

我写了这段代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Multiplexor is
    Port ( A,B,C,D : in  STD_LOGIC;
           S : in  STD_LOGIC_VECTOR (2 downto 0);
           Z : out  STD_LOGIC_VECTOR (2 downto 0);
           Znot : out  STD_LOGIC_VECTOR (3 downto 0));
end Multiplexor;

architecture tabla of Multiplexor is

begin

process(S,A,D)

begin

   case (S) is 
      when "000" => --Suma--
         Z(2) <= ((A and C) or (B and C and D) or (A and B and D));
            Z(1) <= (((not(A))and (not (B))and C) or ((not(A)) and C and (not(D))) or (A and (not (B)) and (not (C))) or (A and (not (C)) and (not (D))) or ((not (A)) and B and (not (C)) and D) or (A and B and C and D));
            Z(0) <= (((not(B)) and D) or (B and (not(D))));
      when "001" => --Resta--
         Z(2) <= (((not(A)) and C) or ((not(A)) and C and D) or (A and (not(C)) and (not(D))) or (A and B and (not(C))));
            Z(1) <= (((not(A)) and (not(B)) and C) or ((not(A)) and C and D) or (A and (not(C)) and (not(D))) or (A and B and (not(C))));
            Z(0) <= (((not(B)) and D) or (B and (not(D))));
      when "010" => --Comparación--
         Z(2) <= (((not(A)) and C) or ((not(A)) and (not(B)) and D) or ((not(B)) and C and D));
            Z(1) <= ((A and (not(C))) or (B and (not(C)) and (not(D))) or (A and B and (not(D))));
            Z(0) <= (((not(A)) and (not(B)) and (not(C)) and (not(D))) or ((not(A)) and B and (not(C)) and D) or (A and (not(B)) and C and (not(D))) or (A and B and C and D));
      when "011" => --AND--
         Z(2) <= '0';
            Z(1) <= (A and C);
            Z(0) <= (B and D);
      when "100" => --OR--
         Z(2) <= '0';
            Z(1) <= (C or A);
            Z(0) <= (D or B);
      when "101" => --XOR--
         Z(2) <= '0';
            Z(1) <= (((not(A)) and C) or (A and (not(C))));
            Z(0) <= (((not(B)) and D) or (B and ((not(D)))));
      when "110" => --NOT--
            Znot(3) <= (not(A));
         Znot(2) <= (not(B));
            Znot(1) <= (not(C));
            Znot(0) <= (not(D));
        when others =>
            Znot(3) <= '0';
         Znot(2) <= '0';
            Znot(1) <= '0';
            Znot(0) <= '0';
            Z(2) <= '0';
            Z(1) <= '0';
            Z(0) <= '0';
   end case;
end process;
end tabla;

解决方法

正如评论中所述,您不会为每个案例的 Case 语句中的所有输出信号分配一个值。由于语言标准的摘录可能会使用有点技术性和不透明的语言,我会尽量写一个对初学者友好的解释。

您的 case 语句有七个输出,Z(0..2) 和 Znot(0..3)。你的过程是一种称为组合的类型(即它没有计时)。这种结构的标准描述是为所有情况分配所有输出。如果您查看您的第一次评估(when = "000"),您会发现您只为 Z 赋值。这意味着您希望 Znot 保留其先前的值,这意味着一个内存元素。非时钟存储器元件称为锁存器。

您收到警告的原因是锁存器违反了同步设计实践。 FPGA 旨在同步工作。工具知道这一点,因为在 99% 的情况下闩锁是意外的,会发出警告。他们不引发错误的原因是在某些极端情况下打算使用闩锁,但这仅供专家使用。

暗示内存元素的正确方法是使用寄存器。在这种情况下,暗示这将是用时钟驱动您的过程。如果不希望这样,那么在每种情况下明确说明每个输出的期望值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。