(原創)xilinx IP建立向導創建的目錄和文件都是做什么的?----由錯誤ERROR:HDLCompiler:Instantiating from unknown module 引發的思考


使用了XPS中建立 和導入 IP 向導 (簡稱ipwiz),默認的源碼文件只有hdl/verilog目錄下的"userlogic.v"和hdl/vhdl目錄下的"ipname.vhd"文件。當我們的設計變復雜了,需要更多的設計文件如.v、.vhd、.ngc等文件和多個模塊/實體的時候,如果不進行一些設置,編譯器會提示找不到module的錯誤提示:ERROR:HDLCompiler:Instantiating <xx> from unknown module <xx>。怎樣才能讓編譯器找到我們所有的設計文件和模塊呢?

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

其中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"
 2 vhdl 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"
 3 vhdl 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"
 4 vhdl 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"
 5 vhdl 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"
 6 vhdl 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"
 7 vhdl 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"
 8 vhdl 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"
 9 vhdl 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"
10 vhdl 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"
11 vhdl 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/user_logic.v"
13 vhdl 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"
 2 vhdl 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"
 3 vhdl 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"
 4 vhdl 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"
 5 vhdl 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"
 6 vhdl 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"
 7 vhdl 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"
 8 vhdl 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"
 9 vhdl 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"
10 vhdl 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"
11 vhdl 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 
 7 lib proc_common_v3_00_a  all 
 8 lib 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 <xx> from unknown module <xx>消失,XST綜合成功。

 

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

注意:

1、修改.prj文件時,注意文件的類型是verilog還是vhdl

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM