Итак, я опубликовал это уже, но у меня нет ответа, поэтому я решил попробовать его еще раз.Где я ошибаюсь в VHDL?
Предприятие осуществляет следующие арифметические функции: • Вычитание I1 - I2 • Входной операнд 1 (I1): 12 бит, двоичное дополнение • Входной операнд 2 (I2): 8 бит, дополнения до двух • Выход (O): 12 бит, двоичное дополнение • переполнением (V) и флаг переноса (C) установлен соответственно • действительный флаг (дЕЙСТВУЕТ): указывает на то, если вычисленное решение справедливо или нет
Так что я сделал?
Вот это:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity arithmetic is
port(I1 :in std_logic_vector(12-1 downto 0); -- Operand 1
I2 :in std_logic_vector(8-1 downto 0); -- Operand 2
O :out std_logic_vector(12-1 downto 0); -- Output
C :out std_logic; -- Carry Flag
V :out std_logic; -- Overflow Flag
VALID :out std_logic -- Flag to indicate if the solution is valid or not
);
end arithmetic;
architecture behavior of arithmetic is
begin
process(I1,I2)
begin
if ((unsigned(I1)-unsigned(I2)) > unsigned(I1)) and
((unsigned(I1)-unsigned(I2)) > unsigned(I2)) then
C <= '1';
else
C <= '0';
end if;
if I1(11)='1' and signed(std_logic_vector(unsigned(I1)-unsigned(I2)))>0
then
V <= '1';
else
V <= '0';
end if;
if unsigned(I1) < unsigned(I2) then
VALID <= '0';
else
VALID <= '1';
end if;
O <= std_logic_vector(unsigned(I1)-unsigned(I2));
end process;
end behavior;
Там нет синтаксических ошибок или что-то подобное. Только ошибка состоит в том , что:
погрешности:
comp2, SUB
I1 = 100000011110
I2 = 01000001
Ожидаемое:
O = 011111011101
C = '0', V = '1', ДЕЙСТВУЕТ = '0'
Поступила:
O = 011111011101
C = '0', V = '1' и ДЕЙСТВУЕТ = '1'
Если кто-то может помочь мне бы действительно благодарен.