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

最佳答案

让我们看看您的各种情况。

首先,您只需将连接的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元素构建的一种特定的数组类型。其他示例是unsignedsigned以及您可能创建的任何其他用户定义的类型。

当您将std_logic元素与&串联时,它们具有一种“通用”类型,可以在分配时进行推断,也可以对其进行显式键入标记,但无法转换,因为它们尚不知道类型!这就是使用'的语法起作用的原因,而您的原始尝试却不起作用。

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

关于vhdl - 将std_logic位连接成无符号数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33927058/

10-12 17:13