在我们使用Quartus 创建工程时, 通常会使用GUI mode模式创建工程。在创建好的工程中添加源文件,IP 核, 约束文件等等。通常来说, Quartus GUI 工程比较干净,不会产生过多的二进制文件,所以整个工程通常比较小。但有些时候,我们也需要使用termal 设备远程调试。在有些自动化测试中,也需要脚本文件实现工程的组建,编译等等。
本文将对使用Tcl命令创建脚本工程进行讲解(script project)。
1. 开发环境:
本文中使用的是Quartus 21.1 版本,其他的版本与之类似。
2. script 工程目录结构
- 创建一个test 目录
用户也可以根据自己的工程需要更改这个目录名称
- 在test 目录下创建以下几个目录,用于存放不同的文件:

图1
constraints 目录: 用于存放FPGA 约束文件,目前这个目录为空, 用户可以编写自己的tcl 文件,和可以将约束文件写入到prj_scripts 目录中的create.tcl文件中。例如:如果在constraints 目录下建立pin.tcl文件, 只要在create.tcl 文件中需要的位置添加 source $constraints_dir/pin.tcl 即可。

图2
docs目录 :用于存放和项目相关的文档,包括docx文件,原理图,说明文件等等。
ip_cores目录:用于存放pip文件。 pip 文件是由 ip 核所生成的,同时有可能生成以下*.v 文件作为辅助。

图3
prj_scripts目录:srcipt 脚本文件存放在这个目录下,本文主要对这个目录下的文件做详细介绍。

图4
sim_scripts目录:仿真脚本文件存放在这个目录下, 在这个目录下, 可以创建多个子目录,用于不同的test case 仿真。仿真工程也是通过script 脚本方式实现的。

图5
src目录:所有的原文件存放在这个目录下

图6
tb目录:所有的testbench 文件放在这个目录下

图7
.gitignore:script 脚本工程通常配合git 使用,在使用git 工具维护工程时,就需要告诉git server 那些文件是临时文件、目录,或者是不需要上传到git server 的文件,目录。 这些不需要上传的文件,目录都记录在这个文件中。demo程序中显示:test_uart 目录,output_files目录不上传到git server。用户也可以根据需要自行修改。

图8
readme.txt:通常是整个工程的说明文件,用户可以根据需要自行编写。
环境需求: Quartus 脚本工程操作步骤: 方法1: 1) 进入prj_scripts 目录 2) 双击 scripts_cmd" 图标 3) quartus_sh -t create.tcl 5) quartus_sh -t compile.tcl 6) quartus_sh -t gen_jic.tcl 方法2: 1) 进入prj_scripts 目录 2) 双击 scripts_cmd" 图标 3) make create_prj 5) make compile_prj 6) make gen_jic
3 创建script 工程脚本
- 进入prj_scripts 目录

图9
- scripts_cmd :
执行script 脚本工程所需要的的命令窗口(termial)。 这里,我们假设Quartus 安装在 C:\intelFPGA_lite 目录下。 如果用户的Quartus没有安装在这个目录,需要编辑env.bat文件,修改为用户计算机下的安装目录,这里我们增加了环境路径:path = %path%;C:\intelFPGA_lite\21.1\quartus\bin64; C:\intelFPGA_lite\21.1\nios2eds\bin\gnu\H-x86_64-mingw32\bin

图10
- common_settings.tcl:
这个文件中定义了很多和script脚本相关的信息,这些信息可能会在多个tcl 文件中使用,其他的tcl文件可以使用 source common_settings.tcl 来调用这个文件中的信息。这有点像 c 语言中的 h 文件(头文件) 一样。

图11
当用户需要创建自己的工程时, 只需要修改,其他部分不需要修改。
1)set prj_name test_uart 这里我们定义的工程名称为test_uart , 用户可以根据自己工程需要进行更改。
2)生成的jic 文件将放到../output_files 这个目录中, 用户也可以自行更改。
- create.tcl:
Quartus 软件中创建工程中的参数比较多,我们先使用GUI 界面生成tcl 文件,之后在对这个tcl文件修改,形成我们所需要的脚本文件既可。
图12
1)将使用GUI 工具生成的tcl 文件打开, 找到if{$make_assignments} 这个段落,copy 整个段落。
图13
2)打开creat.tcl 文件,找到if{$make_assigments} 这个段落, 粘贴之前copy 的内容即可。
在scripts 目录下终端窗口中使用 quartus_sh -t create.tcl 执行创建工程的操作。
图14
- compile.tcl:
这个脚本文件用来编译 刚刚创建的工程。 在GUI 模式下, 我们可以进入工程目录,双击*.qpf 进入gui 界面,使用图形界面进行编译。 但是在远程操作中,使用script 脚本则更加方便。运行这个脚本,可以在不进入GUI 模式下, 编译整个工程,同时生成相应的sof 文件。一般情况下,这个脚本文件不需要用户修改。
在scripts 目录下终端窗口中使用 quartus_sh -t compile.tcl 执行创建工程的操作。
图15
- gen_jic.tcl:
这个脚本文件用来生成jic文件。 使用这个tcl 脚本之前, 必须保证工程已经正常编译了, 同时有sof 文件在 test_uart/output_files 目录下。
在scripts 目录下终端窗口中使用 quartus_sh -t gen_jic.tcl 执行创建工程的操作。

图16

图17
如图17 所示, 用户的项目可以更改
1)sof 文件所在的目录
2)使用的flash 类型等。
4. 执行 quartus_sh命令
当用户修改好工程后,可以执行以下操作,实现工程的创建,编译等操作:
1)进入prj_scripts 目录
2)双击scripts_cms
3)执行 quartus_sh -t create.tcl
4)执行 quartus_sh -t compile.tcl
5)执行 quartus_sh -t gen_jic.tcl
也可以使用make 命令:
1)进入prj_scripts 目录
2)双击scripts_cms
3)执行 make create_prj
4)执行 make compile_prj
5)执行 make gen_jic
到此工程被完整的创建, 编译,并且输出了sof,jic文件了。

图18
本文中提供是一个demo 工程, 用户可以在理解这个工程后, 更改为自己所需要的项目。附件中有一个GUI 模式下uart 工程文件 和一个scripts 模式下的工程文件。 作为例子,供用户参考。同时也可以用来验证相关的命令操作。
[content_control]
GUI 模式下工程
script 模式下的工程
[/content_control]