Vhdl 如何修复&x201C;锁存可能由不完整的case或if语句生成”;在什么情况下发送消息?

Vhdl 如何修复&x201C;锁存可能由不完整的case或if语句生成”;在什么情况下发送消息?,vhdl,mojo,Vhdl,Mojo,请帮帮我 我试着用选择器做4位ALU。 我遇到如下错误: **警告:Xst:737-找到信号的1位锁存器。锁存可能由不完整的case或if语句生成。我们不建议在FPGA/CPLD设计中使用锁存器,因为它们可能会导致时序问题 警告:Xst:737-找到信号的1位锁存器。锁存可能由不完整的case或if语句生成。我们不建议在FPGA/CPLD设计中使用锁存器,因为它们可能会导致时序问题 警告:Xst:737-找到信号的1位锁存器。锁存可能由不完整的case或if语句生成。我们不建议在FPGA/CPL

请帮帮我

我试着用选择器做4位ALU。 我遇到如下错误:

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

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

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

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

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

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

警告: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, B, C, 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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体多路复用器是
端口(A、B、C、D:STD_逻辑中;
S:标准逻辑向量(2到0);
Z:输出标准逻辑向量(2到0);
Znot:out标准逻辑向量(3到0);
末端多路复用器;
多路复用器的结构表是
开始
过程(S、A、B、C、D)
开始
个案为
当“000”=>--Suma--

Z(2)正如注释中所述,对于每种情况,您不会为Case语句中的所有输出信号分配一个值。由于语言标准的摘录可以使用有点技术性和不透明的语言,我将尝试编写一个对初学者友好的解释

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

您收到警告的原因是闩锁违反了同步设计实践。FPGA设计为同步工作。这些工具知道这一点,因为在99%的情况下,闩锁是非故意的,因此会发出警告。他们不会引发错误的原因是,在某些情况下,需要使用闩锁,但这仅用于专家使用


暗示内存元素的正确方法是使用寄存器。在这种情况下,暗示这将是用时钟驱动进程。如果不需要,则在每种情况下明确说明每个输出的所需值。

IEEE Std 1076.6-2004(RTL合成,撤销)6.2.1.1灵敏度列表过程中的电平敏感存储“当以下所有条件均适用时,应对信号(或变量)的电平敏感存储元件进行建模:A)信号(或变量)具有显式赋值。b)信号(或变量)没有作为条件的执行路径。c)有一些进程的执行没有(通过赋值语句)对信号(或变量)执行显式赋值。10.9 Case语句“case语句选择多个备选语句序列中的一个来执行;选择的备选方案由表达式的值定义。“您有不分配Z和Znot元素的case语句选择。旁注,如果您使用的是VHDL-2008,您可以将
进程(S、A、B、C、D)
替换为
进程(全部)
,这使得进程对所有读取信号都敏感()解决此问题的最简单方法是,将you-others case中的零赋值移到进程中switch语句之前。然后,所有信号将始终被赋值。进程正文中的最后一个信号赋值将保留,因此switch语句仍然有效。您可以将others子句保留为空。触发器是一个锁存器。您可以y是指“寄存器”#JHBonarius Tomayto,Tomarto。触发器通常用于指时钟内存元素。但是,我编辑了状态后寄存器,因为这是设备数据表中常用的。是的,数据表使用它是因为“寄存器”是通用名称。如果使用“触发器”“不清楚您指的是闩锁版本(因为闩锁也可以“计时”,回答中也不正确)还是寄存器(主从)版本。当然,有些教授仍然教“触发器”,但在我17年的工业生涯中,我从那以后就再也没有见过它被使用过。