Verilog仿真时读取bin文件模拟输入数据流,将输出数据流写入bin文件

读取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进制格式
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值