0

我需要有人检查我的代码并给我一个健全性检查。这是用 VHDL 编写的。Vivado 不断抱怨错误:

[Synth 8-493] 没有这样的设计单元 'onesevenseg'

但是,我可以清楚地看到我的项目中的文件,并且项目管理器源窗口正在以正确的方式列出文件。

这是发生错误的行。

digitOne: entity xil_defaultlib.oneSevenSeg port map (switchIn, sevenSegOut);

这是有错误的顶级文件。它被编译到库xil_defaultlib中。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity oneSevenSegTop is
    Port ( anodeOut : out STD_LOGIC_VECTOR (0 to 7);
           switchIn : in STD_LOGIC_VECTOR (0 to 3);
           sevenSegOut : out STD_LOGIC_VECTOR (0 to 6));
end oneSevenSegTop;

architecture Behavioral of oneSevenSegTop is
component oneSevenSeg 
    Port ( digitIn : in STD_LOGIC_VECTOR (0 to 3);
           segOut : out STD_LOGIC_VECTOR (0 to 6));
end component;
begin

digitOne: entity xil_defaultlib.oneSevenSeg port map (switchIn, sevenSegOut);

anodeOut <= "00000001";

end Behavioral;

这是由上述文件实例化的文件,也编译到库xil_defaultlib中。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity oneSevenSeg is
    Port ( digitIn : in STD_LOGIC_VECTOR (0 to 3);
           segOut : out STD_LOGIC_VECTOR (0 to 6));
end oneSevenSeg;

architecture Behavioral of oneSevenSeg is

begin
process(digitIn)
begin
if digitIn = "0000" then --0
    segOut <= "1000000";
elsif digitIn = "0001" then --1
    segOut <= "1111001";
elsif digitIn = "0010" then --2
    segOut <= "0100100";
elsif digitIn = "0011" then --3
    segOut <= "0110000";
elsif digitIn = "0100" then --4
    segOut <= "0011001";
elsif digitIn = "0101" then --5
    segOut <= "0010010";
elsif digitIn = "0110" then --6
    segOut <= "0000010";
elsif digitIn = "0111" then --7
    segOut <= "1111000";
elsif digitIn = "1000" then --8
    segOut <= "0000000";
elsif digitIn = "1001" then --9
    segOut <= "0011000";
else                   -- error
    segOut <= "0110110";
end if;

end process;

end Behavioral;
4

2 回答 2

3

用 ghdl 尝试你的两个文件:

% ghdl -a --work=xil_defaultlib onesevenseg.vhdl
% ghdl -a -P。onesevensegtop.vhdl
onesevensegtop.vhdl:17:18:没有声明“xil_defaultlib”
ghdl:编译错误

因此,问题中列出的第二个设计单元很好地分析到了一个名为 xil_defaultlib 的新工作库中。

第二个分析是针对顶级单元的,-P 标志告诉它在当前位置查找其他库。

并且该分析失败了,因为名称 xil_defaultlib 尚未声明。

IEEE Std 1076-2008, 13.2 设计库:

库子句定义主机环境中设计库的逻辑名称。库子句作为上下文子句的一部分出现在设计单元的开头或上下文声明中。
...
library 子句定义的每个逻辑名称都表示主机环境中的一个设计库。

在不告诉分析器简单名称xil_defaultlib引用主机环境中的库的情况下,名称的含义是未知的。

如果前缀不是库逻辑名称,则它必须是设计单元,但在库工作、库 IEEE 或库 std 中不知道该名称:

12.3 可见性:

可见性是通过选择或直接的。通过选择在定义如下的位置可以看到声明:

a) 对于包含在库中的主要单元:位于所选名称的后缀位置,其前缀表示库。

在 13.2 中进一步:

除了上下文声明和包 STANDARD 之外的每个设计单元都假定包含以下隐式上下文项作为其上下文子句的一部分:

图书馆性病,工作;使用标准。全部

注意库逻辑名称可以隐式定义也可以显式定义。没有隐含的定义xil_defaultlib

添加一个库子句,使所选名称的前缀xil_defaultlib.oneSevenSeg可见。

这可以通过 library 子句直接完成,使库逻辑名称IEEE在未命名的顶级文件中可见:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library xil_defaultlib;

entity oneSevenSegTop is
...

所以我们做出了改变,并且:

% ghdl -a -P。onesevensegtop.vhdl
%

没有错误。

于 2016-01-28T20:32:45.447 回答
0

尽管@user1155120 的答案是正确的,但这里的根本问题是您没有以预期的方式引用实体。这xil_defaultlib是默认情况下 Xilinx Vivado 将您的设计编译到的库的名称。您根本不需要引用它,而是利用work用于引用当前正在编译的库的想法:

digitOne: entity work.oneSevenSeg port map (switchIn, sevenSegOut);

这样,您的代码就不会与 Vivado 决定编译您的项目的特定方式相关联。当您可以更轻松地使用该方法时,xil_defaultlib在整个代码中添加对的引用是没有意义的。work

于 2016-01-29T09:12:32.757 回答