Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL类型转换-找到4个可能的定义_Vhdl - Fatal编程技术网

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

VHDL类型转换-找到4个可能的定义,vhdl,Vhdl,我正在尝试将两个std_逻辑位转换为一个整数,如下所示 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 dflo

我正在尝试将两个std_逻辑位转换为一个整数,如下所示

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;
IEEE库;
使用IEEE.std_logic_1164.ALL;
使用IEEE.numeric_std.ALL;
实体测试是
端口(sw1、sw0:std_逻辑中;
x:输出整数范围3到0);
终端实体测试;
测试的架构数据流是
信号选择:整数范围3至0;
开始

mes_sel错误消息大致告诉您出了什么问题,这不是作业的问题

GHDL提供了更好的诊断:

ghdl-一种测试。vhd
test.vhd:13:57:无法解决运算符“&”
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_逻辑)和返回类型来区分(在本例中为…嗯…什么?)

显然有4种类型,其中声明了一个
std\u logic\u vector()
类型转换函数,以及一个
&
运算符,其中包含两个std\u逻辑参数;ghdl(与您使用的任何工具不同)会列出它们

在这种情况下,VHDL(与其他一些语言不同)坚持让您选择一种,而不是随意为您做出隐藏(可能是错误的)选择

您可以使用类型标记来执行此操作。由于您实际上需要一个
无符号的
,因此明显的选择是
无符号的'()
(注意“'”符号,也用于属性)


它不喜欢什么?它是否发出了错误信息或其他什么?(顺便说一句,您可以直接从两个std_逻辑形成一个
无符号
,应该不需要通过std_逻辑_向量)如果我正确地遵循,那么合成工具需要一个提示,说明在进行转换之前,两个std_逻辑位的串联也会产生什么结果,因为在std库中包含的重载函数中有4个定义?这听起来像是我在以正确的方式思考这个问题吗?一如既往,谢谢你的回复。你说得对。实际上加载了3个包:VHDL(库标准)中的默认类型和函数,以及IEEE库中的
std_逻辑_1164
numeric_标准
。另外,如果您的实体只是在进行转换,那么最好将代码移动到函数中。@DannyJ是的,就是这样,
&
函数返回的是串联,有4个这样的函数返回4种不同的类型。我所做的不是转换为
unsigned
,而是一个规范,如果您愿意的话,该规范要求结果应该是unsigned,以消除歧义。(然后,
到_integer
是一种转换)。现在,如果我将
SW1&SW0
赋值给一个中间变量或信号,那么它的声明将指定类型——因此没有问题。(顺便说一句,它不需要更多的硬件。因此这是一个可接受的替代解决方案)如果您有一个符合-2008标准的VHDL工具和指定的包
numeric\u std\u unsigned
而不是
numeric\u std
,那么您可以将赋值表示为
mes\u sel
mes_sel <= to_integer(unsigned'(SW1 & SW0));