原创 【博客大赛】TCL脚本生成QIP文件

2014-4-17 16:22 6006 12 12 分类: FPGA/CPLD 文集: ALTERA FPGA

TCL脚本生成QIP文件

王敏志

概述

 

         这就是经常逛论坛的好处,总是可以学到新的知识或者是技巧,本文马上要给大家介绍的就是笔者从Altera英文论坛上看到的一个小小技巧,当然完全属于利用脚本协同进行Quartus II开发的范畴。

 

什么是QIP文件

 

         QIP应该就是Quartus IP的缩写,就是我们在Quartus II里面是有Altera的IP的时候产生的一个文件,一般我们在使用MegaWizard插件管理器例化一个IP后会自动提示你是否需要将生成IP时产生的QIP文件加入到工程里,一般选择“是”即可,如图1所示。

1.jpg

图1:实例化IP结束后提示是否将QIP文件添加到工程

这时候我们到工程导航(Navigator)中Files标签下可以看到我们刚刚产生的IP已经自动添加到工程,而且QIP自动包含了源文件(HDL),如图2所示。

1.jpg

图2:QIP以及HDL源文件自动添加到工程

 

QIP文件对于平时的逻辑设计的好处

 

         从上一节我们介绍什么是QIP文件的时候,我们就可以看出来在设计Quartus II工程的时候使用QIP文件的好处。现在逻辑设计都是基于层次架构来进行模块化的设计,所以很多时候我们会将不同模块的源文件存储在不同的目录下,特别是一些可以重复使用的模块更加应该如此。每个模块可能包含多个源文件,那么我在再次使用这些模块的时候是不是需要一个个地将所有源文件添加到工程里呢?答案是没有这种必要的,因为从上述QIP的介绍中,我们知道其实只需为每一个模块添加一个QIP文件即可。所以QIP文件对于逻辑设计的好处就是非常有利于我们的模块设计以及对于原始设计文件的管理。现在的问题就是我们应该怎么来为可重复利用模块产生QIP文件,笔者下一节进行详细介绍。

 

编写脚本产生QIP文件

 

         既然知道QIP文件的好处,那么本节笔者开始介绍如何使用脚本文件来产生QIP文件。首先我们来看看QIP文件里到底有些什么内容,以下是笔者打开本人使用的一个PLL的QIP文件看到的全部内容:

set_global_assignment -name IP_TOOL_NAME "ALTPLL"

set_global_assignment -name IP_TOOL_VERSION "9.1"

set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "mypll.vhd"]

set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mypll.bsf"]

set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mypll_inst.vhd"]

set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mypll.cmp"]

set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mypll.ppf"]

我们看到QIP文件里的格式是典型的脚本格式,和QSF文件里的格式一样,我们知道当我们添加QIP文件到工程的时候,其实就是等于在QSF文件里添加了一句添加QIP文件到工程的约束。

         当然,我们可以根据上述格式通过手动生成QIP文件,大家可以通过实际实例来进行验证,但这不是笔者这里要介绍的,我们来讨论如何通过TCL脚本来自动的搜索并生成QIP文件,具体的TCL脚本如下所示:

 

 

以下是脚本代码片段:

if {[llength $argv]>0} {

         puts "-------------------------------------------------------"

         puts "Input parameters:"

         set  file_name [lindex $argv 0]

         set  path      [lindex $argv 1]

         puts " file name : '$file_name'"

         puts " path      : '$path'"

} else {

         # EDIT HERE:

         set file_name  "all.qip"

         set path            "./"

         # END;

}

 

set p_file           [open $file_name w]

set cnt                        0

 

proc find { path pattern key_word  } {

         foreach i [ glob -nocomplain $path/$pattern ] {

                   puts $::p_file "set_global_assignment -name $key_word \[file join \$::quartus(qip_path) \"$i\"\]"

                   global cnt

                   incr cnt

         }

}

 

proc find_in_path { path } {

         find  $path *.sv   SYSTEMVERILOG_FILE

         find  $path *.svh  SYSTEMVERILOG_FILE

         find  $path *.v    VERILOG_FILE

         find  $path *.sdc  SDC_FILE

         find  $path *.vhd  VHDL_FILE

         find  $path *.vhdl VHDL_FILE

         find  $path *.tdf  AHDL_FILE

}

 

foreach p $path {

         find_in_path $p

         puts $::p_file ""

}

 

 

close $p_file

puts "-------------------------------------------------------"

puts " Find $cnt files"

puts " Making file '$file_name'"

puts " Press 'Enter' to exit ..."

gets stdin

 

 

 

我们将上述脚本放到一个名为q2_make_qip.tcl的脚本文件中,然后根据自动化批处理执行脚本文件的方法,来自动产生QIP文件,执行结果如图3所示。

1.jpg

图3:利用脚本和批处理自动产生QIP文件

         如图3所示,在当前目录下本来只有一个TCL文件一个Batch批处理文件以及一个放置两个VHDL的源文件目录src。双击执行batch文件后,命令行被调出并执行了批处理命令,命令执行完成后,在当前目录下产生了一个名为myfifo.qip的QIP文件,大家可以修改TCL来搜索不同的模块目录并生成不同的QIP文件名。这时候如果我们打开这个myfifo.qip文件,那么我们可以看到类似上述PLL的QIP文件里的内容,只是要比PLL的要简单,如下所示:

set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "./src/sfifo.vhd"]

set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "./src/sfifo_test.vhd"]

其实就是将两个vhdl文件添加到工程的约束而已。

 

分析及结论

 

本文讨论了什么是QIP,并且了解了使用QIP文件的好处。最好介绍了手动产生QIP文件的方法,并重点介绍通过脚本文件以及批处理方法自动产生可重用模块的QIP文件。

 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条