VHDL类型转换 - 找到4种可能的定义

hob*_*Bob 3 vhdl

我正在尝试将两个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;
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢mes_sel赋值.我收到以下编译器错误消息:

错误(10327):Q4.vhd(92)处的VHDL错误:无法确定运算符""和""的定义 - 找到4个可能的定义

我不能将2位std_logic连接到一个向量然后转换吗?或者是别的什么?问候D.

Bri*_*ond 6

错误消息大致告诉您什么是错误的,这不是分配的问题.

GHDL提供了更好的诊断:

ghdl -a test.vhd
test.vhd:13:57:无法解决运算符"&"
test.vhd:13:57的重载:可能的解释是:
../../ src/ieee/num_std.v93: 66:18:数组类型"signed"
../../ 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));
Run Code Online (Sandbox Code Playgroud)

请注意,如果VHDL允许任何更简单的操作,to_integer(SW1 & SW0)那么由于没有区分有符号转换和无符号转换的任何内容,因此它非常危险,因此转换至少是非显而易见的,并且很可能是错误的.

  • @DannyJ是的就是它 - 连接是`&`函数返回的 - 并且有4个这样的函数返回4种不同的类型.我正在做的不是*转换*到`unsigned`而是*规范*如果你愿意,结果应该是无符号的,以消除歧义.(然后`to_integer`是转换).现在,如果我将`SW1&SW0`分配给中间变量或信号,它的声明将指定类型 - 所以没问题.(顺便说一句,它不会花费更多的硬件.所以这是一个可接受的替代解决方案) (2认同)