binary - 二进制补码 VHDL
问题描述
我必须在 VHDL 中将二进制数从 A 传输到 -A。我对二进制补码表示法有一些疑问。例如,如果我有A(8 bit) = 5
, 二进制0000 0101
。从在线资源中,我意识到要将其转换为二进制补码否定形式,我需要将所有位反转,最后加 1:
0000 0101 --> 1111 1010 + 0000 0001 = 1111 1011
这代表-A=-5
;
我现在的疑问是关于这个可以表示的最终二进制形式,-5
我251
如何识别它是-5
or 251
?
顺便说一下,这种方法不能简单地用 VHDL 来描述。不知道有没有更简单的方法?
解决方案
直观地说,我的推理是:您使用的是二进制补码,它是有符号数表示,因此存在负值。如果存在负值,则需要一个符号位。这将留下 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;
推荐阅读
- terraform - 虚拟机磁盘置备错误
- azure - 将 SharePoint 2013 Active Directory 用户映射到 Azure AD 的要求
- sql-server - 删除 SQL 连接时 VBA 运行时错误 5
- ms-access - 复选框使标签可见
- haskell - 初始化寄存器
- bash - 从 tar 文件中提取到 Bash 中的不同目录
- powershell-4.0 - 无法从函数输出创建的自定义对象
- node.js - ES6 类函数中的导入模块
- algorithm - 有没有办法将 OT 或 CRDT(或类似的东西)用于关系数据?
- java - JComponent:如何以最正确的方式进行重绘?