Verilog读写文件

Verilog读写文件一.读写文件相关的系统任务  在进行FPGA模块的开发过程中,常常需要对数据的处理过程进行行为仿真,以验证FPGA的功能逻辑是否正确,因此需要将FPGA行为仿真的结果与MATLAB或C/C++的处理结果进行对比验证。但需要对比的数据量比较大时,将输入输出结果数据存入文件进行对比是非常常用的方法。  Verilog中读写文件常用到的系统任务主要有以下几个:1.文件打开、关闭与定位操作:$fo…

大家好,又见面了,我是你们的朋友全栈君。

一.读写文件相关的系统任务

    在进行FPGA模块的开发过程中,常常需要对数据的处理过程进行行为仿真,以验证FPGA的功能逻辑是否正确,因此需要将FPGA行为仿真的结果与MATLAB或C/C++的处理结果进行对比验证。但需要对比的数据量比较大时,将输入输出结果数据存入文件进行对比是非常常用的方法。

    Verilog中读写文件常用到的系统任务主要有以下几个:

1.文件打开、关闭与定位操作:$fopen(file_name)、$fclose(file_name)、$fseek();

2.文件读取:$fscanf和 $​readmemh,其中$​readmemh的作用是件文件中的数据一次性的读入某个数组中,然后依次从数组中取出1个数据进行处理;而$fscanf的作用是从文件中读出一行的数据。两个系统任务的常见用法如下:

$​readmemh:

reg  [15:0] data_mem [0:1023] ;//定义一个位宽为16bit,深度为1024的mem

$​readmemh(“path/data.txt”,data_src_mem);

$fscanf:

reg [15:0] reg1, reg2, reg3;  //定义三个位宽为16bit的寄存器

cnt = $fscanf(fp, “%d %d %d”, reg1, reg2, reg3);//从数据文件中以十进制的方式读出一行中的三个数

3.数据写入文件:$fwrite(file_handle,”%d\n”,reg1) ;

二.调用示例

1.利用Matlab生成数据文件

    在Matlab中生成一正弦波信号,并将其定点化后存入.txt文件。Matlab代码如下所示:

%% 实验在vivado中通过verilog读取txt文件数据
%% DJason 2018.04
clc;
close all;
clear all;
%% 生产一个正弦波信号
fs = 100;   %采样率100
t0 = 5;     %采样时间5s
N = fs*t0;  %采样点数
f0 = 2;    %信号频率
t = (0:N-1)/fs;
s = cos(2*pi*f0*t);

%% 将信号定点化,转为int16型数据
S = int16(s.*2^15*0.8);
%% 将定点后的数据写入文件
fp = fopen('data.txt','wt');
for i =1 : length(S)
    fprintf(fp, '%d\n', S(i));
end
fclose(fp);

生成的正弦波下图

Verilog读写文件

2.在Vivado中读入数据文件

    将生成的data.txt文件放到vivado工程目录下的\XXX_project.sim\sim_1\behav目录下,然后编写TestBench对该文件进行读取,同时将读取的数据存放到另一个文件中,verilog代码如下所示

module test( );

integer fp_r,fp_w;  
integer count;   
reg clk;
reg [15:0] reg1;

initial  
begin 
    clk = 0; 
    reg1 = 0;
    count = 0;
    fp_r=$fopen("data.txt","r");//以读的方式打开文件  
    fp_w=$fopen("data_out.txt","w");//以写的方式打开文件  
end 

always@(posedge clk)
begin
    if(count < 500)
    begin
        $fscanf(fp_r,"%d" ,reg1) ;//每次读一行 
        count <= count + 1; 
        $fwrite(fp_w,"%d\n",reg1) ;//写入文件
    end
    else
    begin
         $fclose(fp_r);//关闭已打开的文件
         $fclose(fp_w);
    end  
end

然后利用vivado自带的仿真器进行仿真,得到结果如下图所示

Verilog读写文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141625.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker入门(利用docker部署web应用)[通俗易懂]

    docker入门(利用docker部署web应用)[通俗易懂]前言:本课程是在慕课网上学习第一个docker化的java应用课程时所做的笔记,供本人复习之用目录第一章什么是docker1.1docker的发展史1.2docker国内应用史1.3什么是Docker第二章了解docker2.1docker思想2.1.1集装箱2.1.2标准化2.1.3隔离2.2docker解决的问题2.2.1…

    2022年5月28日
    36
  • 进程同步和线程同步

    进程同步和线程同步怎样同步多个线程或多个进程的活动。为允许在线程或进程间共享数据,同步是必需的。互斥锁和条件变量是同步的基本组成部分。互斥锁和条件变量出自POSIX.1线程标准,它们总是可用来同步一个进程内的各个线程的。如果一个互斥锁或条件变量存放在多个进程间共享的某个内存中,那么POSIX还允许它用于这些进程间的同步。互斥锁、条件变量、读写锁、信号量均可用于进程、线程的同步。多线程同步方法1)互斥锁互斥锁是最基

    2022年7月15日
    13
  • SOAP协议详解「建议收藏」

    SOAP协议详解「建议收藏」一.概念:SOAP:简单对象访问协议,是交换数据的一种协议规范,它是一个轻量级\简单的\基于xml的协议;它被设计成在WEB上交换结构化的和固化的信息。二.相关定义1.基于类对象的传输协议;2.SOAP封装(envelop),它定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;3.SOAP编码规则(encodingrules),它定义了一种序列化机制,用

    2022年7月12日
    34
  • Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    2022年1月22日
    42
  • acwing-2189. 有源汇上下界最大流

    acwing-2189. 有源汇上下界最大流给定一个包含 n 个点 m 条边的有向图,每条边都有一个流量下界和流量上界。给定源点 S 和汇点 T,求源点到汇点的最大流。输入格式第一行包含四个整数 n,m,S,T。接下来 m 行,每行包含四个整数 a,b,c,d 表示点 a 和 b 之间存在一条有向边,该边的流量下界为 c,流量上界为 d。点编号从 1 到 n。输出格式输出一个整数表示最大流。如果无解,则输出 No Solution。数据范围1≤n≤202,1≤m≤9999,1≤a,b≤n,0≤c≤d≤105输入样例:10

    2022年8月9日
    2
  • 计算机硬件知识总结

    计算机硬件知识总结计算机硬件对于软件工程师来说很多时候只是停留在一个概念上,例如CPU和内存,硬盘等等,这些都属于计算机组成原理里面必然会介绍到的,博主大学前期接触过大量的计算机硬件知识,曾几何时我甚至考虑过全身心投入到半导体行业,但是考虑到环境限制因素和个人职业的发展,折中选择了软件方向,但是最近阅读了一些机器学习相关的文章,也尝试过自己去训练模型,发现模型训练对硬件的要求比较特殊,这也让我有机会来从新总结一下硬…

    2022年7月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号