将 8 位二进制补码有符号数转换为十进制

Converting 8-bit two complement signed number to decimal

任务比较大,但我一直坚持将带符号的 8 位二进制补码数转换为十进制数。这是一些代码:

entity example is
    Port ( switches : in STD_LOGIC_VECTOR (7 downto 0) );
end example;
signal integer_value : integer;

我试图将此输入转换为十进制的逻辑是

integer_value <= to_integer(unsigned(switches));

integer_value 最终为零或整数的最小值 (-2147483648)。示例输入为“01101111”。

使用signed,而不是unsigned,因此:

integer_value <= to_integer(signed(switches));

考虑制作一个小型测试台来试验结构,以便隔离问题,因为听起来问题出在设计的其他地方。简单的测试台可能是这样的:

entity mdl_tb is
end entity;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

architecture sim of mdl_tb is
  signal switches      : std_logic_vector(7 downto 0);
  signal integer_value : integer;
begin

  integer_value <= to_integer(signed(switches));

  process is
  begin
    switches <= "00000000"; wait for 10 ns; report integer'image(integer_value);
    switches <= "11111111"; wait for 10 ns; report integer'image(integer_value);
    switches <= "10000000"; wait for 10 ns; report integer'image(integer_value);
    switches <= "01101111"; wait for 10 ns; report integer'image(integer_value);
    wait;
  end process;

end architecture;

这输出:

# ** Note: 0
#    Time: 10 ns  Iteration: 0  Instance: /mdl_tb
# ** Note: -1
#    Time: 20 ns  Iteration: 0  Instance: /mdl_tb
# ** Note: -128
#    Time: 30 ns  Iteration: 0  Instance: /mdl_tb
# ** Note: 111
#    Time: 40 ns  Iteration: 0  Instance: /mdl_tb