我必须在VHDL中将二进制数从A传输到-A。我有两个关于两个补码表示法的问题。
例如,如果我有A(8 bit) = 5
,则为二进制0000 0101
。从在线资料中我意识到要将其翻译成两个补码的否定形式,我需要在最后将所有位反转为1:
0000 0101 --> 1111 1010 + 0000 0001 = 1111 1011
,代表-A=-5
;
我现在的疑问是关于这个可以代表-5
和251
的最终二进制表单,如何判断它是-5
还是251
?
顺便说一句,这种方法不是简单地用VHDL描述的。你知道是否有更简单的方法吗?
答案 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;