两个';s补码VHDL

两个';s补码VHDL,vhdl,Vhdl,我只是想用VHDL做一个简单的二的补码设备,但它却抛出了这个非常恼人的错误,我不确定我做错了什么。可能是非常愚蠢的事情…错误是 错误(10327):Two恭维处的VHDL错误。vhd(21):无法确定运算符“nand”的定义--找到0个可能的定义 代码是 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity twoscompliment is generic (

我只是想用VHDL做一个简单的二的补码设备,但它却抛出了这个非常恼人的错误,我不确定我做错了什么。可能是非常愚蠢的事情…错误是 错误(10327):Two恭维处的VHDL错误。vhd(21):无法确定运算符“nand”的定义--找到0个可能的定义

代码是

library ieee;
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all;
entity twoscompliment is
      generic
      (
              Nbits : positive := 8 
       );
 port 
( 
           --Inputs
           A : in std_logic_vector (Nbits-1 downto 0);
           --Outputs
           Y : out std_logic_vector (Nbits downto 0)
);
end twoscompliment;

architecture twoscompliment_v1 of twoscompliment is
 begin
  Y <= std_logic_vector(unsigned(A NAND '1') + '1');
 end twoscompliment_v1;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体2完成是
通用的
(
Nbits:正:=8
);
港口
( 
--投入
A:标准逻辑向量(Nbits-1向下至0);
--输出
Y:输出标准逻辑向量(n降为0)
);
结束两个示例;
体系结构TwosComplement\u TwosComplement的v1为
开始
Y试试这个:

architecture twoscompliment_v1 of twoscompliment is
signal temp : std_logic_vector(Nbits-1 downto 0);
begin
  temp <= not A;
  Y    <= std_logic_vector(unsigned(temp + 1));
end twoscompliment_v1;
体系结构TwosComplement\u TwosComplement的v1是
信号温度:标准逻辑向量(Nbits-1向下至0);
开始
温度试试这个:

architecture twoscompliment_v1 of twoscompliment is
signal temp : std_logic_vector(Nbits-1 downto 0);
begin
  temp <= not A;
  Y    <= std_logic_vector(unsigned(temp + 1));
end twoscompliment_v1;
体系结构TwosComplement\u TwosComplement的v1是
信号温度:标准逻辑向量(Nbits-1向下至0);
开始
temp
architecture TwosComplement\u TwosComplement的v1为
常数1:无符号(Y'范围):=(0=>'1',其他=>'0');
开始
Y
architecture twoscompliment\u twoscompliment的v1是
常数1:无符号(Y'范围):=(0=>'1',其他=>'0');
开始

在我看来,你似乎在试图否定输入的数字。。。也许我遗漏了一些重要的东西,但其他答案给出了一个解决方案,在实现目标的同时,似乎比他们需要的更为模糊

除非进行丑陋的转换,否则这有什么问题

y <= std_logic_vector(-signed(resize(unsigned(A)), y'length));

成功

在我看来,你似乎在试图否定输入的数字。。。也许我遗漏了一些重要的东西,但其他答案给出了一个解决方案,在实现目标的同时,似乎比他们需要的更为模糊

除非进行丑陋的转换,否则这有什么问题

y <= std_logic_vector(-signed(resize(unsigned(A)), y'length));

成功

Hi-2的补码是通过将a的二进制位反转来完成的 给定编号,即将1更改为0,将0更改为1,然后添加 二进制位“1”到给定二进制数的最低有效位。现在我 有计划

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity twoscomplementconversion is Port (
    bin : in  STD_LOGIC_VECTOR (3 downto 0);
    twos : out  STD_LOGIC_VECTOR (3 downto 0)
);
end twoscomplementconversion;

architecture Behavioral of twoscomplementconversion is

    component fourbitadder45 Port (
        a : in  std_logic_vector (3 downto 0);
        b : in  std_logic_vector(3 downto 0);
        cin : in  std_logic;
        cout : out  std_logic;
        sum  : out  std_logic_vector (3 downto 0)
    );
    end component;

    signal onebit : std_logic_vector(3 downto 0):="0001";
    signal cin1   : std_logic:='0';
    signal notbin : std_logic_vector(3 downto 0);
    signal cout1  : std_logic;

begin

    notbin <= not(bin);

    twos1: fourbitadder45 port map (
        a    => notbin,
        b    => onebit,
        cin  => cin1,
        cout => cout1,
        sum  => twos
    );

end Behavioral;
四位加法器包含4个全加器,因此全加器程序如下所示:
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体fulladder2是端口(
答:标准逻辑;
b:标准逻辑;
cin:标准逻辑;
cout:输出标准逻辑;
sum:输出标准逻辑
);
末端全加器2;
fulladder2的体系结构是
开始

sum2的补码是通过将a的二进制位反转来完成的 给定编号,即将1更改为0,将0更改为1,然后添加 二进制位“1”到给定二进制数的最低有效位。现在我 有计划

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity twoscomplementconversion is Port (
    bin : in  STD_LOGIC_VECTOR (3 downto 0);
    twos : out  STD_LOGIC_VECTOR (3 downto 0)
);
end twoscomplementconversion;

architecture Behavioral of twoscomplementconversion is

    component fourbitadder45 Port (
        a : in  std_logic_vector (3 downto 0);
        b : in  std_logic_vector(3 downto 0);
        cin : in  std_logic;
        cout : out  std_logic;
        sum  : out  std_logic_vector (3 downto 0)
    );
    end component;

    signal onebit : std_logic_vector(3 downto 0):="0001";
    signal cin1   : std_logic:='0';
    signal notbin : std_logic_vector(3 downto 0);
    signal cout1  : std_logic;

begin

    notbin <= not(bin);

    twos1: fourbitadder45 port map (
        a    => notbin,
        b    => onebit,
        cin  => cin1,
        cout => cout1,
        sum  => twos
    );

end Behavioral;
四位加法器包含4个全加器,因此全加器程序如下所示:
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体fulladder2是端口(
答:标准逻辑;
b:标准逻辑;
cin:标准逻辑;
cout:输出标准逻辑;
sum:输出标准逻辑
);
末端全加器2;
fulladder2的体系结构是
开始

sum I不会更改您的代码,但它是“二的补码”。A是std_逻辑_向量(数组类型),而“1”是与std_逻辑兼容的枚举文字(不是数组类型)。在您正在使用的两个包(std_logic_1164和numeric_std)中,都没有定义运算符采用这两种类型(或密切相关的类型)。二的恭维转换常用的方法是取一个数的倒数(not)加一。对于std_逻辑_向量,有一个not运算符可以这样做。您还需要右侧的表达式来返回与左侧Y匹配的长度。我不会更改代码,但它是“两个补码”。a是std_逻辑_向量(数组类型),“1”是与std_逻辑兼容的枚举文字(不是数组类型)。在您正在使用的两个包(std_logic_1164和numeric_std)中,都没有定义运算符采用这两种类型(或密切相关的类型)。二的恭维转换常用的方法是取一个数的倒数(not)加一。对于std_逻辑_向量,有一个not运算符可以这样做。您还需要右侧的表达式来返回与左侧的Y匹配的长度。在上次出现temp之后,您似乎缺少一个结束参数,并且您的Y目标长度(9)与右侧的值长度(8)不匹配。这是一个模拟错误。这不应该是:
std\u logic\u vector(unsigned(temp)+1)
?在上次出现temp之后,您似乎缺少一个结束参数。并且您的Y的目标长度,(9)与右侧(8)的值的长度不匹配。这是一个模拟错误,这不是:
std\u逻辑向量(无符号(temp)+1)
?目标Y的长度为9,这就是为什么常数也会这样做。numeric_std包有一个无符号的“+”运算符,它取左或右操作数的最大长度,并返回该长度的无符号。目标Y的长度为9,这就是常量Y也有此长度的原因。数字_std包有一个“+”无符号运算符,取左或右操作数的最大长度,并返回该长度的无符号。您会注意到,您的答案和所选答案的信号赋值运算符的右侧和左侧都具有从表达式派生的不同长度的std_逻辑_向量。Y的范围大于a。它们将进行分析,但会生成运行时错误<代码>nvc-r测试**致命:目标9的长度与值8文件twos.vhdl的长度不匹配,第21行
您会注意到您的答案和所选答案都具有信号分配运算符的右侧和左侧,具有从expre导出的不同长度的std_逻辑_向量
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity twoscomplementconversion is Port (
    bin : in  STD_LOGIC_VECTOR (3 downto 0);
    twos : out  STD_LOGIC_VECTOR (3 downto 0)
);
end twoscomplementconversion;

architecture Behavioral of twoscomplementconversion is

    component fourbitadder45 Port (
        a : in  std_logic_vector (3 downto 0);
        b : in  std_logic_vector(3 downto 0);
        cin : in  std_logic;
        cout : out  std_logic;
        sum  : out  std_logic_vector (3 downto 0)
    );
    end component;

    signal onebit : std_logic_vector(3 downto 0):="0001";
    signal cin1   : std_logic:='0';
    signal notbin : std_logic_vector(3 downto 0);
    signal cout1  : std_logic;

begin

    notbin <= not(bin);

    twos1: fourbitadder45 port map (
        a    => notbin,
        b    => onebit,
        cin  => cin1,
        cout => cout1,
        sum  => twos
    );

end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity fourbitadder45 is Port (
    a : in  std_logic_vector (3 downto 0);
    b : in  std_logic_vector(3 downto 0);
    cin : in  std_logic;
    cout : out  std_logic;
    sum  : out  std_logic_vector (3 downto 0)
);
end fourbitadder45;

architecture Behavioral of fourbitadder45 is
    component fulladder2 Port (
        a : in  std_logic;
        b : in  std_logic;
        cin : in std_logic;
        cout : out std_logic;
        sum : out std_logic
    );
    end component;

    signal c:std_logic_vector (3 downto 1);

begin

    fa1 :fulladder2 port map (a => a(0), b => b(0), cin => cin,  cout => c(1), sum => sum(0)); 
    fa2 :fulladder2 port map (a => a(1), b => b(1), cin => c(1), cout => c(2), sum => sum(1));
    fa3 :fulladder2 port map (a => a(2), b => b(2), cin => c(2), cout => c(3), sum => sum(2)); 
    fa4 :fulladder2 port map (a => a(3), b => b(3), cin => c(3), cout => cout, sum => sum(3)); 

end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity fulladder2 is Port (
    a : in  std_logic;
    b : in  std_logic;
    cin : in std_logic;
    cout : out std_logic;
    sum : out std_logic
);
end fulladder2;

architecture Behavioral of fulladder2 is
begin
    sum <= a xor b xor cin;
    cout <= ((a and b) or (b and cin) or (cin and a));
end Behavioral;