VIVADO导出仿真数据到MATLAB中进行分析
VIVADO导出仿真数据到MATLAB中进行分析
目录
前言
一、导出仿真数据需要编写的RTL代码
二、MATLAB读入txt文件中的数据
三、需要注意的点
总结
前言
在使用 Xilinx Vivado 进行 FPGA 开发时,如何将 RTL 仿真生成的数据导出,进行进一步分析与可视化,是很多开发者常遇到的问题。Vivado自带仿真工具不支持直接导出仿真数据,但是我们可以通过编写一段简单的RTL代码即可将需要的仿真数据保存到txt文件中,后续MATLAB有自带的的textscan函数可以将txt中的数据读出来,本文将介绍这一过程。
提示:以下是本篇文章正文内容,禁止转载,引用请附上链接!
一、导出仿真数据需要编写的RTL代码
示例:
integer fd;
initial begin
fd = $fopen("output.txt", "w");
end
always @(posedge clk)
begin
if(wr_en)
begin
$fwrite(fd, "%h, %h, %h\n", wr_addr_row, wr_addr_col, wr_data);
end
end
这段代码可以在仿真时加到design RTL代码中,综合实现的时候要去掉,代码本身是实现不了的。这段代码的含义,首先打开一个名为 output.txt 的可写文件,如果不存在,会自动创建。然后在每个时钟上升沿,当wr_en为高时,会以16进制的格式往txt文本中写入wr_addr_row, wr_addr_col, wr_data这三个数据。如果想以二进制写入,将%h改为%b即可。
编写完代码以后,重新开始仿真,运行仿真直到仿真完要写入的所有数据停止仿真,然后关闭仿真,就能在工程目录下找到一个名为output的文本文件,如下图所示:
打开该文本文件就能看到如图所示的仿真数据了。
二、MATLAB读入txt文件中的数据
在MATLAB中使用下面一段代码即可读出txt文本中的数据:
% 读取文件
fid = fopen('output.txt', 'r');
data = textscan(fid, '%s %s %s', 'Delimiter', ',', 'HeaderLines', 0);
fclose(fid);
% 提取三列数据
c1 = strtrim(data{1}); % 移除可能的空格
c2 = strtrim(data{2});
c3 = strtrim(data{3});
% 转换时间戳(十六进制 -> 十进制整数)
row = hex2dec(c1);
col = hex2dec(c2);
data_hex=string(c3);
三、需要注意的点
1、这段代码仿真时可以加到设计文件中,综合实现时要删除;
2、添加这段代码后需要重新运行仿真,仿真结束后 close simulation 才能在前文所示目录下找到包含仿真数据的txt文本文件;
3、仿真停止,打印数据就停止,所以请确保仿真时间长度足以覆盖自己打印所需要的数据。
总结
以上就是今天要讲的内容,本文详细介绍了如何将VIVADO仿真数据导出至txt文本文件中,然后导入到MATLAB中进行分析。