小组 > CPLD/FPGA > Altera MAX 10 FPGA > 【MAX10 DECA board开发板评测】之九--tcl文件学习
?
?
小组信息
名称:Altera MAX 10 FPGA
人数:946
小组积分:5124
简介:Altera的MAX?10FPGA在低成本、单芯片小外形封装可编程逻辑器件中实现了先进的处理功能,是革命性的非易失集成器件。继承了前一代MAX器件系列的单芯片特性,使用单核或者双核电压供电,其密度范围在2K至50KLE之间。MAX10FPGA系列提供先进的小圆晶片级封装(3mmx3mm),以及有大量I/O引脚封装的产品。

返回本小组首页

楼主??[原创]?

【MAX10 DECA board开发板评测】之九--tcl文件学习


作者:youzizhile
积分:1384分
总积分:3002分
:6934
发送信息
加为好友
发表于2016-04-15 23:19

1 引言

这次在试用过程中发现有许多.tcl文件,比以前使用的频率更多。在altera官网上面搜索发现有培训例程,讲解的很详细,在此分享下tcl相关知识以及简要说明在MAX DECA开发板上的使用情况。

? tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大,是tool command language的缩写,发音为 "tickle”。 实际上包含了两个部分:一个语言和一个库。 首先,tcl是一种简单的脚本语言,主要使用于发布命令给一 些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 和很强可扩充性,tcl可以创建新的过程以增强其内建命令的能力。其次,tcl是一个库包,可以被嵌入应用程序,tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的 过程)的库函数。应用程序可以产生tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。 tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。

?

2 基本语法

1.命令结构:

command Name arguments。每条命令之间通过换行或者;隔开。例如:

set命令是把参数值赋给定义的变量名。如 set a 5;对a赋值5

$变量值替换符

set a 5

set b $a

上述两句执行结果为b=a=5.

?

[]是命令值替换符

\ 是特殊含义字符替换符

?

?2.注释:

使用#注释,不过要注意的是下面的注释是错误的:

set foo 0 #这个是注释

因为tcl解析器总是认为一条命令应该以换行或者分号结束,其他的在同一行中都认为是参数。所以正确的应该是:

set foo 0; #这个是注释

3.数据类型:

tcl只支持string类型。

4.变量

tcl可以定义两种类型的变量:变量和数组。

变量:在tcl变量不需要声明就可以直接赋值。给变量赋值的例子:

set ba 1;

set ma “qian li feng”;#加引号的作用是为了告诉编译器包括空格

?取得变量的值可以在对应的变量名前面加$来取得,例如:?????

puts $ba;? #表示打印出ba的值

数组:数组也不需要声明,直接赋值,例如:

set qian(0) 1;

set qian(1) 2;

? 一个比较有意思的地方是数组下标可以不按照顺序来写,也不一定是数字,可以是字符串。例如:

set qian(123) f;

set qian(6789) fs;???????

?如果我们要查看某个已经赋值的数组的信息,可以使用parray命令:如:????

parray qian;?? #将打印出qian数组的所有信息

?5.字符串操作

string 命令基本语法如下(这里的string1,string2可以是字符串也可以是变量,option是下列选项之一)

string option string1 string2;

?option的操作选项:

  compare 按照字典的排序方式进行比较。根据string1 <,=,>string2分别返回-1,0,1

  first 返回string2中第一次出现string1的位置,如果没有出现string1则返回-1

  last 和first相反

  trim 从string1中删除开头和结尾的出现在string2中的字符

  tolower 返回string1中的所有字符被转换为小写字符后的新字符串

  toupper 返回string1中的所有字符串转换为大写后的字符串

  length 返回string1的长度

例子:

string length $qian;? #将返回变量qian的长度

6.数字操作

因为tcl中只有一个string类型的变量,所以当要操作数字进行运算的时候,tcl提供了incr和expr两个操作数。

?incr的基本用法为:

incr variable integer(variable必须为数字)

  例如我要将一个数字加3

set a 3;

incr a 3; #将a加3,如果要减3,则为 incr a –3;

默认的incr a等同于a++的意思,即本身自增1。

?

expr的基本语法为:

expr function number

  expr是为了提供更加复杂的操作而设计的一个语法,比如运算乘除法等等。在执行算术操作的时候必须将expr命令放在算术操作之前。例如:

set a 20; set b 4;

set c [expr $a/$b]; #此时的c的值为5

  除此之外,expr还能够识别一些函数及其返回值如下:

  abs(x) x的绝对值

  round(x) x舍入后得到的整数值

  sin(x) x的正弦

  举个例子:

set a [expr sin(0.3)]; #计算0.3的正弦

7.转义

在tcl中可以使用{}将需要转义的字符串括起来。例如:

set a 5;

set b {$a};? #此时b的值为”$a“,而不是5。

8.流控制

if 控制流

  基本语法:

if { 表达式 } {

???? #运算;

} else {

??? #其他运算;

}

  需要注意的是if….else,if……elseif…中的else,elseif必须要和if的后面一个{在同一行。

switch控制流:

  基本语法:

switch $x {

?  数值1 { 操作1 ;}???????????

?  数值2 { 操作2 ;}

}

9.循环

tcl提供三种循环命令,分别为:for,foreach,while。此外tcl还提供两个循环控制命令。注意:这个三个命令中的程序块的开始花括号必须要和三个命令同一行。

?while基本语法:

  while {条件} { 程序块 }

?foreach 将在一组变元中进行循环,并且每次都将执行他的循环体。基本结构:

  foreach variable {items} {block}

  这里的variable是变量的名字,便于block中使用。举例:

foreach element {0 m n b v} {

?????? switch $element {

???????????? # 判断element的值

???? }

}

for是最常用的循环。其基本结构为:

  for {initialization} {condition} {increment} {body}

  例如: 

for {set i 0} {$i < 10} {incr i} {puts $i;} #将打印出0到9

3 例子说明

求阶乘值并输出:

set total 1

set n 5

for {set i 1} {$i <= $n } {incr i} {

set total [expr {$total * $i }]

}

puts "The value of $n! is $total"

4 quartus中的使用说明

通过启动脚本打开tcl interpreter或者打开system console,也可以打开tcl文件,通过source xx.tcl命令执行tcl文件。

5 max deca示例

led_shifting.tcl

# TCL that writes to the LED pio which is defined at a specific base address in the Qsys system

# Where is the LED pio base address:

set led_base_addr 0x420;#设置led_base_addr基地址为0x420

# Set the values to write to the LED pio.

set led_vals {1 2 4 8 16 32 64 128 128 64 32 16 8 4 2 1};#设置led_显示值

set delay 30000;#设置延时参数为30000

set cycles 2;#设置循环次数为2

set max_loop_count [ expr $cycles * 16 ] ;#设置最大循环次数为32

#select the master service type and check the different service paths available

#There will only be one master.? The master name will correspond to the JTAG Master in the Qsys window (eg master_0 if the name of the JTAG to Avalon Master is called master_0)

get_service_paths master;#得到jtag master路径

#set the service path (master path).? The name "jtag_master" is a name only.??? The name jtag_master is then used in this TCL file as a reference name.

set jtag_master [lindex [get_service_paths master] 0]

#opens the service master (needed for system console)

open_service master $jtag_master;#打开jtag master 服务

#sets up loop value

set loopcount 0;#设置loopcount为0

#writes to LEDs going through the above array values

while {$loopcount < $max_loop_count} {

?????? foreach val $led_vals {

????????????? master_write_8 $jtag_master $led_base_addr $val

????????????? #delay:

????????????? ?for { set i 1 } { $i <= $delay } { incr i } {}

?????? incr loopcount

?????? }

}

#print out a message that the test is done

send_message info "LED_counting.tcl done"

#closes service master (needed for system console)

close_service master $jtag_master

?

文件挺大的,就不上传附件了,有需要的请下载如下连接,培训例程下载连接:

http://wl.altera.com/customertraining/webex/Introduction_to_Tcl/Introduction_to_Tcl.zip

http://wl.altera.com/customertraining/webex/Quartus_II_Tcl_Scripting/Quartus_II_Tcl_Scripting.zip


?tt_qsys_intro.pdf( 764KB ) ?该附件被下载次数 ?1
分享到:? 新浪微博?? qq空间??
投票数: ? 回复?? ? 引用??
点击登录,立即回复。
小组活跃用户