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

时间:2016-01-30 13:01:29

标签: 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;

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

  

错误(10327):Q4.vhd(92)处的VHDL错误:无法确定运营商的定义&#34;&#34;&amp;&#34;&#34; - 找到了4种可能的定义

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

1 个答案:

答案 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),那么它将是非常危险的,因为没有任何东西可以区分有符号和无符号转换,使转换至少不明显,而且很可能是错误的。