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