-
目的
本方法主要适用于在matlab和modelsim联合仿真时有用,比如matlab生成的adc数据作为modelsim 仿真时的adc激励数据,或者modelsim生成的ram数据也可以在仿真时加载进modelsim进行仿真,下面我们将以matlab生成adc原始数据导入modelsim来演示。
-
matlab代码
生成adc数据的代码:
clc;
clear all;
close all;
fs = 250e6; % adc采样率
fout = 10e6; % 生成信号频率
len = 8192; % 生成信号长度
t = 0:1/fs:(len-1)/fs; % 采样点的时间片
amp = 25000; % adc信号幅度
adc_dat = cos(2*pi*fout*t); % adc数据
adc_dat = awgn(adc_dat, 40);% 对生成信号加入噪声
adc_dat = round(adc_dat*amp);% 量化adc数据
% 画出信号的时域和频域图
subplot(211);
plot(adc_dat);
subplot(212);
fft_data = abs(fft(adc_dat, len));
fft_data = 20*log10(fft_data);
fft_data = fft_data - max(fft_data);
plot(fft_data);
% 存储ADC数据
u_adc_dat = sign2com(adc_dat, 16);
fp = fopen('adc_dat.bin', 'w');
fprintf(fp, '%04x\n',u_adc_dat);
fclose all;
adc数据的频域和时域图
- verilog代码
`timescale 1ns/1ps
module testbench();
localparam LEN = 8192 ;
reg [15:0] adc_dat[8191:0] ;
reg clk ;
reg rst ;
reg [12:0] cnt ;
reg [15:0] sim_dat ;
initial begin
$readmemh("./adc_dat.bin", adc_dat, 0, LEN-1);
end
initial begin
clk = 0;
rst = 1;
cnt = 0;
sim_dat = 0;
#1000;
rst = 0;
end
always #2.00 clk = ~clk ;
always@(posedge clk)
begin
if(rst) begin
cnt <= 0;
end
else begin
cnt <= cnt + 1;
sim_dat <= adc_dat[cnt];
end
end
endmodule
- 仿真效果
- 总结
此方法非常适用于matlab生成的数据作为激励源。代替掉模块内部需要产生数据源的模块。