ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述语言的仿真软件。该软件可以用来实现对设计的VHDL、Verilog HDL 或是两种语言混合的程序进行仿真。这里的仿真是对设计进行功能仿真(也称之为前仿真),其目的是验证电路功能是否符合设计要求。
编写仿真代码
本篇主要是对控制LTC2308芯片的模块adc_ltc2308.v 进行功能仿真。test_bench的核心是模拟ADC LTC2308采集的数据,并将采集的数据按照要求时序,按位赋给ADC_SDO。
1. 首先参考基于DE1-SOC的My_first_fpga新建一个adc_ltc2308工程(没有在原来的DE10_Standard_ADC工程里面直接进行仿真是因为adc_ltc2308.v 模块在该工程里面被封装成了一个avalon MM 协议IP了),adc_ltc2308.v作为top文件,在开始仿真之前,我们先要在工程路径下新建一个Verilog test bench仿真文件。
右击File——New, 选择Verilog HDL File,然后点击OK:

2. 将下面代码拷贝到新建的.v文件当中:
`timescale 1ns / 1ps module adc_ltc2308_tb; reg clk ;//最大40MHZ,此处设置20MHz reg rst_n ; reg [2:0] measure_ch ; wire ADC_SCK; wire ADC_SDI,measure_done,ADC_CONVST ; //fpga给adc芯片的输出信号 reg ADC_SDO,measure_start; //adc芯片给fpga的采样数据 wire [11:0] measure_dataread; parameter T = 25; //ADC采集的模拟信号 reg [11:0] adc_sam_data [0:99]; //初始化模块 initial begin
//使用matlab产生模拟的ADC采集的数据(保存到s_sample.txt)
//说明:模拟数据为正弦信号,信号频率为10000Hz,以16进制格式保存为txt文件。
$readmemh("C:/Users/Test/Desktop/adc_ltc2308/s_sample.txt",adc_sam_data); clk = 1'b0; rst_n = 1'b0; measure_ch = 3'd0; #(T*4); measure_ch = 3'd3; #(T*4); rst_n = 1'b1; end //时钟信号产生模块 always#(T/2) clk = ~clk; adc_ltc2308 u_adc_ltc2308( .clk(clk), // max 40mhz // start measure .measure_start(measure_start), // posedge triggle .measure_ch(measure_ch), .measure_done(measure_done), .measure_dataread(measure_dataread), // adc interface .ADC_CONVST(ADC_CONVST), .ADC_SCK(ADC_SCK), .ADC_SDI(ADC_SDI), .ADC_SDO(ADC_SDO) ); // tick reg [15:0] tick; always @ (posedge clk or negedge rst_n) begin if (!rst_n) tick <= 0; else if (tick < 396) begin tick <= tick + 1; measure_start=1'b0;end else begin tick <= 0; measure_start=1'b1; end end //数据地址 reg [6:0] addr_99; always@(posedge clk or negedge rst_n)begin if(!rst_n) addr_99 <= 7'd0; else if(tick == 396)begin if(addr_99 == 7'd99) addr_99 <= 0; else addr_99 <= addr_99 + 1'b1; end else addr_99 <= addr_99; end //状态赋值 reg [11:0] sam_data_r; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin ADC_SDO <= 1'b0; end else begin case(tick) 64:begin sam_data_r <= adc_sam_data[addr_99]; end 65:begin ADC_SDO <= sam_data_r[11]; end 66:begin ADC_SDO <= sam_data_r[10]; end 67:begin ADC_SDO <= sam_data_r[9]; end 68:begin ADC_SDO <= sam_data_r[8]; end 69:begin ADC_SDO <= sam_data_r[7]; end 70:begin ADC_SDO <= sam_data_r[6]; end 71:begin ADC_SDO <= sam_data_r[5]; end 72:begin ADC_SDO <= sam_data_r[4]; end 73:begin ADC_SDO <= sam_data_r[3]; end 74:begin ADC_SDO <= sam_data_r[2]; end 75:begin ADC_SDO <= sam_data_r[1]; end 76:begin ADC_SDO <= sam_data_r[0]; end default:begin ADC_SDO <= ADC_SDO; end endcase end end endmodule
3. 点击Save按钮,将文件保存为adc_ltc2308_tb.v。
设置仿真工具路径和文件
一般安装Quartus软件的时候,我们也同时安装了Modelsim 工具(也可以参考TerasicModelsim仿真讲解单独安装),现在,我们需要将Modelsim 的安装路径设置一下,然后就才可以自动调用我们指定的仿真工具。
首先是在Tools菜单下面找到Options:

在弹出的对话框中选择EDA Tool Options ,点击...指定软件路径: D:\intelFPGA_lite\17.1\modelsim_ase\win32aloem

接下来设置仿真文件路径。点击Assignments——Settings:

点击 Simulation,仿真工具选择ModelSim-Altera, 然后点选Compile test bench圆圈,点击Test Benches...

点击New...

然后填写Test bench name 名称为adc_ltc2308_tb, 接着点击File name处对应的...按钮:

选择adc_ltc2308_tb.v文件:

点击Open以后再点击Add将文件添进来,然后点击OK:

然后按照下面的顺序点击OK, Apply,和OK就退出了设置界面:

仿真与结果分析
点击Tool——Run Simulation——RTL Simulation:

点击Zoom Full按钮将显示全部波形。

按下Ctrl键用鼠标同时选中measure_read和sam_Data_r信号,右击选择菜单Format——Analog(automatic):

可以看到如下波形(看不到正弦波可以点击Zoom In 放大波形):

用matlab生成ADC 正弦波信号
使用matlab产生模拟的ADC采集的数据。
说明:模拟数据为正弦信号,信号频率为10000Hz,以16进制格式保存为txt文件。
打开网页https://matlab.mathworks.com/,注册一个matlab的账号就可以在线试用matlab了。

将如下代码输入进去:
% 参数设置 fs = 1000e3; % 采样频率 1000KHz f_signal = 10e3; % 信号频率 10KHz num_samples = 100; % 采样点数 amplitude = 2047; % 12位ADC满量程的一半 (0-4095) % 生成时间序列 t = (0:num_samples-1)/fs; % 时间向量(单位:秒) % 生成正弦波信号 analog_signal = sin(2*pi*f_signal*t); % 转换为ADC数字量 (12位无符号) % 将[-1,1]范围映射到[0,4095] digital_signal = round((analog_signal + 1) * amplitude); % 确保数值在合法范围内 (0-4095) digital_signal = max(min(digital_signal, 4095), 0); % 转换为3位十六进制字符串 (补前导零) hex_data = dec2hex(digital_signal, 3);
%画出正弦波形 plot(t(1:100), digital_signal (1:100)); % 写入文本文件 fid = fopen('s_sample.txt', 'w'); for i = 1:num_samples fprintf(fid, '%s\n', hex_data(i,:)); end fclose(fid); disp('文件已生成:s_sample.txt');
s_sample.txt文件内容如下:
7FF 880 900 97F 9FC A78 AF1 B67 BD9 C48 CB2 D18 D78 DD3 E28 E77 EBF F01 F3B F6E F9A FBE FDA FEE FFA FFE FFA FEE FDA FBE F9A F6E F3B F01 EBF E77 E28 DD3 D78 D18 CB2 C48 BD9 B67 AF1 A78 9FC 97F 900 880 7FF 77E 6FE 67F 602 586 50D 497 425 3B6 34C 2E6 286 22B 1D6 187 13F 0FD 0C3 090 064 040 024 010 004 000 004 010 024 040 064 090 0C3 0FD 13F 187 1D6 22B 286 2E6 34C 3B6 425 497 50D 586 602 67F 6FE 77E
得到波形如下:

往期推荐阅读:
浙公网安备 33010602011771号