FPGA和matlab读写txt文件

说明

博主一般用matlab和VIVADO进行开发,常常碰到二者需要读写数据的问题,因此对matlab和FPGA读写数据做一个总结,主要是为了方便自己查阅,减少不必要的时间浪费,同时和大家做一个分享。

matlab读写txt数据

matlab读txt

fid=fopen('data.txt','r');
data=fscanf(fid,'%d',[1 Inf]);
fclose(fid);

先创建一个句柄fid,然后再使用fscanf函数读取txt的数据。注意txt文件需在matlab当前文件夹下,否则需写文件路径。%d代表格式为有符号整数。

matlab写txt

数据量化

首先是数据量化,因为本文着眼于matlab和FPGA的联合使用,FPGA能读取的txt数据一般是二进制的,需要先完成数据量化。

data_txt=zeros(1,length);
data_txt=string(data_txt);
for ii=1:length
    if(data(ii)>=0)
        real_txt(ii)=dec2bin(ceil(data(ii)*2^a),data_width);
    else
        real_txt(ii)=dec2bin(2^data_width-ceil(-data(ii)*2^a),data_width);
    end
end

要先创建一个数组data_txt,并将其转换为string格式。然后完成数据量化,data_width是量化宽度,a是缩放的位数,a取决于需要量化的定点数的数据格式(小数位的个数),然后用dec2bin转化为二进制数。
如0.707量化为8位定点数,1位符号位,1位整数位,6位小数位,则量化结果为:
在这里插入图片描述
-0.707,量化结果为:
在这里插入图片描述

数据写入

然后写入的方式与读数据类似:

fid=fopen('data.txt','w'); 
fprintf(fid,'%s\r\n',data_txt); 
fclose(fid);

先创建一个句柄fid,然后再使用fprintf函数读取txt的数据。%s表示输出字符串,\r是回车符,\n是换行符。

FPGA读写txt数据

FPGA读txt

这在testbench撰写时非常实用,testbench文件除了需要写时钟信号和复位信号之外,常需要读取文件作为输入数据的模拟,比较常见的方法是读取txt文件。

integer i;
reg [width-1:0] data;
reg [width-1:0] data_reg [1:length];
initial 
begin
	#200
	$readmemb("data.txt", data_reg );  
    i = 0;
    repeat(length) begin   
        i = i + 1;
        data = data_reg [i]; 
        #clk_period;         
    end
end  

使用“$ readmemb”将txt的数据读取到data_reg中,data_reg的数据宽度是width,深度是length,然后在每个时钟周期,读取data_reg的数据到data中。
“$ readmemb”若不写文件路径,则txt文件需与testbench在一个文件夹下,写文件路径的话需把文件路径的“\”改为“/”。
代码里的#200可以根据开发需要自行修改,代表延迟200个ns,这边和复位信号的拉高保持同步(testbench中复位信号低电平有效,在200ns拉高)。

FPGA写txt

integer file;
initial
begin
    file = $fopen("data.txt");
end            
wire clk;
assign clk=sys_clk&sys_rst_n;
always @ (posedge clk) 
    $fdisplay(file, "%d", data);    

FPGA的coe文件

在FPGA开发中,RAM或ROM的初始化文件、FIR滤波器的系数等需要读取coe文件,coe文件生成也很方便,一般是matlab输出二进制txt文件,然后在txt文件的开始处加入这两句代码,再把文件后缀名从txt改成coe即可:

memory_initialization_radix=2;
memory_initialization_vector=
FPGA可以使用Verilog语言中的系统任务或者读文件数据的方法来读取文件数据。在Verilog语言中,有两种常用的方法来从文件读取数据:$readmemb和$readmemh。这两个系统任务可以从文本文件读取数据,并将数据加载到存储器中。被读取文件可以包含空白空间、注释、二进制或十六进制数字。其中,$readmemb任务用于读取二进制文件,而$readmemh任务用于读取十六进制文件。通过这两种方法,FPGA可以从外部文件加载数据,以便在设计中使用。 在Verilog代码中,可以使用$readmemh或$readmemb任务来读取文件数据,并将数据加载到指定的存储器中。具体的步骤如下: 1. 定义存储器变量,例如使用reg类型定义一个存储器数组。 2. 使用$readmemh或$readmemb任务来读取文件数据并将数据加载到存储器中。需要指定文件路径和存储器变量作为参数。 3. 在设计中使用已加载的文件数据,例如在测试台或其他设计模块中。 通过这种方式,FPGA可以从外部文件读取数据,以便在设计中进行测试、分析或仿真。这种方法可以将数据准备和分析的工作从测试台中分离出来,方便进行协同工作和调试。同时,可以使用各种工具如C/C++、Excel表格、Matlab等生成测试数据,并通过Verilog代码读取这些数据,有助于分析程序逻辑是否正确。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA开发中Testben读取外部文件的方式](https://blog.csdn.net/qq_40793742/article/details/82939127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值