Binary 两个';s补码二进制VHDL
我必须在VHDL中将二进制数从a传输到-a。我对二的补码表示法有一些问题。 例如,如果我有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描述的那么简单。你知道有没有更简单的方法 直觉上,我的推理是:您
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:你要求的是一种更简单的方法:在这里。