二进制补码二进制VHDL

时间:2018-05-16 15:05:08

标签: binary vhdl twos-complement

我必须在VHDL中将二进制数从A传输到-A。我有两个关于两个补码表示法的问题。 例如,如果我有A(8 bit) = 5,则为二进制0000 0101。从在线资料中我意识到要将其翻译成两个补码的否定形式,我需要在最后将所有位反转为1:

0000 0101 --> 1111 1010 + 0000 0001 = 1111 1011,代表-A=-5;

我现在的疑问是关于这个可以代表-5251的最终二进制表单,如何判断它是-5还是251

顺便说一句,这种方法不是简单地用VHDL描述的。你知道是否有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

直觉我的推理是:你使用的是两个补码,这是一个带符号的数字表示,因此存在负值。如果存在负值,则需要一个符号位。这将为幅度留下7位:因此,您只能表示介于-128和127之间的值。值251不在此范围内:它不能使用8位二进制补码表示法表示。因此只有-5是有效的。

在VHDL中实现双补码符号反转的最简单方法是使用numeric_bit包。

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;