#Matlab对数据的简单处理
我们在使用vivado的时候,有时需要我们输入一些数据进入模块来验证模块的正确性;如果数据量比较少,可以使用移位寄存器去输入数据。但是数据量比较大的话,就可以使用ROM将需要的数据存储在coe文件里读取,这样更为方便。
###规定输出数据的位宽
num2str(a,'04d'); %a这个数据变成一个四位宽
fprintf(fid,'%02x ',vpa( data(i) ) );%输出的数组变成两位
sprintf('%02x' , 0) ; % char '00'
###将十进制的二维数组直接转换成十六进制的二维数组
[mm,nn] = size(tran_finial); % 获取初始十进制矩阵的行列值
hex_array = cell(mm,nn); % 存储转换后的16进制格式矩阵,矩阵大小与init_array对应,不能是字符char数组只会显示一个字符
N = 2; % 转换后的精度,即16进制数所占字符宽度,可自定义
for row_i = 1:mm
for column_j = 1 : nn
bin_temp = tran_finial(row_i,column_j); %将对应的十进制数据取出来
hex_temp = dec2hex(bin_temp,N); %将数据变成十六进制两个字符的十六进制数据
hex_array{row_i,column_j} = hex_temp; %赋给元胞数组
end
end
###字符串拼接
可以使用字符串拼接操作符(+)或字符串的 strcat() 函数将多个字符串组合成一个字符串。
str1 = "Hello";
str2 = "world";
str3 = "!";
result = str1 + " " + str2 + str3;
disp(result); % 输出: "Hello world!"
###字符串拆分
可以使用reshape()函数进行字符串的拆分将其拆成我们想要的比如2个字符、4个字符、8个字符等等。
JJZLData = ('1ACFFC1D00C7843101');
data = reshape(JJZLData,2,[])' ; %先拆分,后转置
###在coe文件内存入十六进制数据
data = (1:100)'; % 生成递增的1-100的数列
hex_data = dec2hex(data); % 将数据转换为十六进制格式
% 将数据写入coe文件中
filename = 'data.coe';
fileID = fopen(filename,'w');
fprintf(fileID,'memory_initialization_radix=16;\n');
fprintf(fileID,'memory_initialization_vector=\n');
for i = 1:size(hex_data,1)
if i == size(hex_data,1)
fprintf(fileID,'%s;\n',hex_data(i,:));
else
fprintf(fileID,'%s,\n',hex_data(i,:));
end
end
fclose(fileID);
###在coe文件内存入二进制数据
JJZLData = ('1ACFFC1D00C7843101');
ASM_Hex = hex2dec(JJZLData'); % 十六进制字符串转十进制字符串
ASM_Bin = dec2bin(ASM_Hex); % 十进制字符串转二进制字符串
length_data = length(ASM_Hex);
fid=fopen('TEST_KP_ZJZL.Coe','wt');
fprintf(fid,'memory_initialization_radix=2;\n');
fprintf(fid,'memory_initialization_vector=\n');
for j = 1:length_data
for q=1:4
if ASM_Bin(j,q)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
fprintf(fid,'\n');
end
end
fprintf(fid,'; ');
fclose(fid);