Verilog中常見文件操作($readmemb,$fopen,$fwrite,$fclose)


一、$readmemb/$readmemh

$readmemb和$readmemh用來從文件中讀取數據到存儲器中。

其中readmemb要求每個數字是二進制數,readmemh要求每個數字必須是十六進制數字。

數字中不定值x或X,高阻值z或Z,和下划線(_)的使用方法和代表意義與一般Verilog HDL程序中的用法一致。

在Verilog語法中,一共有以下六種用法:

  • (1)$readmemb("<數據文件名>",<存儲器名>);
  • (2)$readmemb("<數據文件名>",<存儲器名>,<起始地址>);
  • (3)$readmemb("<數據文件名>",<存儲器名>,<起始地址>,<終止地址>);
  • (4)$readmemh("<數據文件名>",<存儲器名>);
  • (5)$readmemh("<數據文件名>",<存儲器名>,<起始地址>);
  • (6)$readmemh("<數據文件名>",<存儲器名>,<起始地址>,<終止地址>);

二、$fopen,$fwrite,$fclose

$fwrite用來向文件中寫入數據。與文件讀取不同,文件寫入需要打開文件,寫入,最后關閉文件。操作流程如下:

handle = $fopen("D:/file.txt","w");//按照寫操作打開文件,得到對應的句柄,作為文件操作標識;其中,文件路徑間隔為“/”而不是“\”

$fwrite(handle,"%d\n",data);//按照十進制格式寫入數據到handle對應文件中,只能逐個寫入(即data不能是數組)

$fclose(handle);//關閉文件,至此文件操作結束

三、仿真驗證

驗證流程:

(1)新建文件num.txt,存入0-10共11個二進制數;

(2)測試文件中,將num.txt中的數據按照二進制格式讀入到寄存器;

(3)再將寄存器中的數據反序按照10進制存入num2.txt

`timescale 1ns / 1ps
 
module file_test(
 
    );
reg [3:0]data[0:15];
reg [3:0]data2[0:15];
integer handle1;
integer i=0;
initial
begin
    $readmemb("F:/vivado_files/num.txt",data);
 
    handle1 = $fopen("F:/vivado_files/num2.txt","w");
    repeat(16)
    begin
        $fwrite(handle1,"%d\n",data[15-i]);
        i = i+1;
    end
    $fclose(handle1);
end
endmodule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM