将std_logic位连接成无符号数

Fus*_*uck 2 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;
Run Code Online (Sandbox Code Playgroud)

wjl*_*wjl 5

让我们来看看你的各种情况.

首先,你只是简单地将连接std_logicunsigned信号分配给一个信号,正如你所说,它可以工作!

decoded <= a & b & c;
Run Code Online (Sandbox Code Playgroud)

所以,你说这个工作正常(它应该!)并且简单明了,那么为什么你有问题呢?unsigned根据定义,字面意思是由std_logic's 制成的.这里没什么奇怪的.这是写这个的最好方法.


在这里,您尝试进行一系列转换:

decoded <= unsigned(std_logic_vector(a & b & c));
Run Code Online (Sandbox Code Playgroud)

它失败了,因为它无法转换某些数组类型的std_logic,它还无法推断(&运算符的结果)为a std_logic_vector.但是这个语法虽然看起来几乎一样,但应该做你想要的,因为它不是做转换,而只是告诉编译器表达式的类型:

decoded <= unsigned(std_logic_vector'(a & b & c));
Run Code Online (Sandbox Code Playgroud)

同样,这可以通过相同的方式修复:

decoded <= unsigned(a & b & c);
Run Code Online (Sandbox Code Playgroud)

请改用:

decoded <= unsigned'(a & b & c);
Run Code Online (Sandbox Code Playgroud)

我看到的主要误解是你可能认为std_logic联合在一起的方式与某种方式相同std_logic_vector.这是不是在所有的真实.A std_logic_vector只是一个由std_logic元素构建的特定数组类型.其他示例是unsigned,signed和您可以创建的任何其他用户定义类型.

当你连接std_logic元素时&,它们有一种"通用"类型,可以在赋值时推断,或者可以显式地键入标记,但不能转换,因为它们还没有已知的类型!这就是为什么语法与'作品,原始尝试没有.

希望有所帮助.祝好运!