Vivado TCL脚本和Python自动处理

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)秒钟再去看抓到的信号。

你可能感兴趣的:(FPGA)