读取bin文件模拟输入数据流
整体代码
//初始化文件路径和长度
parameter IN_FILE_PATH = "../xxx.bin";
integer i;
integer flie, fp;
initial
begin
i=0;
flie = $fopen(IN_FILE_PATH,"r");
while(!$feof(flie))
begin
@(posedge clk)
begin
if(data_vld) begin
fp = $fread(data,flie);
end
if(newframe) begin
flie = $fopen(IN_FILE_PATH,"r");
end
end
end
end
在initial块中,首先打开文件,fopen的语法为:
integer <file_desc>;
<file_desc> = $fopen("<file_name>", "<file_mode>");
//file_desc :为文件的句柄,反映文件打开是否成功, 如果file_des == 0, 文件打开失败; 如果file_des != 0, 文件打开成功。
//file_name : 是在操作系统中的文件名称。
//file_mode: 是以什么样非方式打开操作系统中的文件。r:读;w:写;a:在文件末尾接着写
feof判断文件是否结束来控制循环,在循环内部监控时钟上升沿,上升沿时判断data_vld是否有效,若为有效则读取文件的数据到data中,通过data_vld来生成与之对齐的数据信号,其中fread的语法为:
$fread(mem, fd, start_addr, count)
//mem是存储数组或寄存器变量
//fp为fopen后赋值的文件句柄
//start_addr为文件起始地址,count 为读取长度。若 start和count省略,数据会全部填充至变量 mem。
需要关注的是,一般会省略文件起始地址和读取长度,那么mem为多大,就会从文件中读取多大的数据出来填充mem。
如果只需要读取一次文件,那么代码到此就结束了,但是如果还需要每一帧都读取该文件转换为数据流,则在循环里判断新的一帧信号是否到来,在新的一帧再次打开一次文件,从头开始读取数据。
将数据流写入bin文件
整体代码
integer flie;
parameter WR_FILE_PATH = "../xxx.bin";
reg [31:0] cnt;
initial
begin
flie= $fopen(WR_FILE_PATH,"w");
cnt_pixel=0;
while(1)
begin
@(posedge pix_clk)
begin
if(cnt == pix)begin
$fwrite(flie,"\n");
cnt_pixel=0;
end
if(data_vld)begin
$fwrite(flie,"%d\t",data);
cnt = cnt + 1;
end
end
end
end
与读文件类似,fopen打开文件,可以通过cnt计数决定写多少个数据之后写入换行,fwrite的语法为:
$fwrite(fp,"%d", dout);
// fp是文件句柄
// %d是写入数据格式,%d:十进制;%c:单字符格式;%x16进制格式