У меня есть код как таковой ниже, который предназначен для вычитания и сложения. В принципе, когда Binv установлен, он должен вычитать, а Binv равен 0, он должен добавить. К сожалению, кажется, что это добавление, когда Binv устанавливается иногда, и вычитание, когда оно не устанавливается иногда. Вот снимок моделирования:Модуль субтрактора VHDL генерирует неправильные значения
entity ADD_SUB is
Port (A : in STD_LOGIC_VECTOR (31 downto 0);
B : in STD_LOGIC_VECTOR (31 downto 0);
Binv : in STD_LOGIC;
C_in: in STD_LOGIC;
S : out STD_LOGIC_VECTOR (31 downto 0);
TEST : out STD_LOGIC_VECTOR (31 downto 0);
C_out : out STD_LOGIC
);
end ADD_SUB;
architecture ADD_SUB_ARCH of ADD_SUB is
signal S_wider : std_logic_vector(32 downto 0);
begin
process (A,B,C_in,Binv)
begin
if Binv = '0' then
S_wider <= (A(31) & A) + (B(31) & B) + C_in;
elsif Binv = '1' then
S_wider <= (A(31)& A) + ('1'& not B) + '1';
else
S_wider <= std_logic_vector(to_signed(0,32));
end if;
S <= S_wider(31 downto 0);
C_out <= S_wider(32);
end process;
Я получаю бессмысленные результаты, которые не имеют никакого смысла. В первом случае вы можете видеть, что я пытался сделать (50 - 30) (Binv равен 1). Я получаю 80, что неправильно. Однако вы можете видеть, что он работает (30-50), где я получаю -20. Вторая проблема в том, где я пытаюсь сделать (30 + (-50)), однако он показывает, как 20.
Результаты полностью выключен, и я не вижу, где я неправильно
Можете ли вы попробовать без C_in (не уверен, что вы можете добавить C_in, который является std_logic для вектора)?. Кроме того, когда вы отрицаете B, should'nt это ((не B (31)) & (не B)) + "000000000000000000000000000000000001"? – neodelphi