首页 文章

二进制补码二进制VHDL

提问于
浏览
-1

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

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

我现在的疑问是关于这个最终的二进制形式可以代表 -5251 ,我怎么能识别它是 -5 还是 251

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

1 回答

  • 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;
    

相关问题