2016-12-13 10 views
-1

Итак, я опубликовал это уже, но у меня нет ответа, поэтому я решил попробовать его еще раз.Где я ошибаюсь в 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'

Если кто-то может помочь мне бы действительно благодарен.

ответ

0

Если числа являются двумя дополнениями, то подпись правильного типа.

При том, что либо: 1. Сделайте порты подписаны, а не std_logic_vector или
2. Использование подписаны внутри и отбрасывать все входы подписаны и выходы STD_LOGIC_VECTOR раз:

signal I1_sv : signed(11 downto 0) ;  
. . . 
signal result : signed(11 downto 0) ; 
. . . 
I1_sv <= signed(I1) ; 
. . . 
O <= std_logic_vector(result) ; 
. . . 

Все преобразования отдельных типов (кастинг), которые вы делаете в коде, затрудняет чтение.

Смежные вопросы