将 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
任务比较大,但我一直坚持将带符号的 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