Vhdl 转换为_整数时出错 ieee库; 使用ieee.std_logic_1164.ALL; 使用ieee.numeric_bit.ALL; 使用ieee.numeric_std.ALL; 实体多路复用器 端口(A,B:标准逻辑向量(7到0); CI:标准逻辑; CO:输出标准逻辑; ANS:输出标准逻辑向量(7到0); OP:标准逻辑向量(1到0); EN:标准逻辑中); 终端复用器; 多路复用器的体系结构是 信号tmp:std_逻辑_向量(8到0); 开始 进程(EN)开始 如果(EN='1'),则 案例OP是 当“00”=> tmp 1。到u整数

Vhdl 转换为_整数时出错 ieee库; 使用ieee.std_logic_1164.ALL; 使用ieee.numeric_bit.ALL; 使用ieee.numeric_std.ALL; 实体多路复用器 端口(A,B:标准逻辑向量(7到0); CI:标准逻辑; CO:输出标准逻辑; ANS:输出标准逻辑向量(7到0); OP:标准逻辑向量(1到0); EN:标准逻辑中); 终端复用器; 多路复用器的体系结构是 信号tmp:std_逻辑_向量(8到0); 开始 进程(EN)开始 如果(EN='1'),则 案例OP是 当“00”=> tmp 1。到u整数,vhdl,Vhdl,查找有关数字_标准包的文档。不能将标准逻辑向量放入整数函数。您必须首先将其强制转换为未签名: library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_bit.ALL; use ieee.numeric_std.ALL; entity multiplexer is port (A,B: in std_logic_vector (7 downto 0); CI: in std_logic; CO: out std_logic; ANS:

查找有关数字_标准包的文档。不能将标准逻辑向量放入整数函数。您必须首先将其强制转换为未签名:

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_bit.ALL;
use ieee.numeric_std.ALL;
entity multiplexer is
port (A,B: in std_logic_vector (7 downto 0);
CI: in std_logic;
CO: out std_logic;
ANS: out std_logic_vector (7 downto 0);
OP: in std_logic_vector(1 downto 0);
EN: in std_logic);
end multiplexer;
architecture archi of multiplexer is 
signal tmp: std_logic_vector (8 downto 0);
begin
process (EN) begin
if (EN = '1') Then
case OP is
when "00" =>
tmp <= std_logic_vector((TO_INTEGER(A)+TO_INTEGER(B)+TO_INTEGER (CI)),9);
ANS<= tmp(7 downto 0);
CO <= tmp(8);
when "01" =>
tmp <= std_logic_vector((to_integer(A)-to_integer(B)+to_integer (CI)),9);
ANS<= tmp(7 downto 0);
CO <= tmp(8);
when others => NULL;
end case;
else
NULL;
end if;
end process;
end archi;
信号a:std_逻辑_向量(8到0);
信号b:标准逻辑向量(8到0);
信号分辨率:整数;

res问题似乎是use子句包含对软件包数字\u std和数字\u位的引用

参见IEEE 1076-2008 12.4使用条款,第8段:

为了确定由使用子句在给定位置直接可见哪些声明,请考虑由其范围包含该位置的所有使用子句所标识的声明集。此集合中的任何声明都可能是可见的声明。除以下三种情况外,潜在可见声明实际上是直接可见的:

a) 如果所考虑的位置在声明同形词的直接范围内,则潜在可见的声明不会直接可见。
b) 如果两个可能可见的声明是同形词,一个显式声明,另一个隐式声明,则隐式声明不会直接可见。
c) 具有相同指示符且不包含在案例b)中的潜在可见声明不会直接可见,除非每个声明都是枚举文字规范或子程序声明

注意,您有两个可能可见的声明,例如:

错误为:**错误:C:/altera/16.0/multiplexer2。vhd(17):(vcom-1078)标识符“unsigned”不直接可见

可能可见的声明有:ieee.NUMERIC\u STD.UNSIGNED(子类型声明)ieee.NUMERIC\u BIT.UNSIGNED(类型声明)

未签名,根据上述规则c)类型声明不可见

正如Jim所指出的,您不使用基于类型bit_vector的类型unsigned,所有存在的对象声明都基于std_逻辑,而不是bit

此外,16.8.5.1总则第1段

本标准定义了四个用于使用位和标准逻辑值的算术的VHDL包。数字位和数字位无符号包基于VHDL类型位,而数字位STD和数字位STD无符号包基于类型STD ULOGIC

和第6段(部分):

这四个包互不兼容,在任何给定的设计单元中只能使用一个包

您已经演示了这种不兼容性,尝试使用既不是枚举文字也不是子程序(不受重载解析的约束)的声明

如果您的工具已经-2008意识到它应该提供了一个错误(应是强制性的,请参见1.3.1),并且在同一声明区域中可以检测到这两个工具的使用条款(尽管这不是一个方便检测的错误)

通常,您应该使用所需的最小数量的use子句,提供设计描述所需的资源,以避免此类问题

注释掉引用数字位的use子句是不够的。CI的基本类型为标准逻辑(其类型为标准逻辑)。通过将CI表示为数组类型,可以将std_逻辑转换为无符号逻辑:

architecture archi of multiplexer is
    signal tmp: std_logic_vector (8 downto 0);
begin

    tmp <= std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI)) when EN = '1' and OP = "00" else
           std_logic_vector(unsigned(A)-unsigned(B)+unsigned(CI)) when EN = '1' and OP = "01" else
           (others => '0');
    ANS<= tmp(7 downto 0);
    CO <= tmp(8);

end archi;
ieee库;
使用ieee.std_logic_1164.ALL;
--使用ieee.numeric_bit.ALL;
使用ieee.numeric_std.ALL;
实体多路复用器
港口(
A、 B:标准逻辑向量(7到0);
CI:标准逻辑;
CO:输出标准逻辑;
ANS:输出标准逻辑向量(7到0);
OP:标准逻辑向量(1到0);
EN:标准逻辑中);
终端复用器;
多路复用器的体系结构是
信号tmp:std_逻辑_向量(8到0);
开始
tmp'0');
--tmp'0');

安妮丝,请用你的密码。这是您第二次发布非预期代码,而且无法阅读。非常抱歉。我会确保从下一次开始就准备好。请编辑你的帖子。这对其他人很有用。我不会要求编辑你的原始帖子来形成我的答案。我只是想问你,你的代码来自于最初的问题。请把它还原成原版。若你们有额外的问题,把它写在原来的问题下面,可能写在横线下面,然后用大字编辑。请注意,有关Stackoverflow的问题不仅对您有用,而且对其他人也很有用。请删除软件包参考:“使用ieee.numeric_bit.ALL;”。使用这些数学软件包时,在使用std U逻辑类型族时使用numeric_std,在使用bit类型族时使用numeric_bit。您还应该从库列表中删除ieee.numeric_bit.all
。当然,谢谢。问题是(也许你能帮忙?)原来的问题完全不同。看看历史。Asker不想将其还原为原始版本。我想在他回复问题并修复代码格式后进行所有这些编辑。显然他不再在乎了。嗯。。。那就不值得这么麻烦了。这只有在每个人都遵守规则的情况下才有效;)
tmp <= std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI));
tmp <= std_logic_vector((TO_INTEGER(A)+TO_INTEGER(B)+TO_INTEGER(CI)),9);
ANS<= tmp(7 downto 0);
CO <= tmp(8);
ANS<= tmp(7 downto 0);
CO <= tmp(8);
library ieee;

use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
entity multiplexer is
    port (
        A,B: in std_logic_vector (7 downto 0);
        CI: in std_logic;
        CO: out std_logic;
        ANS: out std_logic_vector (7 downto 0);
        OP: in std_logic_vector(1 downto 0);
        EN: in std_logic);
end multiplexer;

architecture archi of multiplexer is
    signal tmp: std_logic_vector (8 downto 0);
begin
    process (EN) begin
        if (EN = '1') Then
            case OP is
            when "00" =>
                tmp <= std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI));
            when "01" =>
                tmp <= std_logic_vector(unsigned(A)-unsigned(B)+unsigned(CI));
            when others => NULL;
            end case;
            else
                NULL;
        end if;
    end process;

    ANS<= tmp(7 downto 0);
    CO <= tmp(8);

end archi;
architecture archi of multiplexer is
    signal tmp: std_logic_vector (8 downto 0);
begin

    tmp <= std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI)) when EN = '1' and OP = "00" else
           std_logic_vector(unsigned(A)-unsigned(B)+unsigned(CI)) when EN = '1' and OP = "01" else
           (others => '0');
    ANS<= tmp(7 downto 0);
    CO <= tmp(8);

end archi;
library ieee;
use ieee.std_logic_1164.ALL;
-- use ieee.numeric_bit.ALL;
use ieee.numeric_std.ALL;
entity multiplexer is
port (
    A,B: in std_logic_vector (7 downto 0);
    CI: in std_logic;
    CO: out std_logic;
    ANS: out std_logic_vector (7 downto 0);
    OP: in std_logic_vector(1 downto 0);
    EN: in std_logic);
end multiplexer;
architecture archi of multiplexer is 
    signal tmp: std_logic_vector (8 downto 0);
begin
    tmp <=  std_logic_vector(unsigned(A)+unsigned(B)+unsigned'(""& CI)) when EN = 
    '1' and OP = "00" else
    std_logic_vector(unsigned(A)-unsigned(B)+unsigned'(""& CI)) when EN = '0' and 
    OP = "01" else
    (others => '0');
    -- tmp <=  std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI)) when EN =
    -- '1' and OP = "00" else
    -- std_logic_vector(unsigned(A)-unsigned(B)+unsigned(CI)) when EN = '0' and
    -- OP = "01" else
    -- (others => '0');
    ANS<= tmp(7 downto 0);
    CO <= tmp(8);
end archi;