在下面的代码中,我试图将三个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
元素构建的一种特定的数组类型。其他示例是unsigned
,signed
以及您可能创建的任何其他用户定义的类型。当您将
std_logic
元素与&
串联时,它们具有一种“通用”类型,可以在分配时进行推断,也可以对其进行显式键入标记,但无法转换,因为它们尚不知道类型!这就是使用'
的语法起作用的原因,而您的原始尝试却不起作用。希望能有所帮助。祝好运!
关于vhdl - 将std_logic位连接成无符号数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33927058/