全加器 3 位 std_logic_vector
full adder 3-bit std_logic_vector
我正在学习 vhdl,但在模拟 3 位全加器时出现错误
用 std_logic_vector 实现(因为能够使用“+”操作)
只是我们老师给我们的一个例子,
如果这是一个简单的问题,请原谅我...
这是代码:
Library ieee;
use ieee.std_logic_1164.all;
entity adder_3_bit is
port(
a,b : in std_logic_vector(2 downto 0);
cin : in std_logic;
cout : out std_logic;
sum : out std_logic_vector(2 downto 0)
);
end adder_3_bit;
architecture behav of adder_3_bit is
signal temp : std_logic_vector(3 downto 0);
begin
temp <= ('0' & a) + ('0' & b) + ("000" & cin);
sum <= temp(2 downto 0);
cout <= temp(3);
end behav;
当 temp 试图在 2 位数组的末尾添加 0 时出现错误,
它说:
Line 15: found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"ERROR:HDLCompiler:854
这里的每个人都是工作代码:
Library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder_3_bit is
port (
a,b : in std_logic_vector(2 downto 0);
cin : in std_logic;
cout : out std_logic;
sum : out std_logic_vector(2 downto 0)
);
end adder_3_bit;
architecture behav of adder_3_bit is
signal temp : std_logic_vector(3 downto 0);
begin
temp <= std_logic_vector(('0' & unsigned (a)) + ('0' & unsigned(b)) + ("000" & cin));
sum <= temp(2 downto 0);
cout <= temp(3);
end behav;
没有任何额外的库,您无法添加 std_logic_vector
类型的信号。没有定义接受两个 std_logic_vector
参数的 +
运算符。执行此操作的正确方法是包含 numeric_std 包并将您的参数转换为 unsigned 以进行添加。
use ieee.numeric_std.all;
temp <= std_logic_vector(unsigned('0' & a) + unsigned('0' & b) + unsigned("000" & cin));
实际上,大多数人不会为这样一个简单的操作创建一个完整的实体,因此转换较少,因为您的信号已经是正确的数据类型(数字使用无符号,位集合使用 std_logic_vector), 这就是为什么这看起来有点尴尬。
您也可以通过概要包 (std_logic_unsigned) 执行此操作,它看起来会更干净一些(无转换),但该包不是 VHDL 标准的一部分,它的使用已被已弃用。
我正在学习 vhdl,但在模拟 3 位全加器时出现错误 用 std_logic_vector 实现(因为能够使用“+”操作) 只是我们老师给我们的一个例子, 如果这是一个简单的问题,请原谅我... 这是代码:
Library ieee;
use ieee.std_logic_1164.all;
entity adder_3_bit is
port(
a,b : in std_logic_vector(2 downto 0);
cin : in std_logic;
cout : out std_logic;
sum : out std_logic_vector(2 downto 0)
);
end adder_3_bit;
architecture behav of adder_3_bit is
signal temp : std_logic_vector(3 downto 0);
begin
temp <= ('0' & a) + ('0' & b) + ("000" & cin);
sum <= temp(2 downto 0);
cout <= temp(3);
end behav;
当 temp 试图在 2 位数组的末尾添加 0 时出现错误, 它说:
Line 15: found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"ERROR:HDLCompiler:854
这里的每个人都是工作代码:
Library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder_3_bit is
port (
a,b : in std_logic_vector(2 downto 0);
cin : in std_logic;
cout : out std_logic;
sum : out std_logic_vector(2 downto 0)
);
end adder_3_bit;
architecture behav of adder_3_bit is
signal temp : std_logic_vector(3 downto 0);
begin
temp <= std_logic_vector(('0' & unsigned (a)) + ('0' & unsigned(b)) + ("000" & cin));
sum <= temp(2 downto 0);
cout <= temp(3);
end behav;
没有任何额外的库,您无法添加 std_logic_vector
类型的信号。没有定义接受两个 std_logic_vector
参数的 +
运算符。执行此操作的正确方法是包含 numeric_std 包并将您的参数转换为 unsigned 以进行添加。
use ieee.numeric_std.all;
temp <= std_logic_vector(unsigned('0' & a) + unsigned('0' & b) + unsigned("000" & cin));
实际上,大多数人不会为这样一个简单的操作创建一个完整的实体,因此转换较少,因为您的信号已经是正确的数据类型(数字使用无符号,位集合使用 std_logic_vector), 这就是为什么这看起来有点尴尬。
您也可以通过概要包 (std_logic_unsigned) 执行此操作,它看起来会更干净一些(无转换),但该包不是 VHDL 标准的一部分,它的使用已被已弃用。