Vhdl 使用2个输入和3个输出的2位比较器的错误真值表

Vhdl 使用2个输入和3个输出的2位比较器的错误真值表,vhdl,xilinx,Vhdl,Xilinx,我正在制作一个2位的比较器,有2个输入和3个输出。 我用VHDL编写了以下代码,当我使用Xilinx创建原理图时,它显示了错误的真值表和所有的K映射。 这是我的密码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity comparator is Port ( a : in STD_LOGIC_VECTOR(1 downto 0); b : in STD_LOGIC_VECTOR(1 downto 0);

我正在制作一个2位的比较器,有2个输入和3个输出。 我用VHDL编写了以下代码,当我使用Xilinx创建原理图时,它显示了错误的真值表和所有的K映射。 这是我的密码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity comparator is
    Port ( a : in  STD_LOGIC_VECTOR(1 downto 0);
           b : in  STD_LOGIC_VECTOR(1 downto 0);
           a_lt_b : out  STD_LOGIC;
           a_eq_b : out  STD_LOGIC;
           a_gt_b : out  STD_LOGIC);
end comparator;

architecture Behavioral of comparator is

begin

a_lt_b <=    (    b(1) and not a(1))
              or(    b(1) and     b(0) and not a(0))
              or(    b(0) and not a(1) and not a(0));

a_eq_b <=    (not b(1) and not b(0) and not a(1) and not a(0))
             or (not b(1) and     b(0) and not a(1) and     a(0))
             or (    b(1) and not b(0) and     a(1) and not a(0))
             or (    b(1) and     b(0) and     a(1) and     a(0)); 

a_gt_b <=    (not b(1) and     a(1))
             or (not b(1) and not b(0) and a(0))
             or (not b(0) and     a(1)  and a(0));


end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体比较器是
端口(a:标准逻辑向量(1到0);
b:标准逻辑向量(1到0);
a\u lt\u b:输出标准逻辑;
a_eq_b:输出标准逻辑;
a_gt_b:输出标准逻辑);
末端比较器;
比较器的结构是
开始

a_lt_b您以一种相当迟钝的方式编写了代码。你为什么不这样写呢

a_lt_b <= '1' when unsigned(a) < unsigned(b) else '0';
a_eq_b <= '1' when unsigned(a) = unsigned(b) else '0';
有了这一点,就不会有太多机会犯类似于您在显式
而不是
组合(我没有花时间检查)中容易犯的那种错误。另一个好处是,任何阅读您的代码的人都可以直接看到它试图做什么。
最后,这样编写代码意味着它会自动适应操作数宽度的任何变化

完成此操作后,您真的不需要在生成的示意图中四处翻找,以检查这些工具是否完全按照您所认为的那样工作。这些工具非常擅长将代码高效地映射到硬件中,因此您通常可以相信它们会做正确的事情。在一些情况下,检查示意图可能很有价值:

  • 您希望代码推断FPGA中的特定元素,例如内存或乘法器块;示意图可以快速查看是否发生了这种情况
  • 这里有一个计时关闭问题,您希望确切地了解这些工具是如何实现代码的
  • 您的设备空间不足或使用的特定资源比您想象的要多;例如,该示意图可能显示,当您认为移位寄存器可用于特定信号时,使用了离散寄存器
  • 这些设计在您的模拟中起作用,但当涉及到真正的硬件时就不起作用了,而且您怀疑工具中存在缺陷。在极少数情况下,您可能能够仔细查看示意图并发现一个bug,但更可能的是,在这样做的过程中,您会发现某种设计错误。在这种情况下,无论哪种方式,示意图都会很有用

总之,使用该语言对功能进行简单描述,并相信这些工具能够完成逻辑优化工作。

那么您的问题是什么?你已经知道这个表是假的,为什么不修正它呢?你的结果在这里没有证据。你的问题没有说明一个可以复制的具体问题,它是不可验证的。看,在不知道产生的结果的情况下,你怎么知道他的VHDL代码中有错误。。。“你可以很容易地用…”进行推测。我花时间检查,看看结果。@user1155120说大型组合语句比简单的数值比较更容易出错,这不是推测。编码风格是唯一的问题。@user1155120:我不认识波形查看器-它是哪一个?“这样做后,…”根据编码风格的特定视图断言您的答案,但没有说明为什么错误的真值表和K映射是从有效的、符合合成条件的VHDL设计描述生成的。这并不奇怪,这个问题没有提供足够的信息。(Evan-波形查看器是)。
use IEEE.NUMERIC_STD.ALL;