MATLAB与ISE联合仿真的必备流程
一般的仿真流程是,通过MATLAB进行核心算法的仿真,然后从MATLAB产生数据并传给ISE的testbench,运行verilog程序,并将输出数据在Modelsim中仿真,并写回MATLAB中观察(例如频谱等)。
MATLAB写入testbench:
MATLAB:
sin_data=dec2bin(sin_data);
[m,n]=size(sin_data);
fid = fopen('D:\sin.txt','wt');
for i=1:m
fprintf(fid,'%s\n',sin_data(i,:));
end
Testbench:
initial begin
$readmemb("D:/sin.txt",data_mem);
end
always @(posedge sclk or negedge rst_n)
begin
if(!rst_n) begin
signal_in<=0;
i<=0;
end
else begin
signal_in<=data_mem[i];
i=i+1;
end
end
说明:因为MATLAB中的数一开始是十进制的,而testbench只能读二进制或十六进制。因此要不将MATLAB转为二进制,testbench用readmemb读,要不转成十六进制,用readmemh读。
testbench写回MATLAB:
testbench:
initial f_file = $fopen("D:/fir.txt");
always @(i)
$fdisplay(f_file,"%h",fir_out);
MATLAB:
fir = fopen('D:/fir.txt','r');
fa(i) = fscanf(fir, '%x', 1);
MATLAB输出的是浮点数,一般在MATLAB中要先量化为定点数,例如量化为8位有符号数:
sin_data=round(sin_wave/max(abs(sin_wave))*127);
因为是有符号数,所以负数要转化为补码:
neg=find(sin_data<0);
sin_data(neg)=sin_data(neg)+256;
同时FPGA端要把端口、寄存器、乘法核等都设置成signed有符号的(testbench不用)。
同理,若要输出到MATLAB。补码必须还原回去:
if( fa(i)>2^15-1 ) fa(i)=fa(i)-2^16;