大家好,又见面了,我是你们的朋友全栈君。
一.读写文件相关的系统任务
在进行FPGA模块的开发过程中,常常需要对数据的处理过程进行行为仿真,以验证FPGA的功能逻辑是否正确,因此需要将FPGA行为仿真的结果与MATLAB或C/C 的处理结果进行对比验证。但需要对比的数据量比较大时,将输入输出结果数据存入文件进行对比是非常常用的方法。
Verilog中读写文件常用到的系统任务主要有以下几个:
1.文件打开、关闭与定位操作:fopen(file_name)、fclose(file_name)、
2.文件读取:fscanf和 readmemh,其中readmemh的作用是件文件中的数据一次性的读入某个数组中,然后依次从数组中取出1个数据进行处理;而fscanf的作用是从文件中读出一行的数据。两个系统任务的常见用法如下:
$readmemh:
reg [15:0] data_mem [0:1023] ;//定义一个位宽为16bit,深度为1024的mem
$readmemh(“path/data.txt”,data_src_mem);
$fscanf:
reg [15:0] reg1, reg2, reg3; //定义三个位宽为16bit的寄存器
cnt = $fscanf(fp, “%d %d %d”, reg1, reg2, reg3);//从数据文件中以十进制的方式读出一行中的三个数
3.数据写入文件:$fwrite(file_handle,”%dn”,reg1) ;
二.调用示例
1.利用Matlab生成数据文件
在Matlab中生成一正弦波信号,并将其定点化后存入.txt文件。Matlab代码如下所示:
代码语言:javascript复制%% 实验在vivado中通过verilog读取txt文件数据
%% DJason 2018.04
clc;
close all;
clear all;
%% 生产一个正弦波信号
fs = 100; %采样率100
t0 = 5; %采样时间5s
N = fs*t0; %采样点数
f0 = 2; %信号频率
t = (0:N-1)/fs;
s = cos(2*pi*f0*t);
%% 将信号定点化,转为int16型数据
S = int16(s.*2^15*0.8);
%% 将定点后的数据写入文件
fp = fopen('data.txt','wt');
for i =1 : length(S)
fprintf(fp, '%dn', S(i));
end
fclose(fp);
生成的正弦波下图
2.在Vivado中读入数据文件
将生成的data.txt文件放到vivado工程目录下的XXX_project.simsim_1behav目录下,然后编写TestBench对该文件进行读取,同时将读取的数据存放到另一个文件中,verilog代码如下所示
代码语言:javascript复制module test( );
integer fp_r,fp_w;
integer count;
reg clk;
reg [15:0] reg1;
initial
begin
clk = 0;
reg1 = 0;
count = 0;
fp_r=$fopen("data.txt","r");//以读的方式打开文件
fp_w=$fopen("data_out.txt","w");//以写的方式打开文件
end
always@(posedge clk)
begin
if(count < 500)
begin
$fscanf(fp_r,"%d" ,reg1) ;//每次读一行
count <= count 1;
$fwrite(fp_w,"%dn",reg1) ;//写入文件
end
else
begin
$fclose(fp_r);//关闭已打开的文件
$fclose(fp_w);
end
end
然后利用vivado自带的仿真器进行仿真,得到结果如下图所示
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141625.html原文链接:https://javaforall.cn