在下面的代码中,我尝试连接三个std_logic输入以生成一个三位无符号输出。执行此操作所需的语法似乎不直观,我不明白。有人解释这里发生了什么?
当我在评论中说“失败”时,我的意思是综合会产生以下错误消息:found '4' definitions of operator "&", cannot determine exact overloaded matching definition
。然后它在numeric_std中给出2个行号,在std_1164中给出2个行号(但我没有要检查的那些特定版本的源文件)。
use IEEE.NUMERIC_STD.ALL;
entity Thingy is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : in STD_LOGIC;
clk : in STD_LOGIC;
decoded : out UNSIGNED (2 downto 0));
end Thingy;
architecture Behavioral of Thingy is
begin
process (clk)
variable dec : STD_LOGIC_VECTOR(2 downto 0) := (others => '0');
begin
if rising_edge(clk) then
-- Intermediate variable, works ok.
dec := a & b & c;
decoded <= unsigned(dec);
-- Also ok. Implicit conversion from std_logic to unsigned?
-- decoded <= a & b & c;
-- No intermediate variable, fails.
-- decoded <= unsigned(std_logic_vector(a & b & c));
-- Fails.
-- decoded <= unsigned(a & b & c);
end if;
end process;
end Behavioral;
答案 0 :(得分:5)
让我们看看你的各种情况。
首先,您只需将连接的std_logic
指定给unsigned
信号,并且正如您所说,它可以正常工作!
decoded <= a & b & c;
所以,你说这个工作正常(它应该!)并且简单明了,那么为什么你有问题呢?根据定义,unsigned
字面上由std_logic
组成。decoded <= unsigned(std_logic_vector(a & b & c));
。这里没什么奇怪的。这是写这篇文章的最佳方式。
在这里,您尝试进行一系列转换:
&
它失败了,因为它无法将某些数组类型的std_logic转换为std_logic_vector
运算符)而无法将decoded <= unsigned(std_logic_vector'(a & b & c));
运算符的结果转换为decoded <= unsigned(a & b & c);
。但是这个语法虽然看起来几乎一样,但应该做你想要的,因为它不进行转换,而只是告诉编译器表达式的类型:
decoded <= unsigned'(a & b & c);
同样,这可以通过相同的方式解决:
std_logic
请改用:
std_logic_vector
我看到的主要误解是你可能认为std_logic_vector
连在一起的方式与std_logic
有点相同。这根本不是 。 unsigned
只是一个由signed
元素构建的特定数组类型。其他示例包括std_logic
,&
以及您可能创建的任何其他用户定义类型。
当您将'
元素与Collection.update(
{_id: docId, 'points.id': pointId},
{$set: {'points.$.content': content}}
);
连接起来时,它们会有一种&#34;通用&#34;可以在分配时推断出来的类型,或者可以明确键入标记的类型,但不能转换,因为它们还没有已知的类型!这就是var i;
var x = document.getElementById("palette");
var items = x.getElementsByTagName("li");
for (i = 0; i < items.length; i++){
var item = items[i];
item.style.borderColor = item.className == e ? "red" : "";
}
的语法有效的原因,原始尝试没有。
希望有所帮助。祝你好运!