之前已经写过一个如何使用matlab生成coe文件,matlab自行运算生成三角波、正弦波等数据,并保存为COE文件。可跳转下面的网址进行查阅。
使用matlab生成正弦波、三角波、方波的COE文件_三角波文件.coe-CSDN博客https://blog.csdn.net/yindq1220/article/details/125173035?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171342842616800182769139%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171342842616800182769139&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-125173035-null-null.nonecase&utm_term=coe&spm=1018.2226.3001.4450 但是,如果想直接把一个文件的二进制码流整体转化成coe文件(注意并不是文件内的内容,而是文件本身),又该怎么操作呢?所有的文件都是按照二进制码保存的,只要转换成COE文件,FPGA就能通过发送该COE文件,实现发送ZIP文件或者其他任何格式的文件。
本文就是解决了这个问题。
一、MATLAB生成coe文件
% 读取图像
file = fopen('1.zip');
data = fread(file);%读取文件存在data中
fclose(file);fid = fopen('zip.coe','wt'); %创建一个名为zip.coe的文件
%- COE 文件前置格式
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 16;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- 写数据
for i = 1:1:length(data) %读取所有的data数据if(i == length(data))fprintf( fid, '%X;',data(i));%最后一行为分号elsefprintf( fid, '%X,\n',data(i));%写入目标文件end
endfclose(fid);%关闭文件
二、C语言生成coe文件
#include <stdio.h>
#include <vector>int main()
{FILE *rdfile = fopen("1.zip","rb");FILE *wrfile = fopen("zip.coe","w");if (rdfile == NULL) {printf("Failed to open file\n");return -1;}int data;fprintf(wrfile, "memory_initialization_radix=16;\n");fprintf(wrfile, "memory_initialization_vector=\n");std::vector<unsigned char> buffer;while (fread(&data, sizeof(char), 1, rdfile) == 1) {buffer.push_back(data);}for (int i = 0; i< buffer.size(); i++) {if(i==buffer.size())fprintf(wrfile, "%X;", buffer[i]);elsefprintf(wrfile, "%X,\n", buffer[i]);}fclose(rdfile);fclose(wrfile);return 0;
}
三、verilog生成coe文件
本来打算写verilog读文件二进制流,保存为COE文件的,但是使用$fread、$fgetc等函数发现结果有点问题。并且matlab和C读取文件二进制码流生成COE也足够用了,此处也就不再深究了。只举例一个最简单的固定数据输出为COE文件的代码。注意下,生成coe文件的代码涉及到读写文件,只能仿真运行。
module coe_gen(
);integer file;
integer i;initial beginfile = $fopen("C:/Users/ADMIN/Desktop/out.coe", "w"); // 打开文件以便写入if (file == 0) begin$display("无法打开文件!");$finish;end$fwrite(file,"memory_initialization_radix=16;\n"); // 写入一行文本$fwrite(file,"memory_initialization_vector=\n"); // 写入另一行文本$fwrite(file,"%x,\n",8'h00);$fwrite(file,"%x,\n",8'h10);$fwrite(file,"%x,\n",8'h20);$fwrite(file,"%x,\n",8'h30);$fwrite(file,"%x,\n",8'h40);$fwrite(file,"%x,\n",8'h50);$fwrite(file,"%x;",8'h60); //最后一个数据$fclose(file); // 关闭文件
endendmodule