原创 Verilog中文件输入与输出任务实例解析

2010-6-30 14:58 12073 5 7 分类: FPGA/CPLD

三类:


1.文件打开和关闭:首先定义integer指针,然后调用$fopen(file_name,mode)任务,不需要文件时,调用$fopen(file_name)


常用mode包括


“w"打开文件并从文件头开始写,如果不存在就创建文件。


“w+"打开文件并从文件头开始读写,如果不存在就创建文件


"a"打开文件并从文件末尾开始写,如果不存在就创建文件


“a+"打开文件并从文件末尾开始读写,如果不存在就创建文件


2.输出到文件:显示任务前加f,调用格式:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


$fdisplay(文件指针,"显示内容",显示变量),再如$fmonitor(…)


除了多一个文件指针外,其他与在控制台输出的任务是用方法一致。


3.从文件读取:3个任务


$readmemb("文件名",存储单元,文件中要存入存储单元的起始地址,文件中要存入存储单元的终了地址)


其中文本文件可以包含空格,换行,制表符、注释、二进制,下面例子中,在工程文件夹目录下,有一个meomoryb.txt的文本文件,文件内容如下:


10101101 00011101 01101111 01100001


00000001 11111110 11111111 11101110


这个文件就符合要求,可以通过$readmemb读取。10101101第一个数据地址为0,向后以此类推。


另外一个系统任务$readmemh$readmemb区别就是识别十六进制,下面例子中,在工程文件夹目录下,有一个meomoryh.txt的文本文件,文件内容如下:


ef ab 3e 4f


举例:


module readmem;
    reg [7:0] mem[7:0];
    reg [2:0] i;
    integer file;
    initial
    begin
        file = $fopen("memory.txt","w");
        $readmemb("memoryb.txt",mem,4,0);//
从文本的读取数据向mem[4]开始写入,直到写到mem[0]
        for(i =0;i<7;i= i+1)
        begin
            $display("mem[%d] = %b",i,mem);
            $fdisplay(file,"mem[%d] = %b",i,mem);
        end
       
        $readmemh("memoryh.txt",mem);//
如果没有地址的限制,就默认从//mem[0]mem定义的最大地址。
        for(i =0;i<7;i= i+1)
        begin
            $display("mem[%d] = %h",i,mem);
            $fdisplay(file,"mem[%d] = %h",i,mem);
        end
        $fclose(file);       
    end
endmodule


控制台输出与生成的memory.txt中内容一致。


mem[0] = 00000001


mem[1] = 01100001


mem[2] = 01101111


mem[3] = 00011101


mem[4] = 10101101


mem[5] = xxxxxxxx


mem[6] = xxxxxxxx


mem[0] = 32


mem[1] = 36


mem[2] = 4f


mem[3] = 8a


mem[4] = ad


mem[5] = xx


mem[6] = xx


结果分析:首先读取memoryb.txt中从地址4到地址0的数据写入mem[0]mem[4],没有写入的存储器内容为xx,然后读取memoryh.txt从地址0到地址6的数据写入mem[0]mem[6],由于memoryh.txt只有4个数据,mem[4]以后的数据就没有了,保持上一次写的内容,所以,mem[4]ad(十六进制)即二进制10101101


$fscanf(文件指针,读取格式,数组);


返回值为1表示成功,读取格式可以为%b,%d,%h(注意,如果读取格式为二进制,则文件中只能识别0 1.)


举例: 在工程文件夹中新建一个data_in.txt的文件,文件内容为:0 1 11e 1e 11e1 11ee 2 3  101011 4 5 6 7 8 9 。通过下面的程序将文件中数据读取到data_in这个16*16的存储区内,然后通过$display任务函数在控制台上显示,通过$fdisplay输出到data_out.txt文件中。


`define NULL 0


module file_scanf;


integer fp_r,fp_w;
integer flag1,flag2;
reg [3:0] bin;
reg [15:0] data_in [15:0];
reg [15:0] cnt = 15;


initial
begin :file_fscanf
    fp_r = $fopen("data_in.txt","r");
    fp_w = $fopen("data_out.txt","w");
   
    if(fp_r == `NULL)
      $display("failture to open data_in.txt ");
    if(fp_w == `NULL)
      $display("failture to open data_out.txt ");
   
    //while(cnt>0)
    repeat(10)
    begin
        flag1 = $fscanf(fp_r,"%h",data_in[cnt]);      
         $display("data_in[%d]=%h ",cnt,data_in[cnt]);
         $fdisplay(fp_w,"%h",data_in[cnt]);
        cnt = cnt -1;
    end
$fclose(fp_w);
$fclose(fp_r);
end
endmodule


 


应用举例:


从文本中读取预先设计好的向量


reg [7:0] mem[7:0];//先定义一块存储区域


$readmemb("memoryb.txt",mem);//读文件内容到存储区


{a,b,c,d,e} <= mem[3];//将保存有向量的存储区数据赋值给测试输入信号

文章评论2条评论)

登录后参与讨论

用户869440 2012-11-20 21:11

请问fdisplay同时最多可支持多少个文件的写入?

用户304526 2011-7-21 17:11

请问你的qq号是多少?能否交流下,我的qq号时870939652
相关推荐阅读
用户180508 2011-08-08 22:29
运算放大器指标
1.输入失调电压VIO(input offset voltage) :输入电压为零时,将输出电压除以电压增益,再加上负号,即为折算到输入端的失调电压。亦即使输出电压为零时在输入端所加的补偿电压。VIO...
用户180508 2011-02-18 22:21
UDE(u盘超级加密2008)失效解决
UDE伪装成唐诗三百首的加密软件,在忘记密码资料还没有丢失,操作系统改变时加密文件没有显示在加密区内。此时文件也没有丢失。 采用R-Studio(注册后)可以探测到隐藏的文件,并恢复。 本人遇到的隐藏...
用户180508 2011-02-01 12:35
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件 QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉...
用户180508 2011-02-01 12:02
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉安...
用户180508 2011-02-01 12:01
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉安...
用户180508 2010-12-30 10:18
VC安装错误解决
安装VC++6.0时候总是说我的安装程序无法创建一个DCOM用户来注册? 右击我的电脑-》管理-》本地用户和组-》用户-》删除VSA Sever Account项 再安装,成功!...
我要评论
2
5
关闭 站长推荐上一条 /2 下一条