2016-12-13 60 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', VALID = '0'

收稿日期:

O = 011111011101

C = '0',V = '1' 和VALID = '1'

如果有人可以幫助我將是非常感謝。

回答

0

如果數字是二進制補碼,那麼signed是正確的類型。

憑藉其: 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) ; 
. . . 

所有單獨的類型轉換(鑄造)你在代碼中做的事情使它很難閱讀。

相關問題