to_integer出错

时间:2017-04-26 16:38:36

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

错误发生在To_integer部分。我不知道我在做什么呢?此前我还使用了numeric_arith和numeric_unsigned.all,然后子程序被编译为conv_integer程序,但ANS和CO区域没有输出。它们被定义为未定义。我附加了波形输出以供参考。请帮忙。 Previous wave output

2 个答案:

答案 0 :(得分:1)

问题似乎是包含对包含numeric_std和numeric_bit的引用的use子句。

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

  

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

     
    

a)如果所考虑的地点在声明的同形异义词的直接范围内,则不会直接看到可见的声明。
    b)如果两个可能的可见声明是同形异义词,一个是显式声明而另一个是隐式声明的,则隐式声明不会直接显示。
    c)具有相同指示符且未被案例b)覆盖的潜在可见声明不能直接显示,除非它们中的每一个都是枚举文字规范或子程序声明。

  

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

  

错误是:**错误:C:/altera/16.0/multiplexer2.vhd(17):(vcom-1078)标识符&#34; unsigned&#34;不是直接可见的。

     

潜在可见的声明是:ieee.NUMERIC_STD.UNSIGNED(子类型声明)ieee.NUMERIC_BIT.UNSIGNED(类型声明)

无符号,类型声明在上面的规则c)下不可见。

正如Jim所说,你没有使用基于类型bit_vector的unsigned类型,所有存在的对象声明都是基于std_logic而不是bit。

此外,16.8.5.1一般性第1段

  

本标准定义了四个用于使用位和标准逻辑值进行算术运算的VHDL包。 NUMERIC_BIT和NUMERIC_BIT_UNSIGNED包基于VHDL类型BIT,而NUMERIC_STD和NUMERIC_STD_UNSIGNED包基于STD_ULOGIC类型。

和第6段(部分):

  

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

您已经证明了不兼容性,试图使用既不是枚举文字也不是子程序的声明(不受重载决策影响)。

如果您的工具已经-2008知道它应该提供错误( 是强制性的,请参见1.3.1)并使用两个条款在同一声明区域中可见是可检测的(虽然不是一个方便的错误检测)。

通常,您应该使用必要的最小使用条款数量,提供设计描述所需的资源,以避免出现这些问题。

注释引用numeric_bit的use子句是不够的。 CI的基本类型是std_ulogic(它的类型是std_logic)。您可以通过将CI表示为数组类型将std_logic转换为无符号除外:

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;

未签名&#39;(&#34;&#34;&amp; CI)符合表达式&#34;&#34; &安培; CI(与CI连接的空数组,类型为unsigned。

见9.3.5合格表达式,第1段:

  

限定表达式是一种基本操作(参见5.1),用于显式声明作为表达式或聚合的操作数的类型,可能还有子类型。

对于数组类型,无符号连接运算符是预定义的,用于连接单维数组类型的值和它的元素类型。请参见9.2.5添加运算符。字符串文字&#34;&#34;长度为零(15.7字符串文字,5.3.2.2索引约束和离散范围,第4段),它的类型是由限定表达式定义的上下文(见9.3.2文字第5段)。

进行上述更改并进行多路复用器分析。它没有经过Minimal, Complete, and Verifiable example的测试。

答案 1 :(得分:0)

1。 to_integer

查找numeric_std包的文档。你不能把std_logic_vector放到to_integer函数中。您必须先将其转换为无符号:

signal a: std_logic_vector(8 downto 0);
signal b: std_logic_vector(8 downto 0);
signal res: integer;
res <= to_integer(unsigned(a) + unsigned(b));

但实际上,在你的情况下,你根本不需要这样做。只需将std_logic_vector强制转换为unsigned(或signed),然后就可以安全地添加它:

tmp <= std_logic_vector(unsigned(A)+unsigned(B)+unsigned(CI));

2。 UUU的事情

首先 - 正如我已经告诉过你的那样 - 如果你想在没有时钟的情况下进行,你必须在灵敏度列表中输入所有输入。但这没有用,因为你正在使用信号。请记住,当您指定某些信号时,它不是立即完成的,而是仅在该过程之后进行调整。后排:

tmp <= std_logic_vector((TO_INTEGER(A)+TO_INTEGER(B)+TO_INTEGER(CI)),9);

tmp尚未包含结果,但仍有UUU。然后在行:

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

您将U分配给ANS和CO。您可以做的是在过程中使用变量,甚至更好 - 放置行:

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;