Binary 两个';s补码二进制VHDL

Binary 两个';s补码二进制VHDL,binary,vhdl,twos-complement,Binary,Vhdl,Twos Complement,我必须在VHDL中将二进制数从a传输到-a。我对二的补码表示法有一些问题。 例如,如果我有A(8位)=5,二进制0000 0101。从网上的资料中,我意识到,要将其转换为2的补码-负数形式,我需要将所有位反转,最后加1: 0000 0101-->1111010+0000 0001=1111011,表示-A=-5 我现在怀疑的是这个可以表示-5和251的最终二进制形式,我如何识别它是-5还是251 顺便说一下,这种方法并不是用VHDL描述的那么简单。你知道有没有更简单的方法 直觉上,我的推理是:您

我必须在VHDL中将二进制数从a传输到-a。我对二的补码表示法有一些问题。 例如,如果我有
A(8位)=5,二进制
0000 0101
。从网上的资料中,我意识到,要将其转换为2的补码-负数形式,我需要将所有位反转,最后加1:

0000 0101-->1111010+0000 0001=1111011
,表示
-A=-5

我现在怀疑的是这个可以表示
-5
251
的最终二进制形式,我如何识别它是
-5
还是
251


顺便说一下,这种方法并不是用VHDL描述的那么简单。你知道有没有更简单的方法

直觉上,我的推理是:您使用的是2的补码,这是一种符号数字表示,因此存在负值。如果存在负值,则需要符号位。这将为幅度保留7位:因此只能表示-128和127之间的值。值251不在此范围内:不能使用8位2的补码表示法表示。因此,只有-5是有效的

在VHDL中实现二的补码符号求逆最简单的方法是使用
数字位

library ieee;
entity bit_inv is
    generic(width : positive);
    port(
        A     : in  bit_vector(width-1 downto 0);
        A_inv : out bit_vector(width-1 downto 0));
end entity;

architecture rtl of bit_inv is
    use ieee.numeric_bit.all;
begin
    A_inv <= bit_vector(-signed(A));
end architecture;

entity bit_inv_tb is end entity;

library ieee;
architecture beh of bit_inv_tb is
    use ieee.numeric_bit.all;
    constant width : positive := 8;
    signal A, A_inv : bit_vector(width-1 downto 0);
begin
    DUT : entity work.bit_inv
        generic map(width => width)
        port map(A=>A, A_inv =>A_inv);

    test: process begin
        A <= bit_vector(to_signed(5,width));
        wait for 1 ns;
        assert to_integer(signed(A_inv)) = -5 report "A_inv is not equal to -5" severity failure;
        wait;
    end process;
end architecture;
ieee库;
实体位_inv为
通用(宽度:正);
港口(
A:在位_向量中(宽度-1向下至0);
A_inv:out bit_向量(宽度-1到0));
终端实体;
bit_inv的体系结构rtl为
使用ieee.numeric_bit.all;
开始
A_库存宽度)
端口映射(A=>A,A\u inv=>A\u inv);
测试:进程开始

A请使用谷歌查找有符号和无符号算术之间的差异。简单。使用提供
有符号
无符号
类型的数字标准库。查看该信号的类型声明;如果它是
签名的(从7到0)
那么它是-5;如果它是
无符号的(7到0)
那么它是251。@BrianDrummond@JHBonarius,对于考试,我的老师说我们只能使用bit语句,所以我有疑问!顺便说一句,我怎么能识别它不是在VHDL中?如果我有
1111011
我怎么知道它是表示
-5
还是表示
251
?PS:有没有一种简单的方法将一个正数二进制数转换成负数形式?数字位也提供有符号/无符号类型。。。附言是的。如果没有合适的包,例如:numeric_std或numeric_std_bit,就无法将值指定为有符号或无符号-这确实是强类型以及有符号和无符号类型的目的。类型是代码文档的一部分。如果你的导师坚持输入bit,他们是在做学术练习。可以上学了。在专业领域不太好。我不能使用
signed
unsigned
,我写了这段代码,但我不能测试它,因为testbench与我写的每一段代码都是循环的:(注释太长了)我的老师用
std_logic
语句编写了一段类似的代码,但这似乎很奇怪,因为我认为我们可以关联
“11111111”
std\u logic\u vector
信号;你觉得怎么样?@DarkPassenger:你要求的是一种更简单的方法:在这里。