我正在尝试将两个std_logic位转换为整数,如下所示
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY TEST IS
PORT (sw1, sw0 : IN std_logic;
x : OUT integer RANGE 3 DOWNTO 0);
END ENTITY TEST;
ARCHITECTURE dflow OF TEST IS
SIGNAL mes_sel : integer RANGE 3 DOWNTO 0;
BEGIN
mes_sel <= to_integer(unsigned(std_logic_vector(SW1 & SW0)));
x <= mes_sel;
END ARCHITECTURE dflow;
但编译器不喜欢mes_sel赋值。我收到以下编译器错误消息:
错误(10327):Q4.vhd(92)处的VHDL错误:无法确定运营商的定义&#34;&#34;&amp;&#34;&#34; - 找到了4种可能的定义
我不能将2位std_logic连接到一个向量然后转换吗?或者是别的什么? 问候 d
答案 0 :(得分:6)
错误消息大致告诉您什么是错误的,这不是分配的问题。
GHDL提供了更好的诊断:
ghdl -a test.vhd
test.vhd:13:57:无法解决操作员“&amp;”的重载问题 test.vhd:13:57:可能的解释是:
../../src/ieee/numeric_std.v93:66:18:数组类型“已签名”
../../src/ieee/numeric_std.v93:65:20:数组类型“unsigned”
../../src/ieee/std_logic_1164.v93:69:30:数组类型“std_logic_vector”
../../src/ieee/std_logic_1164.v93:54:31:数组类型“std_ulogic_vector”
ghdl:编译错误
VHDL允许重载运算符,可以通过它们的参数类型(在本例中为std_logic)和它们的返回类型来区分(在这种情况下......好吧......什么?)
显然有4种类型在其上声明了std_logic_vector()
类型转换函数,以及&
运算符采用两个std_logic参数;和ghdl(与你正在使用的任何工具不同)有助于列出它们。
在这种情况下,VHDL(与其他语言不同)坚持你选择一个,而不是任意为你做出隐藏(也可能是错误的)选择。
您可以使用类型标记执行此操作。由于您实际需要unsigned
,显而易见的选择是unsigned'()
(请注意“'”符号,也用于属性)。
mes_sel <= to_integer(unsigned'(SW1 & SW0));
请注意,如果VHDL允许任何更简单的操作,例如to_integer(SW1 & SW0)
,那么它将是非常危险的,因为没有任何东西可以区分有符号和无符号转换,使转换至少不明显,而且很可能是错误的。