导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug

导出Xilinx FPGA的ILA数据到Python

 

导出ILA数据

在空白处右键,选择Export ILA Data

图片[1]-导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug
Snipaste_2021-08-19_15-53-47

导出csv格式的文件,并选择文件路径和文件名:

图片[2]-导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug
Snipaste_2021-08-19_15-54-52

上面两步也可以使用tcl脚本代替:

write_hw_ila_data -csv_file {C:usrzhjilailadata.csv} hw_ila_data_1

导出后的文件如下图所示,第一行是标题,有Sample in Buffer、Sample in Window、TRIGGER,后面就是我们采的信号的名称,但这个信号名称是包含例化的层级结构名字的。

图片[3]-导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug
image-20210820134619445
  1. 处理十进制数据

如果我们在hw_ila的窗口中设置显示的数据格式为10进制,那么我们直接读取数据并绘图显示都是比较方便的:

# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

csv_name = r'davinci.csv'
csv_data = pd.read_csv(csv_name)
adc_data = np.array(csv_data['hs_adc_dac_module_top_inst/hs_adc_dac_module_core_inst/dbg_adc_data[7:0]'])
plt.figure()
plt.plot(adc_data)
plt.show()

 

  1. 处理十六进制数据

  如果我们保存的是16进制数据,那读进来后,是16进制的字符串序列,如下图的data_hex,我们只需将该序列转成int型的序列即可。

图片[4]-导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug
image-20210820173216467

通过如下方式进行转换:

data_hex = np.array(csv_data['hs_adc_dac_module_top_inst/hs_adc_dac_module_core_inst/inst_adc/m_axis_data_tdata[15:0]'])
data_int = list(map(lambda x:int(x, 16), data_hex))
  1. 处理二进制数据

  二进制跟十六进制的处理方式基本相同,

data_bin = np.array(csv_data['hs_adc_dac_module_top_inst/hs_adc_dac_module_core_inst/inst_adc/m_axis_data_tdata[15:0]'])
data_int = list(map(lambda x:int(x, 2), data_bin))
  1. 并行数据分离

  在FPGA中,我们经常需要处理一些并行数据,比如ADC采样率比较高时,数据往往是以并行的方式呈现,在debug时也将他们一起加入到ila中。

  假设FPGA内部数据以32路并行的方式进行传输,adc的量化位数为14bit,那么整个数据位宽是32*14=448,那么存储的文件内容如下:

图片[5]-导出Xilinx FPGA的ILA数据到Python-Xilinx-AMD社区-FPGA CPLD-ChipDebug
image-20210820180516688

我们需要做的,就是将448bit数据,拆分成32个14bit数据,并将这些数据拼接成一个序列,绘图显示。

adc_data_448 = np.array(csv_data['adc_inst/phy_data[447:0]'])
lst = np.array([])
for dat1 in adc_data_448:
    dat2 = '{0:0448b}'.format(int(dat1,16)) #将16进制数据转成448bit的二进制
    for i in range(32):
        tmp = int(dat2[0+i*14:14+i*14],2)
        if tmp > 8192:
            tmp = tmp - 16384
        lst = np.append(lst, tmp)

 

 

 

 

请登录后发表评论

    没有回复内容