vhdl中的数值运算

vhdl中的数值运算,vhdl,Vhdl,我是vhdl编程语言的新手。我正试图用“+”运算符做一个全加器,我也做了代码和l编译,但当我模拟它时,输出非常奇怪,与全加器输出不一致,我认为错误可能在向量长度上,但我无法修复它 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; entity adder is port (a,b,c : in std_logic; s,d :

我是vhdl编程语言的新手。我正试图用“+”运算符做一个全加器,我也做了代码和l编译,但当我模拟它时,输出非常奇怪,与全加器输出不一致,我认为错误可能在向量长度上,但我无法修复它

    library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity adder is
port (a,b,c : in std_logic;
    s,d : out std_logic);
end entity;

architecture arc_adder of adder is
signal z : std_logic_vector (1 downto 0);
signal w : std_logic_vector (3 downto 0); 
begin 
z <= ('0'&a + ('0'&b));
w <= '0'&z + "00"&c;
s<=w(0);
d<=w(1);

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用ieee.std_logic_unsigned.all;
实体加法器是
端口(a、b、c:标准逻辑中;
s、 d:输出标准(U逻辑);
终端实体;
加法器的结构是arc_加法器
信号z:std_逻辑_向量(1到0);
信号w:标准逻辑向量(3到0);
开始

z必须使用unsigned来使用“+”运算符进行键入

ieee.numeric\U std.all中包含无符号类型

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity adder is
port (a,b,c : in std_logic;
    s,d : out std_logic);
end entity;

architecture arc_adder of adder is
signal z : std_logic_vector (1 downto 0);
signal w : std_logic_vector (3 downto 0); 
begin 
z <= std_logic_vector(unsigned('0'&a) + unsigned('0'&b));
w <= std_logic_vector(unsigned('0'&z) + unsigned("00"&c));
s<=w(0);
d<=w(1);

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体加法器是
端口(a、b、c:标准逻辑中;
s、 d:输出标准(U逻辑);
终端实体;
加法器的结构是arc_加法器
信号z:std_逻辑_向量(1到0);
信号w:标准逻辑向量(3到0);
开始

z必须使用unsigned来使用“+”运算符进行键入

ieee.numeric\U std.all中包含无符号类型

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity adder is
port (a,b,c : in std_logic;
    s,d : out std_logic);
end entity;

architecture arc_adder of adder is
signal z : std_logic_vector (1 downto 0);
signal w : std_logic_vector (3 downto 0); 
begin 
z <= std_logic_vector(unsigned('0'&a) + unsigned('0'&b));
w <= std_logic_vector(unsigned('0'&z) + unsigned("00"&c));
s<=w(0);
d<=w(1);

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体加法器是
端口(a、b、c:标准逻辑中;
s、 d:输出标准(U逻辑);
终端实体;
加法器的结构是arc_加法器
信号z:std_逻辑_向量(1到0);
信号w:标准逻辑向量(3到0);
开始

z您需要
std_logic_unsigned
做什么?@Staszek因为他错误地使用了
std_logic_vector
而不是
unsigned
类型。分配给w的表达式的可能副本有两个具有相同优先级的运算符,它们将按从左到右的顺序关联,可以用括号显示:
(('0'&z)+“00”)&c。最后的值长度为4,等于“0”&z&c。那不是你想要的。z的二进制值可以是“00”、“01”或“10”。对于进位(c),w可以具有这些值和“11”,因此只需要相同的范围1到0
w您需要
std\u logic\u unsigned
做什么?@Staszek因为他错误地使用了
std\u logic\u vector
而不是
unsigned
类型。分配给w的表达式的可能副本有两个具有相同优先级的运算符,它们将按从左到右的顺序关联,可以用括号显示:
(('0'&z)+“00”)&c。最后的值长度为4,等于“0”&z&c。那不是你想要的。z的二进制值可以是“00”、“01”或“10”。对于进位(c),w可以具有这些值和“11”,因此只需要相同的范围1到0
w如果
z
w
也有类型
unsigned
,这看起来会更整洁。如果
z
w
也有类型
unsigned
,这看起来会更整洁。