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