如何解决如何在 case-when 中修复“可能从不完整的 case 或 if 语句中生成闩锁”消息?
请帮帮我
我试图用选择器为 4 位做 ALU。 我收到这样的错误:
**WARNING:Xst:737 - 找到信号
WARNING:Xst:737 - 发现信号
WARNING:Xst:737 - 发现信号
WARNING:Xst:737 - 找到信号
警告:Xst:737 - 发现信号
WARNING:Xst:737 - 发现信号
WARNING:Xst:737 - 发现信号
我写了这段代码:
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 举报,一经查实,本站将立刻删除。