如果你被标题吸引而来,哈哈说明我成功了。

不过先别着急拍砖,这次的主题是使用Tcl脚本在quartus II中完成FPGA的配置。

Tcl(读Tickle) 全称(Tool Command Language),是一种简单易学又十分强大的脚本语言。在数字集成电路设计中应用十分广泛。

利用Tcl脚本,告别在Quartus II界面下用鼠标点来点去的步骤,直接双击,就可以完成工程的创建、综合、布局布线、引脚约束时序约束等过程。

所以一键完成也并非妄言

Tcl脚本还可以轻松的保存和导出现有工程文件的约束和配置,然后移植到其他工程中。

另外,Tcl脚本在Modelsim仿真中也有着十分广泛的应用,这一部分内容我们在之后的文章中进行讲解。

这篇文章的主要目的,是帮助大家理解Quartus II中Tcl脚本的主要层次结构,破除一下神秘感,文章的一些内容,是我自己整理理解而来。

好啦,闲话少说,为了使大家直观的了解Tcl脚本的应用,不至于一上来就绕晕在各种概念里,这里先带大家完成一个小例子,看一下Tcl脚本的实际作用。

01

首先需要大家检查一下,在环境变量中是否添加了Quartus II。

打开系统属性,点击环境变量。

之后在用户变量 -> Path下把电脑上quartusbin64这个路径添加进去即可。

02

接下来,大家自己找一个已经编译好的小工程,在Quartus II中打开,点击Project -> Generate Tcl File for Project。

这时在工程目录下,大家会看到一个后缀为.tcl的文件。

然后,大家把这个Tcl文件,与这个工程的源文件(.v)复制到一个新的文件夹下,注意文件名不要有中文字符。

在文件下新建一个空白的txt文档,输入“quartus_sh -t xxx.tcl”,注意后面的tcl名需要与自己的tcl文件相同,最终的结果是这样的。

最后,将txt文档的后缀改为.bat

好啦,大功告成!

现在,我们双击这个.bat文件,看看会发生什么?

没错,工程被创建了出来,大家打开工程会发现,和之前自己最早的工程一模一样。

03

其实上述的小例子也是有一定的实用价值的。

比如当你想复制一个很大的工程时,只需要把脚本文件与源文件拷贝即可,这大概只要几十kb,而一个工程目录通常可能得有好几百兆。

不过这个小例子还是更多的让大家找找感觉,理解一下Tcl的流程。

我们来分析一下刚才干了什么。

大家可能已经发现了,从源工程导出的Tcl文件,包含了工程所有的配置与约束信息

而最后创建的bat文件,其实是所谓的批处理文件,就是让Windows执行了quartus_sh -t xxx.tcl这样一条语句。

大家也可以在命令行下,切换到对应的路径下,直接输入这句话,也能达到一样的效果。

接下来的问题是,Tcl文件里都有什么?quartus_sh -t xxx.tcl这句话是什么意思?我们来分析一下。

04

首先要明确的是,在Quartus II中,Tcl脚本有3个层次,分别是命令行可执行语句(Command-Line Executables)、Tcl内的包(Packages)与包内的命令(Package commands).

理解了这三个层次的内容,就理解了Quartus II中Tcl脚本的基本结构。同时这部分内容也是本文的核心。

大家在命令行中输入quartus_sh --qhelp,可以打开Quartus II自带的关于Tcl脚本的帮助文档。

像下图这样:

左边有两个目录,分别就是可执行命令,与。而点击任何一个包,右边就会出现包内的命令。这三者各有什么用,它们之间是一个什么样的关系呢?

大家观察一下,命令行可执行语句(Command-Line Executables)的形式全部为quartus_xx,是直接写入批处理脚本中的。

我们刚才往bat文件里写入的是:quartus_sh -t xxx.tcl,意思就是使用了quartus_sh这个可执行命令来执行后面的那个脚本。

每一个可执行命令,其实就代表了FPGA配置或者约束的一个步骤

比如quartus_fit用来做映射,quartus_sta用来做时序仿真等等。而我们这里用的quartus_sh,其实是所谓的Quartus shell,是为所有的步骤提供了一个入口。

为了实现可执行命令所执行的功能,Quartus II里为每一个可执行命令提供了不同的包

包内的命令,是我们真正要往Tcl脚本里写入的。

指令与包之间的关系是这样的。

实心圆代表可执行语句默认加载了这个包。比如说,所有的可执行语句即quartus_xxx都加载了project这个包.

这意味着,不管用任何可执行命令执行Tcl脚本,脚本中都可以调用project包下的指令,如set_global_assignment。

大家可以打开自己刚才生成的Tcl脚本看一下,里面有大量这条语句,这条语句就是对工程进行配置的。

空心圆代表可执行语句无法加载这个包,比如假如用quartus_sh这条语句执行sdc这个包下的语句,就是不行的。

半空半满圆表示,可执行语句没有默认加载这个包,要是想用的话需要自己进行手动加载。在Tcl脚本内写入 load_package <package name>;之后,就可以使用对应包内的指令了。

比如,使用quartus_sh这个指令去执行脚本,又需要执行flow这个包下的指令,如execute_flow,那么我们就需要在Tcl文件中写入 load_package flow这句话。

总结:批处理文件(.bat)中写可执行指令,如quartus_xxx;

脚本(Tcl)文件中写可执行指令下Tcl包内的指令;

如果没有包没有默认导入的话还要在Tcl文件中导入。

05

好了,有了上面的铺垫,我们打开自己生成的Tcl脚本看一下。

因为大家各自的工程不同,脚本自然也不同,不过结构基本一致。其中带#号的是注释,在这里就不列举了。

我的Tcl脚本主要有两部分,第一部分是

package 

这一部分主要是检查目前待创建的工程是否存在,如果不存在的话,就project_new -revision led_test led_test,即创建led_test这个工程。其中-revision后面跟的是一同被创建的qsf文件的名字。

当然如果自己写脚本的话其实没有必要这么多判断,创建工程直接写
project_new -revision <qsf文件名> <工程名>这样即可。

第二部分是

# Make assignments
if {$make_assignments} {set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_filesset_global_assignment -name VERILOG_FILE led_test.vset_global_assignment -name LAST_QUARTUS_VERSION 13.1set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85set_global_assignment -name FAMILY "Cyclone IV E"set_global_assignment -name DEVICE EP4CE75F23C8set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFFset_global_assignment -name CONFIGURATION_VCCIO_LEVEL 3.3Vset_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED"set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO"set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO"set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO"set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO"set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO"set_global_assignment -name USE_CONFIGURATION_DEVICE OFFset_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -riseset_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fallset_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -riseset_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fallset_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Topset_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Topset_global_assignment -name PARTITION_COLOR 16764057 -section_id Topset_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clkset_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top# Commit assignmentsexport_assignments# Close projectif {$need_to_close_project} {project_close}

这主要是对工程进行配置,包含大量的set_instance_assignment语句,每句话的含义,大家可以结合帮助文档理解。

其实只要理解了命令行可执行语句、包与包内语句这三者之间的关系,再结合帮助文档,其实Quartus 中的Tcl脚本是比较容易理解的。

实际使用中使用Tcl脚本主要用于对工程进行约束配置,比如用来做引脚约束就十分方便.

另外Tcl脚本的一大用处就是在Modelsim的仿真中,这部分内容我们之后再聊。

感谢您能看到这里,希望没有浪费您的时间,我们下次见!

欢迎关注公众号[FPGA里的那些事儿],关于FPGA的分享,以及一些闲来无事的唠嗑。

一键切换ip地址bat_震惊!FPGA配置居然一键完成!相关推荐

  1. 计算机如何输入ip地址,电脑如何切换ip地址_怎么让电脑切换ip地址-win7之家

    在每台电脑中,系统中的ip协议都会有提供一种统一的ip地址,能够为为互联网上的每一个网络和每一台主机分配一个逻辑地址,从而达到屏蔽物理地址的差异,同时我们也可以对ip地址进行切换,那么电脑如何切换ip ...

  2. bat 切换网络适配器_Windows批处理自动切换IP地址设置无线网络和以太网的IP地址...

    经常带着笔记本电脑来回公司与家里上网,会碰到要切换本地IP的情况,由于上班公司工作需要设置固定IP才能上网,而在家都是自动获取IP地址的,下面这个bat批处理文件,可以很方便切换IP地址. @echo ...

  3. 自动为计算机配置ip的协议,电脑自动获取IP地址----DHCP动态主机配置协议

    电脑主机要接入网络中就需要有三层IP地址,静态IP地址采用的是管理员手工配置的配置方式,这种方式在设备较少的情况下可以很好控制地址的分配,但是在设备较多的情况下手工配置的方式变得繁琐,而且当分出去的地 ...

  4. 切换ip地址是什么意思 切换ip地址的快捷方式

    切换ip地址是什么意思 切换IP地址是指计算机更换通信地址.这就像我们日常生活中的改变家庭地址一样.每一台计算机都有世界上唯一的IP地址来确定它的位置.切换IP地址通常用于访问不同地区的网络或者改变网 ...

  5. linux切换ip地址脚本,批处理实现的ip地址切换的复杂脚本

    @echo off cls echo **************** echo IP地址切换 echo 版本:070510 echo **************** echo. echo 0705 ...

  6. win10一键修改IP地址

    由于工作需要,经常需要设置电脑的IP地址,子网掩码和网关,一直手动修改特别麻烦.为了简化工作,就搜了一些资料,编写了一个bat脚本,进行一件自动切换. 1.桌面新建文本文档: 2.全部复制以下代码,粘 ...

  7. IP地址的划分和配置路由

    IP地址:是一种在Internet上的给主机编址的方式,也称为网际协议地址.常见的IP地址,分为IPv4与IPv6两大类: 路由:路由器能把不是同一个网段的网络设备连接起来,使它们能够建立通信: IP ...

  8. 如何配置php的ip地址吗,如何手动配置IP地址及防火墙设置

    手动配置电脑IP地址和设置防火墙是很常用的设置.下面是学习啦小编跟大家分享的是如何手动配置IP地址及防火墙设置,欢迎大家来阅读学习. 手动配置IP地址及防火墙设置的方法 方法/步骤 在桌面 右键网络连 ...

  9. 如何配置php的ip地址吗,linux如何配置IP

    linux如何配置IP? IP地址配置 rhel7/centos7添加了新的IP地址配置工具,但之前的老版本没有,所以这里可参考两种方法. 方法一:nmcli工具(新版系统可用) 第1步 查看网卡名称 ...

最新文章

  1. 当 “HTTP” 先生遇上“S”小姐
  2. DJango_生命周期
  3. fedora yum mysql_Fedora14使用yum安装mysql
  4. 基于融合计算?蚂蚁金服的在线机器学习是如何做的
  5. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题
  6. html网页商品销量滞后怎么做,iview 刷新滞后于html问题
  7. iOS - 个人项目流程(建立项目和提交Git 进行代码迭代管理)
  8. AD集成DNS区域记录重建及恢复
  9. 小程序保存图片相册无响应
  10. ScmTools(CAD自动标注插件)v2.0官方版
  11. 2020年数学建模国赛E题题目和解题思路
  12. linux puppy 安装软件,小芭比linux下载
  13. Excel根据快递单号自动识别快递公司
  14. 掌薪阁分享:一个人人可做,汇聚了全网不同层次的网赚项目!
  15. 7-2 排座位 (25 分)
  16. go语言程序设计学习笔记-1
  17. html项目的致谢词,毕业论文的致谢词范文(精选5篇)
  18. 引入echarts的js文件报错——Cannot read properties of null (reading ‘getAttribute‘)
  19. 亚马逊将推出VR购物应用,支持Vive Rift PSVR三大平台
  20. arcgis多面体要素转面_【干货】ArcGIS 9.3线转面的方法

热门文章

  1. vue2.0桌面端框架_vue-element-admin
  2. python3 manage.py runserver 0.0.0.0:8000 没反应
  3. 基于android的视频播放器,基于Android的视频播放器的设计与实现-.doc
  4. 【python基础知识】调用C++接口(setup.py运行)出现的各种问题
  5. 常用的、现成的!正则表达式及基础知识
  6. python-利用生成器函数生成斐波那契数列
  7. Bootstrap3代码模板
  8. solaris php,在Solaris 10 64位上配置PHP
  9. java 计数器_java并发之计数器CountDownLatch原理
  10. 学会这个python数字大全,让你不再发愁