超群天晴

【原创】xilinx IP建立向导创建的目录和文件都是做什么的?----由错误ERROR:HDLCompiler:Instantiating from unknown module

0
阅读(2525)

使用了XPS中建立 和导入 IP 向导 (简称ipwiz),默认的源码文件只有hdl/verilog目录下的"userlogic.v"和hdl/vhdl目录下的"ipname.vhd"文件。当我们的设计变复杂了,需要更多的设计文件如.v、.vhd、.ngc等文件和多个模块/实体的时候,如果不进行一些设置,编译器会提示找不到module的错误提示:ERROR:HDLCompiler:Instantiating from unknown module 。怎样才能让编译器找到我们所有的设计文件和模块呢?

例如,这几天我做了一个字符VGA的IP核,IP的名字是axi_vga,hdl目录下的设计文件结构如下:

复制代码
1├─data
2│ axi_vga_v2_1_0.mpd
3│ axi_vga_v2_1_0.pao
4│ _axi_vga_xst.prj
5
6├─devl
7│ create.cip
8│ ipwiz.log
9│ ipwiz.opt
10│ README.txt
11
12└─hdl
13├─verilog
14│ CGROM.v
15│ DPBRAM.v
16user_logic.v
17│ vga_sync.v
18
19└─vhdl
20axi_vga.vhd
21DCM1.vhd

复制代码

除了user_logic.v和axi_vga.vhd文件是由ipwiz生成的,其他的设计文件均是后续添加上的。将IP导入到ARM PS系统后,进行DRC检查,再运行bit生成,会出现以下错误提示:

ERROR:HDLCompiler:1654-"D:/_prj/Xilinx/Zynq_new/AXI_Master_VGA_3/pcores/axi_vga_v1_00_a/hdl/verilog/user_logic.v"Line232:Instantiating from unknown module < vga_sync >
ERROR:
EDK:546- Aborting XST flow execution!


错误不止这一条,其他的设计文件如CGROM.v、DPBRAM.v、user_logic.v和DCM1.vhd都出现找不到module的错误。这就很奇怪了,因为设计文件都在同一个目录下啊,为什么编译器会找不到呢?

为了知道这个错误产生的原因并解决它,就需要详细了解ipwiz产生的目录和文件了。

ipwiz产生的目录有三个,我们一一分析。

1、 hdl目录

hdl目录里面有所有的设计文件,包括.v和.vhd的。因为AXI总线接口模块都是以VHDL语言描述,xilinx为了方便管理不同类型的设计文件,因而细分了verilog和vhdl两个文件夹存放设计文件。

2、 devl目录

在使用ipwiz向导时,有一个可选择项是是否需要生产测试ise工程,如果选择了,那么这个目录将会生产测试用的ise工程,如果没有选择,那么devl目录只会保留几个log文件。

3、data目录

data目录存放的是IP的配置文件,如.prj 文件、.mpd 文件和.pao 文件等。

.mpd(Microprocessor Peripheral Defination,外设定义)文件

.mpd文件定义了外设的互联接口,包括和AXI总线的信号以及对外信号。在(原创)《一步一步学ZedBoard & Zynq》些列(四):基于AXI Lite 总线的从设备IP设计中,我们通过修改这个文件将告诉ARM PS系统,这个IP有8个输出引脚,并通过修改system.ucf约束连接到zynq的外部引脚上。.mpd文件内容如下:

复制代码
1###################################################################
2##
3## Name : axi_vga
4## Desc : Microprocessor Peripheral Description
5## : Automatically generated by PsfUtility
6##
7###################################################################
8
9BEGIN axi_vga
10
11## Peripheral Options
12OPTION IPTYPE =PERIPHERAL
13OPTION IMP_NETLIST =TRUE
14OPTION HDL =MIXED
15OPTION IP_GROUP = MICROBLAZE:USER
16OPTION DESC =AXI_VGA
17OPTION ARCH_SUPPORT_MAP = (others=DEVELOPMENT)
18
19
20## Bus Interfaces
21BUS_INTERFACE BUS = S_AXI, BUS_STD = AXI, BUS_TYPE =SLAVE
22
23## Generics for VHDL or Parameters for Verilog
24PARAMETER C_S_AXI_DATA_WIDTH =32, DT = INTEGER, BUS = S_AXI, ASSIGNMENT =CONSTANT
25PARAMETER C_S_AXI_ADDR_WIDTH =32, DT = INTEGER, BUS = S_AXI, ASSIGNMENT =CONSTANT
26PARAMETER C_S_AXI_MIN_SIZE =0x000001ff, DT = std_logic_vector, BUS =S_AXI
27PARAMETER C_USE_WSTRB =0, DT =INTEGER
28PARAMETER C_DPHASE_TIMEOUT =8, DT =INTEGER
29PARAMETER C_BASEADDR =0xffffffff, DT = std_logic_vector, MIN_SIZE =0x200, PAIR = C_HIGHADDR, ADDRESS = BASE, BUS =S_AXI
30PARAMETER C_HIGHADDR =0x00000000, DT = std_logic_vector, PAIR = C_BASEADDR, ADDRESS = HIGH, BUS =S_AXI
31PARAMETER C_FAMILY = virtex6, DT =STRING
32PARAMETER C_NUM_REG =1, DT =INTEGER
33PARAMETER C_NUM_MEM =1, DT =INTEGER
34PARAMETER C_SLV_AWIDTH =32, DT =INTEGER
35PARAMETER C_SLV_DWIDTH =32, DT =INTEGER
36PARAMETER C_S_AXI_PROTOCOL = AXI4LITE, TYPE = NON_HDL, ASSIGNMENT = CONSTANT, DT = STRING, BUS =S_AXI
37
38## Ports
39PORT HS ="", DIR =O
40PORT VS ="", DIR =O
41PORT RED ="", DIR = O,VEC=[3:0]
42PORT GREEN ="", DIR = O,VEC=[3:0]
43PORT BLUE ="", DIR = O,VEC= [3:0]
44PORT S_AXI_ACLK ="", DIR = I, SIGIS = CLK, BUS =S_AXI
45PORT S_AXI_ARESETN = ARESETN, DIR = I, SIGIS = RST, BUS =S_AXI
46PORT S_AXI_AWADDR = AWADDR, DIR = I,VEC= [(C_S_AXI_ADDR_WIDTH-1):0], ENDIAN = LITTLE, BUS =S_AXI
47PORT S_AXI_AWVALID = AWVALID, DIR = I, BUS =S_AXI
48PORT S_AXI_WDATA = WDATA, DIR = I,VEC= [(C_S_AXI_DATA_WIDTH-1):0], ENDIAN = LITTLE, BUS =S_AXI
49PORT S_AXI_WSTRB = WSTRB, DIR = I,VEC= [((C_S_AXI_DATA_WIDTH/8)-1):0], ENDIAN = LITTLE, BUS =S_AXI
50PORT S_AXI_WVALID = WVALID, DIR = I, BUS =S_AXI
51PORT S_AXI_BREADY = BREADY, DIR = I, BUS =S_AXI
52PORT S_AXI_ARADDR = ARADDR, DIR = I,VEC= [(C_S_AXI_ADDR_WIDTH-1):0], ENDIAN = LITTLE, BUS =S_AXI
53PORT S_AXI_ARVALID = ARVALID, DIR = I, BUS =S_AXI
54PORT S_AXI_RREADY = RREADY, DIR = I, BUS =S_AXI
55PORT S_AXI_ARREADY = ARREADY, DIR = O, BUS =S_AXI
56PORT S_AXI_RDATA = RDATA, DIR = O,VEC= [(C_S_AXI_DATA_WIDTH-1):0], ENDIAN = LITTLE, BUS =S_AXI
57PORT S_AXI_RRESP = RRESP, DIR = O,VEC= [1:0], BUS =S_AXI
58PORT S_AXI_RVALID = RVALID, DIR = O, BUS =S_AXI
59PORT S_AXI_WREADY = WREADY, DIR = O, BUS =S_AXI
60PORT S_AXI_BRESP = BRESP, DIR = O,VEC= [1:0], BUS =S_AXI
61PORT S_AXI_BVALID = BVALID, DIR = O, BUS =S_AXI
62PORT S_AXI_AWREADY = AWREADY, DIR = O, BUS =S_AXI
63
64END

复制代码

其中39~43行


PORT HS ="", DIR =O PORT VS="", DIR =O PORT RED="", DIR = O,VEC=[3:0] PORT GREEN="", DIR = O,VEC=[3:0] PORT BLUE="", DIR = O,VEC= [3:0]

是定义的对外引脚信号,其他均为AXI内部互联接口。

.prj文件

.prj该包含了IP所需要使用的文件以及路径。Ipwiz生成默认的.prj文件内容如下:

复制代码
1 vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/proc_common_pkg.vhd"
2vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/ipif_pkg.vhd"
3vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/or_muxcy.vhd"
4vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/or_gate128.vhd"
5vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/family_support.vhd"
6vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/pselect_f.vhd"
7vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/counter_f.vhd"
8vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/address_decoder.vhd"
9vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/slave_attachment.vhd"
10vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/axi_lite_ipif.vhd"
11vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/soft_reset.vhd"
12verilog axi_vga_v1_00_a "../hdl/verilog/user_logic.v"
13vhdl axi_vga_v1_00_a "../hdl/vhdl/axi_vga.vhd"

复制代码

可以看到,这个IP除了使用ISE的提供的库文件(来完成AXI接口和协议),并把它们定义成库proc_common_v3_00_a和库axi_lite_ipif_v1_01_a;同时这个IP还使用到了两个默认生成的设计源文件user_logic.v和axi_vga.vhd,并把它们定义到库axi_vga_v1_00_a中,而这个库就是我们IP的名字。

.pao(Peripheral Analyze Order,编译顺序)文件

.pao文件定义了需要编译哪写HDL文件且以什么样的顺序编译。ipwiz生成的.pao文件内容如下:

复制代码
##############################################################################
## Filename: D:/_prj/Xilinx/Zynq_new/AXI_Master_VGA_2/pcores/axi_vga_v1_00_a/data/axi_vga_v2_1_0.pao
## Description: Peripheral Analysis Order
## Date: Mon Nov 12 15:38:45 2012 (by Create and Import Peripheral Wizard)
##############################################################################


lib proc_common_v3_00_a all
lib axi_lite_ipif_v1_01_a all
lib axi_vga_v1_00_a user_logic verilog
lib axi_vga_v1_00_a axi_vga vhdl

复制代码

可以看到,对于在.prj文件中定义的文件和库,编译器会编译库proc_common_v3_00_a和库axi_lite_ipif_v1_01_a里面的所有实体;同时也将使用axi_vga_v1_00_a库中的user_logic实体,它来自于一个verilog类型文件,将使用axi_vga实体,它来自于一个vhdl类型的文件。同时编译顺序也确定下来。

由以上的分析可以知道,data目录下的文件信息都非常重要,.mpd文件定义了外设的接口,.prj文件定义了IP所需要使用的文件以及路径,而.pao定义了需要编译哪写源文件以及使用什么样的顺序进行编译。知道了这些,对于最开始出现的那个问题,我们就知道该如何解决了:

1、 修改data目录下的.prj文件,把所有设计源文件都添加到其中;

2、 修改data目录下的.pao文件,把所有设计实体都添加到其中。

修改完的.prj文件内容如下

复制代码
1 vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/proc_common_pkg.vhd"
2vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/ipif_pkg.vhd"
3vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/or_muxcy.vhd"
4vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/or_gate128.vhd"
5vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/family_support.vhd"
6vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/pselect_f.vhd"
7vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/counter_f.vhd"
8vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/address_decoder.vhd"
9vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/slave_attachment.vhd"
10vhdl axi_lite_ipif_v1_01_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/axi_lite_ipif_v1_01_a/hdl/vhdl/axi_lite_ipif.vhd"
11vhdl proc_common_v3_00_a"C:\Xilinx\14.2\ISE_DS\EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/soft_reset.vhd"
12 verilog axi_vga_v1_00_a "../hdl/verilog/DPBRAM.v"
13 verilog axi_vga_v1_00_a "../hdl/verilog/CGROM.v"
14 verilog axi_vga_v1_00_a "../hdl/verilog/vga_sync.v"
15 vhdl axi_vga_v1_00_a "../hdl/vhdl/DCM1.vhd"
16 verilog axi_vga_v1_00_a "../hdl/verilog/user_logic.v"
17 vhdl axi_vga_v1_00_a "../hdl/vhdl/axi_vga.vhd"

复制代码

修改完的.pao文件内容如下

复制代码
1##############################################################################
2## Filename: D:/_prj/Xilinx/Zynq_new/AXI_Master_VGA_2/pcores/axi_vga_v1_00_a/data/axi_vga_v2_1_0.pao
3## Description: Peripheral Analysis Order
4## Date: Mon Nov 12 15:38:45 2012 (by Create and Import Peripheral Wizard)
5##############################################################################
6
7lib proc_common_v3_00_a all
8lib axi_lite_ipif_v1_01_a all
9 lib axi_vga_v1_00_a user_logic verilog
10 lib axi_vga_v1_00_a vga_sync verilog
11 lib axi_vga_v1_00_a DCM1 vhdl
12 lib axi_vga_v1_00_a DPBRAM verilog
13 lib axi_vga_v1_00_a CGROM verilog
14 lib axi_vga_v1_00_a axi_vga vhdl

复制代码

修改完成后,“rescan user repositories“将所做的修改更新到工程中,然后再进行DRC检查和生成bit文件,错误ERROR:HDLCompiler:Instantiating from unknown module 消失,XST综合成功。

==========================================

注意:

1、修改.prj文件时,注意文件的类型是verilog还是vhdl

2、修改.pao文件时,最好按照元件的例化顺序添加。

Baidu
map