Tcl介紹
Vivado是Xilinx最新的FPGA設計工具,支持7系列以后的FPGA及Zynq 7000的開發。與之前的ISE設計套件相比,Vivado可以說是全新設計的。無論從界面、設置、算法,還是從對使用者思路的要求,都是全新的;在運行速度、算法優化和功能整合等很多方面都有了顯著地改進。但是對初學者來說,新的約束語言XDC以及腳本語言Tcl的引入則成為了快速掌握Vivado使用技巧的最大障礙,以至于兩年多后的今天,仍有很多用戶缺乏升級到Vivado的信心。
本文介紹了Tcl在Vivado中的基礎應用,希望起到拋磚引玉的作用,指引使用者在短時間內快速掌握相關技巧,更好地發揮Vivado在FPGA設計中的優勢。
使用Tcl作為它的命令語言的好處:
1 Tcl提供了標準語法,一旦用戶掌握了Tcl就可以很容易的發布命令給基于Tcl的程序
3 通過Tcl, Vivado具備了強大的設計分析能力
? 快速定位設計中的問題
? 減少設計迭代周期
基本語法和基礎命令
在Vivado中的Tcl命令行里,學習這些基本語法
(Windows下 –> 開始 –> 所有程序 –> Xilinx Design Tools –> Vivado xxx –> Vivado xxx Tcl Shell)
01、命令格式
一條Tcl的命令串包含了多條命令時,用換行符或分號來隔開,而每一條命令包含了一個域的集合,域使用空白分開的,第一個域是一個命令的名字,其它的是作為參數來傳給它。
02、數據類型
Tcl只支持一種數據結構:字符串。所有的命令、命令里的所有的參數、命令的結果、變量全部都是都是字符串。
簡單實例:
set i 123 將123這個字符串賦值給i變量 unset i 清除變量 set i hi 將hi這個字符串賦值給i變量 set i "hi hello" hi hello中有空格,所以加引號 set i 123;#開始注釋 注意: 注釋前,要先用分號,把命令結束掉,或者換行注釋
03、設置變量
設置一個名為myVar的變量,其值為Hello World!
04、使用$符號引用變量
其中puts是打印命令
05、使用[]將命令返回值,作為新命令的參數
set j 232命令會返回值232
新命令就成了 set i 232
這里稍微復雜一點點的例子:
set i a[set j b][set k c]
最后的結果就是:j=b ; k=c ; i=abc
06、數組
數組不需要聲明,直接賦值即可,也不必按照順序來:
set i(1) 123 ; set i(16) hi
當然也支持任意維數的數組:
set i(1,2,3) hi
引用的時候直接$i(1,2,3)即可
parray命令
可以打印出一個數組的全部信息:
array命令
命令格式:array option arrayName
option 是 操作選項,有如下可選:
name : 返回數組的所有元素的名稱
size : 返回數組的長度
startsearch : 初始化一次遍歷,返回一個遍歷標識符(searchId),這個searchId在下面用到,(是可以多個遍歷同時進行的)
下面的命令格式為:array option arrayName searchId
->nextelement : 返回數組中下一個元素,如果沒有返回空
->anymore : 如果接下來還有元素,返回1,否則返回0
->donesearch : 結束遍歷
07、字符串命令
string命令:
命令格式:string option string1 string2
option 是 操作選項,有如下可選:
compare : 按照字母的排序方式比較,string1 <,=,>string2,分別返回-1,0,1
match : 判斷string1和string2是否匹配
first : 檢索string2中第一次出現string1的位置,如果沒有出現string1則返回-1
last : 和first相反
trim : 從string1中刪除開頭和結尾的,string2的字符
命令格式:string option string
tolower : 返回string中的所有字符被轉換為小寫字符后的新字符串
toupper : 返回string中的所有字符串轉換為大寫后的字符串
trimleft : 去除string左空白,類似的還有trimright
length : 返回string1的長度
range :
string range abcdef 1 2,返回輸出結果為bc
append命令:
字符串追加,可以無限拼接
set i a
append i b c d
puts $i123
i變量的值就成了 abcd,注意append i b c d命令,而不是append $i b c d
split命令
命令格式:split 字符串 分割符,將字符串轉換為列表
08、數字操作
tcl中只有string類型的變量,所以當進行數字運算的時候,需要用到incr和expr操作命令
incr命令:
a變量自加-3:incr a -3
a變量自加1 : incr a
expr命令:
類似C語言中的算術操作符有(在Tcl 中的邏輯:真為1,假為0):
!、* 、/、 %、+、-、<<、 >> 、< 、> 、<= 、>= 、== 、!=、& 、^ 、|、&&、 || 、x ? y : z
除此之外,expr還能夠識別一些函數及其返回值: abs(x) 、round(x) 、sin(x)、cos(x) 等
使用方法:expr 表達式
09、proc自定義函數
proc:
proc hello {str} {
puts hello:$str}
需要注意的是,如果不能一行寫完,那建議按照如下格式來定義(主要是要將“{”放到第一行的末尾):
第一行: proc+(空格)+函數名+(空格)+{參數}+(空格)+{
中間行: 邏輯運算
最后行: }
全局變量global:
用于將過程中的局部變量變成外界可操作的全局變量
proc hello {} { global x set x hi set i hello}1234
上述代碼,執行結果:
return命令:
proc hello {} {return world}
set i [hello]12
return命令沒啥好說的,上述代碼的結果是,將i變量賦值為world字符串
10、控制流和循環命令
Tcl語言中用于控制流程和循環的命令與C語言及其它高級語言中相似,包括if、while、for和foreach等等。
具體使用可以參考如下示例:
if 流控制:
這個同樣建議按照格式來:
第一行: if+(空格)+{表達式}+(空格)+{
中間行: 邏輯運算
第N行: }+(空格)+else+(空格)+{
中間行: 邏輯運算
最后行: }
switch流控制 :
例子如下,一目了然:
switch 2 {
1 {puts 111}
2 {puts 222}
3 {puts 333}
default {puts xxx}
}
case流控制:
case abcd in a {puts 111} *bc* {puts 333} default {puts xxx} 1
上述程序對字符串abcd進行判斷:
條件一 : 字符串為a
條件二 : 不管字符串的前后字符是啥,只要中間有bc子字符串即可
條件三 : default
foreach循環:
循環讀取myVar變量的值并打印,那就需要這個foreach了
for循環:
TCL的for循環也是很類似C語言的:
for {set i 0} {$i < 10} {incr i} {
puts $i
}123
初始化i=0,范圍 i<10 ,循環i=i+1
while循環:
判斷變量的值,打印,變量再賦值就OK了
11、字符串轉為命令
eval命令:
set a set ; set b i ; set c hello ; eval $a $b $c
上述代碼就等效于:set i hello
eval將字符串的內容,作為命令,執行
12、打印輸出
打印主要通過puts語句來執行,配合特殊符號,直接決定最終輸出內容。
編輯:hfy
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603002 -
TCL
+關注
關注
10文章
1722瀏覽量
88566 -
Vivado
+關注
關注
19文章
812瀏覽量
66472
發布評論請先 登錄
相關推薦
評論