引脚分配

在Quartus中,点击【Tools】->【Tcl scripts】即可执行tcl脚本。而在硬件编程的过程中,除了写verilog代码之外,大部分操作都只需要点个按钮就能搞定,唯有引脚分配稍嫌麻烦,因此tcl脚本在Quartus中最常见的应用,就是分配引脚。

下例就是一个用tcl写的引脚约束文件

set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
remove_all_instance_assignments -name *

#gloabl clk 
set_location_assignment PIN_12 -to ClkIn
set_location_assignment PIN_27 -to Resetb

#led
set_location_assignment PIN_16 -to Led[0] 
set_location_assignment PIN_18 -to Led[1]

#uart
set_location_assignment PIN_66 -to txd
set_location_assignment PIN_61 -to Rxd

其中,

【set_global_assignment】用于定义全局属性,【-name】用于指定约束名称。上例中,全局属性的约束名称为【RESERVE_ALL_UNUSED_PINS】,表示未使用的引脚,最后【AS INPUT TRI-STATED】表示设置为三态输入。连在一起就是,将未使用的引脚,全部设为三态输入。

【remove_all_instance_assignments】用于移除分配实例,【-name】同样表示约束名称,但其后紧跟着的【*】是通配符,表示匹配所有名称。换言之,该条语句将移除所有约束类型的分配实例。

【set_location_assignment】为实例级分配命令,后面跟着的【PIN_xx】即为管脚号,再后面【-to xx】为管脚绑定的信号名称,对应的管脚分配结果如下

在这里插入图片描述

导出tcl

tcl在Quartus中的价值远不止分配引脚,现找到一个已经编译好的工程,点击【Project】->【Generate Tcl File for Project】,即可生成其tcl文件。将此tcl文件连同.v格式的源文件复制到一个新的文件夹下,然后在命令行中输入

quartus_sh -t test.tcl

其中【quartus_sh】在quartus安装路径下的可执行文件夹下,64位的系统即【bin64】文件夹,如果上述代码无法执行,只需将此文件夹加入环境变量即可。

如果程序正常执行,则当前文件夹下,会出现【.qpf】文件,将其用QuartusII打开,即可恢复我们刚刚导出的工程。

如果在脚本的头尾分别添加下列代码,那么在执行之后,不仅会生成.qpf文件,还会生成一大堆工程文件,从而在打开工程后,只需下载到板卡上就能正常工作了。

package require ::quartus::flow
execute_flow -compile

其中,【package require】用于加载tcl模块,【execute_flow】为【::quartus::flow】中的命令,【-compile】即可用于编译。

项目管理代码

从项目中导出的tcl脚本内容如下,代码的主体几乎都由全局设置构成,其可读性很强,例如【FAMILY】表示芯片系列,【DEVICE】为项目型号,从代码可知,该工程用的是【MAX II】系列的【EPM570T100C5】。由于内容较多,且可读性较强,这里就不一一讲解了。

package require ::quartus::project

set need_to_close_project 0
set make_assignments 1

# 检测当前工程是否已经打开
if {[is_project_open]} {
	if {[string compare $quartus(project) "test_prj"]} {
		puts "Project test_prj is not open"
		set make_assignments 0
	}
} else {
	# 若未打开,则将其打开
	if {[project_exists test_prj]} {
		project_open -revision test_prj test_prj
	} else {
		project_new -revision test_prj test_prj
	}
	set need_to_close_project 1
}

if {$make_assignments} {
	set_global_assignment -name FAMILY "MAX II"
	set_global_assignment -name DEVICE EPM570T100C5
	set_global_assignment -name ORIGINAL_QUARTUS_VERSION 6.0
	set_global_assignment -name PROJECT_CREATION_TIME_DATE "19:09:19  AUGUST 24, 2010"
	set_global_assignment -name LAST_QUARTUS_VERSION 12.0
	set_global_assignment -name VERILOG_FILE test_prj.v
	set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
	set_global_assignment -name USE_CONFIGURATION_DEVICE ON
	set_global_assignment -name CYCLONE_CONFIGURATION_DEVICE EPCS1
	set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
	set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
	set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
	set_global_assignment -name RESERVE_ALL_UNUSED_PINS_NO_OUTPUT_GND "AS INPUT TRI-STATED"
	set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
	set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
	set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
  # 管脚分配与前面相同,故略去

	# Commit assignments
	export_assignments

	# Close project
	if {$need_to_close_project} {
		project_close
	}
}

更多推荐