TCL语言及其在fpga设计中的应用.ppt_第1页
TCL语言及其在fpga设计中的应用.ppt_第2页
TCL语言及其在fpga设计中的应用.ppt_第3页
TCL语言及其在fpga设计中的应用.ppt_第4页
TCL语言及其在fpga设计中的应用.ppt_第5页
免费预览已结束,剩余63页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TCL语言及在fpga设计中的应用,讲座内容,TCL简介 TCL基本语法 ISE下TCL应用 ModelSim下的脚本语言,TCL简介,什么是TCL,Tcl 全称是Tool command Language。它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握。 Tcl语言是一个解释性语言,所谓解释性是指不象其他高级语言需要通过编译和联结,它象其他shell语言一样,直接对每条语句顺次解释执行。,历史,Tcl/Tk 的发明人 John Ousterhout 教授在八十年代初,是伯克利大学的教授。在其教学过程中,他发现在集成电路 CAD 设计中,很多时间是花在编程建立测试环境上。

2、并且,环境一旦发生了变化,就要重新修改代码以适应。这种费力而又低效的方法,迫使 Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了 Tcl (Tool Command Language) 语言的产生。 Tcl 最初的构想的是希望把编程按照基于组件的方法 (component approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定“完整”功能的,可重复使用的组件。这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。不同的组件有不同的功能

3、,用于不同的目的。并可为其它的应用程序所利用。当然, 这种语言还要有良好的扩展性, 以便用户为其增添新的功能模块。最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起, 使各个组件之间可互相“通信”,协同工作。程序设计有如拼图游戏一样,这种设计思想与后来的 Java 不谋而合。终于在 1988 年的春天, 这种强大灵活的胶水 - Tcl 语言被发明出来了,运行平台,Tcl/Tk可以提供跨平台的支持。Tcl语言可以运行于绝大多数当今流行的UNIX、WINDOWS和Macintosh等系统上,而且命令通用,只是启动的细节有些不同。 Tcl/Tk与C/C+的良好兼容性。Tcl/Tk 脚本可以

4、很好的集成到C/C+程序中。,TCL 运行环境,Tcl的执行是交互式的,Tcl提供了交互式命令界面,界面有两种:tclsh和wish。tclsh只支持Tcl命令,wish支持Tcl和Tk命令。通过交互界面,我们就可以象执行UNIX shell命令一样,逐条命令执行,并即时得到执行结果。 内嵌的Tk(toolkit)图形工具可以提供简单而又丰富的图形功能,让用户可以轻松的创建简单的图形界面。,TCL 工具,本文使用active Tcl :Activestate公司开发的工具 下载地址,TCL基本语法,简单文本输出,1 注释符号是 或者 ;# ,在命令后注释用 ;# ,在行开头两者均可; 2 pu

5、ts :输出文本,多个单词如被空格或TAB分隔需要使用“”或 括起来; 3 多个命令写在一行使用 ; 间隔。 puts Hello, World - In quotes ;# 注释,给变量赋值,set:给变量赋值,格式为 set var value ;# 给变量X赋一个字符串 set X This is a string ;# 给变量Y赋一个数字 set Y 1.24 ;# 显示X和Y的内容 puts $X puts $Y,命令的赋值与置换一,1 TCL中命令的赋值分为置换和赋值两个步骤 2 续行符为 3 转义符同为 4 特殊字符列表: puts “nBen Franklin is on th

6、e $100.00 bill” ;# n换行; $100前的 必须有,否则会将100作为一个变量,提示出错 set a 100.00 puts Washington is not on the $a bill ;# This is not what you want puts Lincoln is not on the $a bill ;# 显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为 $a,命令的赋值与置换二,最外层是 则不会进行置换操作,但其中的续行符仍然有效 set Z Albany set Z_LABEL The Capitol of New York is: pu

7、ts $Z_LABEL $Z ;# 显示The Capitol of New York is: Albany puts $Z_LABEL $Z ;# 显示 $Z_LABEL $Z,没有进行置换,中不会置换 puts $Z_LABEL $Z ;# 最外层是双引号,所以进行了置换,命令的赋值与置换三,1 可以传递其中的命令结果,注意不能被 包含; 2 双引号包含的 中的命令可以正常执行,命令结果也可以传出; 3 包含的 中的命令不会执行,更不会有命令结果传出来。 set x abc puts $xn ; #显示abc set y set x def ;#先执行中的命令,将”def”赋值给x,然后将

8、该命令的结果赋值给y puts X: $x Y: $yn ;#显示x和y都是def set z set x This is a string ;#由于在中,所以并没有执行对x的赋值,只是将赋值给z puts $zn set a set x This is a string within braces within quotes ;#执行了对x的赋值操作,并将值传出来赋给了a puts See how the set is executed: $a,算数运算,操作符 数学函数 set X 100; set Y 256 ;# 行末是否有分号都可以 set Z expr $Y + $X ;# 变量是

9、否被双引号包含都可以,不过建议使用双引号 set Z expr $Y + $X set Z_LABEL $Y plus $X is puts $Z_LABEL $Z puts The square root of $Y is expr sqrt($Y)n,文本比较SWITCH应用,1 switch的分支中的命令使用花括号包含,但是并不会影响花括号中的命令执行,切记,这是switch的格式; 2 如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。 set x ONE; set y 1; set z ONE; switch $x ;#若此处有 “$z” “puts ONE=1

10、” ;#不会走入此分支,走入下一分支 ONE puts ONE=1 TWO puts TWO=2 default puts NO_MATCH,数值比较IF应用,1 条件式结果 2置换变量的方法,set y x ; puts $y ,因为是后结合并且是一次置换,所以打出来的是 $x ,不是$x的值;但是在if的条件式中进行了二次置换, $y 被置换成了 $x 的值 3注意:新行中需要写为 else ,不能将 写到前一行的末尾,也不能省略 后面的那个空格,后面的 也需要写在当行,并且前面需要一个空格。,数值比较IF应用 举例,set x 1; if $x = 2 puts $x is 2 else

11、 puts $x is not 2 ;#判断是否相等使用 = if $x != 1 ;#判断是否不等使用 != puts $x is != 1 else puts $x is 1 set y x; if $y != 1 ;#在if条件式中$y进行了二次置换 puts $y is != 1 ;#在puts命令中,只进行了一次置换 else puts $y is 1 ,WHILE 循环,while后面的条件表达式是放在花括号中的;放在双引号中会只执行一次置换 set x 0; while $x 6 break; ;#如果去掉这句就成了死循环 if $x 3 continue; ;#这句使4 打不出

12、来 puts x is $x; ,FOR循环和incr,incr x 和 set x expr $x + 1 达到一样的效果,向上加一 for puts Start; set i 0 $i 2 incr i; puts I after incr: $i; ;#第一部分只执行一次,后面两部分每次循环都会执行 puts I inside first loop: $i puts Start; set i 0; while $i 2 puts I inside first loop: $i incr i; puts I after incr: $i; ,过程PROC,1 格式:proc name ar

13、gs body 2 调用方法中参数可以用花括号或者双引号包含,也可以不包含 3 在puts等命令中需要置换的话,需要使用方括号 puts The sum of 2 + 3 is: sum 2 3nn ;#调用过程 #puts The sum of 2 + 3 is: sum 2 3nn ;#出错,提示找不到第二个参数,置换过程中第一个参数是2 3,所以找不到第二个参数 puts The sum of 2 + 3 is: sum(2 3)nn ;#输出sum(2 3),因为没有方括号,根本没有进行置换,过程PROC的参数定义,1 过程的参数赋缺省值:proc name arg1 arg2 val

14、ue 2 过程的不确定个数的参数定义:proc name arg1 args proc example first second args ;#参数定义:赋缺省值和不确定个数参数定义 if $second = puts There is only one argument and it is: $first; return 1; else if $args = puts There are two arguments - $first and $second; return 2; else puts There are many arguments - $first and $second a

15、nd $args; return many; ,变量的作用域,1 全局变量定义:global var1 2 局部变量:upvar x y 等同于upvar 1 x y,作用有两个:一是将上一层的x的值赋给y;二是将上一层的x的地址赋给y,于是修改y等于修改x。1代表作用范围,也可为2,3等,不能为0,变量的作用域 举例,proc SetPositive variable value ;#此处variable只是一个参数名,可以修改为其他的来代替变量 upvar $variable myvar ;#此处也可写为upvar 1 $variable myvar if $value 0 set myv

16、ar expr -$value; else set myvar $value; return $myvar; SetPositive x 5; SetPositive y -5; puts X : $x Y: $yn,LIST结构,1 list结构下标是从零开始的,引用方式是lindex list 位置-1 2 字符串可以使用 :split 字符串 分隔符 拆分得到一个list,缺省分隔符是空格 3 list可以直接定义:set z list a b 4 foreach x $list :用以列出list中的所有项 5 llength $list :用以列出list中的项数 set y spl

17、it 7/4/1776 / ;#等同于set y split “7/4/1776” / puts We celebrate on the lindex $y 1th day of the lindex $y 0th monthn,遍历整个列表,逐次取出列表的每个元素的值放到指定变量中,使用者可以在跟随的过程体中添加必要的处理过程。 foreach elem $l1 puts -$elem- =-This- -is- -one- -list-,LIST项的增删改,1 在中执行的命令不会改变其中变量的值,在外面单独执行会改变其值; 2 list函数列表:,LIST项的增删改 举例,set b li

18、st a b c d e f g h ;#为4项:a; b; c d e;f g h set a concat a b c d e f g h puts Concated: $an ;#concat去掉了第一层花括号,输出:a b c d e f g h lappend a ij K lm ;#在a后面增加了一项ij K lm,注意此处a的值改变了 lappend a ij K lm ;#在a后面增加了三项 ij K lm,注意此处a的值改变了 set b linsert $a 1 1 2 3 ;# 在a的第三项(0开始数)插入三项 1 2 3,注意此处a的值并没有被改变 puts After

19、 linsert at position 3: $bn,更多LIST相关,1 list相关的函数列表: 2 通配符列表,字符串函数,字符串函数列表 set string this is my test string puts There are string length $string characters in $string puts string index $string 1 is the second character in $string ;#返回h puts string range $string 5 10 are characters between the 5th an

20、d 10th ;#返回”is my ”,更多字符串函数,string compare string1 string2 字符串比较 -1 :string1比string2小 0 :string1和string2相等 1 :string1比string2大 string first string1 string2 返回string1在string2中第一次出现的位置;如果string2不在string1中,返回-1 string last string1 string2 返回string1在string2中最后一次出现的位置,如果string2不在string1中,返回-1 string word

21、start string1 index 返回string1中index处的单词的开始位置 string wordend string1 index 返回string1中index处的单词的结束位置 string match pattern string1 返回string1中是否满足匹配模式pattern,修改字符串函数,format 函数 格式:format formatstring ?arg1 arg2 . argn ? set labels format %-20s %+10s Item Cost ;# %-20s:总长度20,字符串左对齐 set price1 format %-20s

22、 %10d Cents Each Tomatoes 30 ;# %10d:总长度10,数值右对齐 set price2 format %-20s %10d Cents Each Peppers 20 set price3 format %-20s %10d Cents Each Onions 10 set price4 format %-20s %10.2f per Lb. Steak 3.59997 ;#%10.2f:总长度10,小数点后两位,数值右对齐,正则表达式 1,1 利用正则表达式在字符串中查找子串 格式:regexp ?switches?exp string1?matchVar?

23、?subMatch1 . subMatchN? 例如:regexp (A-Za-z+) +(a-z+) $sample match sub1 sub2 switches exp :正则表达式,使用 包含,如果使用”包含,需要转义符才能执行 $sample :被查找的字符串 match:满足(A-Za-z+) +(a-z+)匹配的子串传递给match sub1:满足(A-Za-z+)的子串传递给sub1,正则表达式中圆括号的匹配项会将结果按顺序传递给后面的变量 sub2:满足(a-z+)的子串传递给sub2,正则表达式中圆括号的匹配项会将结果按顺序传递给后面的变量,正则表达式 2,2 利用正则表

24、达式在字符串中替换子串 格式:regsub ?switches? exp string1 subSpec VarName 例如:regsub way $sample lawsuit sample2 switches exp:正则表达式,此处是字符串way string1:被替换的字符串 subSpec:替换为什么字符串,此处是lawsuit VarName:替换后的结构赋给的变量,正则表达式 3,正则表达式常用通配符列表,正则表达式 操作举例,set sample Where there is a will, There is a way. set result regexp a-z+ $sa

25、mple match puts Result: $result match: $match ;#返回here set result regexp (A-Za-z+) +(a-z+) $sample match sub1 sub2 puts Result: $result Match: $match 1: $sub1 2: $sub2 ;#sub1=Where, sub2=there set sample Where there is a will, There is a way way. regsub way $sample lawsuit sample2 puts New: $sample2

26、 ;#返回结果: .There is a lawsuit way. 可以看出只是替换了左边的一个way,更多正则表达式,正则表达式非常重要,虽然已经有正则表达式的工业标准,但是实际情况并不完全统一,perl,shell,tcl,java等的正则表达式都有些许区别,所以大家需要留心细节。 1 * :0到n个非零字符 2 * :0到n个零 30-9+ :1到n个数字 4/* :0到n个非反斜杠字符 5(/a-z*) :前面是一个反斜杠,后面跟着0到n个小写字母 6(t+) :非制表符的任意字符 7(t) :一个制表符 8 :其实是匹配的 ,因为书写的时候需要转义符,数组,数组相关命令 array

27、exists arrayName判断一个数组是否存在,数组存在返回1,数组不存在返回0 array names arrayName ?pattern返回一个数组的指示列表,相当于数组的第一维,如果没有匹配串则完全返回 array size arrayName返回数组的列数,相当于数组的第二维数目 array get arrayName取得数组的值列表,它使数组的赋值变得简单,例如:array set arrayX array get arrayY ,实现了将arrayY赋值给arrayX array set arrayName datalist数组定义,数组举例,array set array

28、1 list 123 Abigail Aardvark 234 Bob Baboon 345 Cathy Coyote 456 Daniel Dog puts Array1 has array size array1 entriesn puts Array1 has the following entries: n array names array1 n puts ID Number 123 belongs to $array1(123)n set array1(123) modified puts ID Number 123 belongs to $array1(123)n array s

29、et array3 array get array1 ;#可以看出tcl中的数组赋值非常简单,不用写循环来赋值,更多数组相关,使用foreach浏览数组内容; 使用array startsearch,array anymore和 array nextelement 浏览数组内容; array set array1 list 123 Abigail Aardvark 234 Bob Baboon 345 Cathy Coyote 456 Daniel Dog foreach id array names array1 ;#浏览数组内容方法一 puts $array1($id) has ID: $id ,文件存取,文件打开命令: 格式:openfile fileName ? access ? permission 解释: fileName:文件名称 access:存取模式 文件关闭命令,文件用完后一定要记得关闭 格式:close fileID,文件存取,读取文件内容 格式:gets fileID ?varName? fileID 可以为以下四种中的一种 通过open打开文件得到的文件标志符 stdin:标准输入 stdout:标准输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论