将std_logic位连接成无符号数

时间:2015-11-25 21:53:30

标签: vhdl

在下面的代码中,我尝试连接三个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;

1 个答案:

答案 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" : ""; } 的语法有效的原因,原始尝试没有。

希望有所帮助。祝你好运!