首页 > 解决方案 > 二进制补码 VHDL

问题描述

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

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

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

顺便说一下,这种方法不能简单地用 VHDL 来描述。不知道有没有更简单的方法?

标签: binaryvhdltwos-complement

解决方案


直观地说,我的推理是:您使用的是二进制补码,它是有符号数表示,因此存在负值。如果存在负值,则需要一个符号位。这将留下 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;

推荐阅读