首页->【MATLAB Usage 】

2 1

function [ res ] = ui_hex_wr_son(hexfilenamepath,datpth,words)

%UI_HEX_WR 此处显示有关此函数的摘要

%之前给出了仅包含2B数据的hex文件生成。改程序给出了3B即24位的数据生成,读者可以扩

%展到任意长度数据的hex文件

%   此处显示详细说明
%   MATLAB 下用于生成Questasim Verilog HDL的ram仿真的hex文件
%   hex file generation
%   input 2B-16bits
%   function is ok
%   输入参数
    % hexfilenamepath :hex输出文件路径,
    % indata :输入数据

    % datpth :输入dat文件,关于dat文件的创建,请参考相关例程。

% 输出数据
    %res       : 操作状态

fileID=fopen(hexfilenamepath,'wb');
filepthID=fopen(datpth,'rb');

    if fileID == -1
        
       res=-1;
       error('the file path is error ');
       
    end
    
    if filepthID == -1
       
       res=-1;
       error('the file path is error ');
    end
    
    i=0;
    if words == 2
        d=fread(filepthID,'uint16');
    else
        t=fread(filepthID,'uint8');
        d0=t';
        [~,col]=size(d0);
        d=zeros(1,col/3);
        cnt=1;
        for t=1:3:col-2
            d(cnt)=d0(t)+d0(t+1)*hex2dec('100')+d0(t+2)*hex2dec('10000');
            cnt=cnt+1;
        end
    end
    [~,col]=size(d);
    indata=d;
    while i<col
      hexgenerate(fileID,i,indata(1,i+1),0,words);
      i=i+1;
    end
    
endofhex(fileID);
%end of file
fclose(fileID);
fclose(filepthID);
res=1;

end

function [chksum]=chkdatasum(data,wordcnts)
    if wordcnts == 2
        data=uint16(data);
        d1= (bitshift(data,-8));
        d3= (mod(data,uint16(hex2dec('100'))));
        d2=0;
    else       
        d1= bitshift(data,-16);               %最高位的8
        tmp=uint16(mod(uint32(data),hex2dec('10000')));   %get 3WB ge FFFFFF
        d2= bitshift(tmp,-8);
        d3= mod(tmp,uint16(hex2dec('100')));
    end
    
    chksum=mod((d1+d3+d2),256);
    
end

function hexgenerate(fpathID,addr,data,type,datacnts)
    %datacnts=2;
    chksum0=datacnts;
    fprintf(fpathID,':%02X',datacnts);    %1 data cnts
    fprintf(fpathID,'%04X',addr);         %addr'
    fprintf(fpathID,'%02X',type);
    
    if datacnts == 2                 
        fprintf(fpathID,'%04X',data);         
    else
        fprintf(fpathID,'%06X',bitand(data,hex2dec('ffffff')));     
    end
    d0=chkdatasum(data,datacnts);
    d1=chkdatasum(addr,2);
    d2=mod(d0+d1+chksum0,256);  
    chksum= hex2dec('100')-d2;
    
    chksum=mod(chksum,256);
    fprintf(fpathID,'%02X',chksum);
    fprintf(fpathID,'\n');
    
end

function endofhex(fpathID)

   fprintf(fpathID,':%02X',hex2dec('0')); % length of data in this  row
   fprintf(fpathID,'%04X',hex2dec('0'));      % load offset
   fprintf(fpathID,'%02X',hex2dec('1'));        % endof file
   fprintf(fpathID,'%X',hex2dec('ff'));          % chksum
   
end

楼主可见

  1. shwnyoo 1#

    在hex文件生成时,难点在于数据的校验和计算,由于matlab里面的取整函数与c语言的整除有区别, 所以本例程中使用了右移函数。同时,在实际的背景下,我们采用了quartus 下另存的hex与代码生成的hex进行了对比,缩短了调试时间。