zoukankan      html  css  js  c++  java
  • Verilog中文件输入与输出任务实例解析(转载)

    三类:

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

    常用mode包括

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

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

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

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

    2.输出到文件:显示任务前加f,调用格式:

    $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[i]);
                $fdisplay(file,"mem[%d] = %b",i,mem[i]);
            end
            
            $readmemh("memoryh.txt",mem);//
    如果没有地址的限制,就默认从//mem[0]mem定义的最大地址。
            for(i =0;i<7;i= i+1)
            begin
                $display("mem[%d] = %h",i,mem[i]);
                $fdisplay(file,"mem[%d] = %h",i,mem[i]);
            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];//将保存有向量的存储区数据赋值给测试输入信号

  • 相关阅读:
    scroll事件实现监控滚动条改变标题栏背景透明度(zepto.js )
    瀑布流-转载
    如何清除img图片下面有一片空白
    加减号改变input[type=number]的数值,基于[zepto.js]
    如何移除HTML5的type=""number""的input标签的上下箭头
    滑屏框架
    GO_06:GO语言基础之struct
    GO_05:GO语言基础map与函数
    GO_04:GO语言基础条件、跳转、Array和Slice
    GO_03:GO语言基础语法
  • 原文地址:https://www.cnblogs.com/cheetah/p/2969608.html
Copyright © 2011-2022 走看看