我在看this example和下面的回答這是一個很好的解決方案,以產生兩個的補:VHDL類型轉換籤訂std_logic_vector
library ieee;
use ieee.numeric_std.all;
entity twoscomplement is
generic
(
Nbits : positive := 8
);
port
(
A : in unsigned (Nbits-1 downto 0);
Y : out signed (Nbits downto 0)
);
end entity twoscomplement;
architecture a1 of twoscomplement is
begin
Y <= -signed(resize(A, Y'length));
end architecture;
我想使用上述例子有補,然後做一個「16位減法器「。該代碼將如下所示:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity subtractor_16bit is
Port ( a : in STD_LOGIC_VECTOR(15 downto 0);
b : in STD_LOGIC_VECTOR(15 downto 0);
cin : in STD_LOGIC;
sum : out STD_LOGIC_VECTOR(15 downto 0);
cout : out STD_LOGIC;
over : out STD_LOGIC
);
end subtractor_16bit;
architecture Behavioral of subtractor_16bit is
component fulladder_16bit is
Port (
a : in STD_LOGIC_VECTOR(15 downto 0);
b : in STD_LOGIC_VECTOR(15 downto 0);
cin : in STD_LOGIC;
sum : out STD_LOGIC_VECTOR(15 downto 0);
cout : out STD_LOGIC;
over : out STD_LOGIC
);
end component;
component twoscomplement is
Port (
A : in unsigned (15 downto 0);
C : out signed (15 downto 0)
);
end component;
signal n1 : STD_LOGIC_VECTOR(15 downto 0);
begin
twoscomplement_1: twoscomplement port map (a => a ,c => n1); --ERROR
fulladder_16bit_1: fulladder_16bit port map (a => a, b => n1, sum => sum , cin => cin, cout => cout, over => over);
end Behavioral;
不過,我收到一個錯誤說: 錯誤:錯誤類型附近;當前類型std_logic_vector;預期類型無符號。
請幫我解決這個問題。
至少有三個錯誤可見無[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve)。在'兩個端口映射中(a => a,c => n1); --ERROR'。 C中的兩個元素被聲明爲有符號類型,而n1被定義爲類型std_logic_vector。 A和C的大小有一個默認的通用值,這裏沒有修改,分別是長度8和9,而A的長度是16,長度是C.通用需要被傳遞並且n1的長度被調整。二的補碼也可以在沒有結構元素的表達式中執行。 – user1155120
只需查看'twoscomplement'的實現,就可以看到類型轉換的示例... – JHBonarius
'type_conversion :: = type_mark(expression)*顯式*類型轉換*是在*緊密相關的類型*之間轉換的表達式。當且僅當類型具有相同的維度和元素類型緊密相關時,兩個數組類型緊密相關。一種類型與其本身密切相關。 IEEE Std 1076-2008 9.3.6類型轉換。數組類型signed和std_logic_vector具有相同的元素基類型。 – user1155120