https://blog.csdn.net/u010161493/article/details/79545731
TCL简介
vivado软件支持TCL脚本,可以纯TCL定制非工程模式FPGA流程,也可以作为GUI工程模式下TCL命令的一个补充。纯TCL定制非工程模式有许多优点,给予用户最大的灵活性去定制FPGA流程,包括控制所有步骤和管理所有的中间生成文件dcp,有利于版本管理和自动化,适用于高级玩家。当然GUI下的工程模式最适合入门,可以专注于解决问题,工作效率不是首要考虑。这时候选择TCL作为GUI模式下的一个补充功能有时候简直奇效。
常见运用场景,要找某个时钟的BUFG或者综合后网表中的某一个信号,还有就是自动触发ILA抓取信号,配合Python进行自动的分析,在信号处理中定位问题非常方便。
TCL语法
简单的TCL语法如下:
#设置变量
set n 1
#输出显示
puts $n
#循环
set n 1
while{$n<10}{puts "n = $n";set n [expr {$x + 1}]}
#函数/子过程
proc fun{x}{
puts "input is $x"
}
#调用
fun(10)
应用举例:
自动触发ILA抓取信号
proc trig_ila {} {
run_hw_ila [get_hw_ilas -of_objects [get_hw_devices xc7k480t_0] -filter {CELL_NAME=~"u_ila_2"}]
wait_on_hw_ila [get_hw_ilas -of_objects [get_hw_devices xc7k480t_0] -filter {CELL_NAME=~"u_ila_2"}]
display_hw_ila_data [upload_hw_ila_data [get_hw_ilas -of_objects [get_hw_devices xc7k480t_0] -filter {CELL_NAME=~"u_ila_2"}]]
write_hw_ila_data -csv_file -force {C:\Users\Administrator\Desktop\script\aa.csv} hw_ila_data_3
}
set x 0
while {$x < 10} {trig_ila; set x [expr {$x + 1}] }
可能要问,这么复杂的命令怎么记得住呢?其实在操作vivado GUI的时候它自己会把当前操作的TCL命令显示到TCL控制台里。如果经常用这个命令,就可以把命令粘贴到上面的TCL文件,保存为aa.tcl,自己再“创作”一下就行了。运行的时候直接在Tcl console 口输入下面的命令就行了。
source C:/Users/Administrator/Desktop/script/aa.tcl
要注意vivado下面的路径使用的是反斜杠/,和Windows下的路径不一样。
Python分析CSV
保存为csv格式,如果这时候再配合Python自动分析,就可以去喝茶慢慢等了。献上丑陋的Python代码,用一点学一点。
# -*- coding: UTF-8 -*-
import csv
import math
lenth = 1024
begin = 40
end = begin + lenth
energy = []
speed = []
ifft = []
with open('cfar_2nd1.csv','r') as csvfile:
reader = csv.DictReader(csvfile)
column1 = [row['cfar_2nd_u/R_rdata_delay7[32:0]'] for row in reader]
for i in range(begin,end):
print(column1[i])
for i in range(begin,end):
bb = bin(int(column[i],16))
energy_tmp = bb[-19:]
speed_tmp = bb[-27:-19]
energy.append(int(energy_tmp,2))
speed.append(int(speed_tmp,2))
for x in ifft:
print(x)
Python自动处理
再高级一点,让Python自动去检测抓到的CSV文件是否更新,然后自动处理。在分析信号处理和抓某个出现频率很低的异常信号的时候比较方便。
import os,time
import csv
import math
def max_ifft():
ifft = []
with open('aa.csv','r') as csvfile:
reader = csv.DictReader(csvfile)
column1 = [row['W_ifft1_xk_re[0][34:0]'] for row in reader]
with open('aa.csv','r') as csvfile:
reader = csv.DictReader(csvfile)
column2 = [row['W_ifft1_xk_im[0][34:0]'] for row in reader]
for i in range(8192):
re = int(column1[i],10)
im = int(column2[i],10)
ans = math.sqrt(math.pow(re,2)+math.pow(im,2))
ifft.append(ans)
print(max(ifft))
return
while 1:
statinfo = os.stat('C:/Users/Administrator/Desktop/script/aa.csv')
before = statinfo.st_mtime
time.sleep (10)
statinfo = os.stat('C:/Users/Administrator/Desktop/script/aa.csv')
after = statinfo.st_mtime
if before != after:
max_ifft()
before = after
很简单,把文件夹下面的抓的文件时间戳拿来比较,发现不同就说明文件以及更新了,sleep(10)秒钟再去看抓到的信号。
网友评论