天天看点

ModelSim自动化仿真

    Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。(摘自百度百科)

 ModelSim的自动化仿真可以大大节省工作时间,利用脚本语言编写好仿真代码,就可以实现一劳永逸。以DDS(Direct Digital Synthesizer,直接数字式频率合成器)的仿真为例,使用工具为ModelSim SE-64 10.0c,仿真过程简要如下:

 首先新建一个verilog文件(新建一个文本文件,把后缀改成.v就是verilog文件),用代码编辑器打开,编写dds的verilog代码,dds的原理暂不做介绍。dds输出波形的频率:

ModelSim自动化仿真

其中M是频率控制字,fclk是系统时钟的频率,n是相位累加器的位宽。假设f0取10KHz,fclk取50MHz,n取32位,可求得频率控制字M=858993。

 dds的verilog代码如下:

module ex_dds(
    input   wire            sclk,       //50MHz系统时钟
    input   wire            rst_n,      //低电平复位信号
    output  wire    [7:0]   dds_wave    //DDS波形数据
);
parameter       FRQ_WORD = 32'd8858993;
reg     [31:0]  phase;
wire    [7:0]   addr;
always @ (posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        phase <= 32'd0;
    else
        phase <= phase + FRQ_WORD;
end
assign addr = phase[31:24];
//ROM例化
rom_8x256_sp    rom_8x256_sp_inst(
    .address    (addr),
    .clock      (sclk),
    .q          (dds_wave)
);
endmodule
           

 代码里面调用了一个ROM,这个ROM在Quartus II里面生成。新建工程之后,打开IP核管理工具Tools→MegaWizard Plug-In Manager。新建一个单口的ROM,宽度8bits,深度256。ROM需要加载初始化文件,mif文件或者hex文件。

ModelSim自动化仿真
ModelSim自动化仿真
ModelSim自动化仿真

 mif文件是比较常用的,主要有2种方式产生:MATLAB和Mif_Maker。MATLAB代码如下,参考了尤老师的视频资料。

clc;
clear all;
N=2^8;
s_p=0:255;%正弦波一个周期采样点
sin_data=sin(2*pi*s_p/N);
% plot(sin_data,'r*');
% hold on;
% plot(sin_data);
%定点化
fix_p_sin_data=fix(sin_data*127);
% plot(fix_p_sin_data,'r*');
for i=1:N
    if fix_p_sin_data(i)<0
       fix_p_sin_data(i)=N+fix_p_sin_data(i);
    else
        fix_p_sin_data(i)=fix_p_sin_data(i);
    end
end
%plot(fix_p_sin_data,'r*');
fid=fopen('ram_8x256_sp.mif','w+');
fprintf(fid,'WIDTH=8;\n');
fprintf(fid,'DEPTH=256;\n\n');
fprintf(fid,'ADDRESS_RADIX=UNS;\n');
fprintf(fid,'DATA_RADIX=UNS;\n\n');
fprintf(fid,'CONTENT BEGIN\n');
for i=1:N
    fprintf(fid,'  %d  : %d  ;\n',i-1,fix_p_sin_data(i));
end
fprintf(fid,'\nEND;\n');
fclose(fid);
           

其次,编写testbench测试文件(tb_ex_dds.v)和脚本仿真文件(run.do)

具体解释一下脚本仿真文件的内容:

quit –sim表示退出当前仿真功能,进行下一次仿真。

.main  clear表示清除命令行显示信息

vlib   work表示映射仿真库

vlog表示编译文件,要编译测试文件,系统库文件,设计文件,IP核文件。    编译vhdl文件是用vcom

vsim -voptargs=+acc  work.tb_ex_dds表示进行仿真

add  wave tb_ex_dds/ex_dds_inst/* 表示添加设计文件下的所有信号波形

run  500us表示仿真运行500us

testbench测试文件代码如下:

`timescale  1ns/1ns
module  tb_ex_dds();

reg     	sclk,rst_n;
wire    [7:0]   dds_wave;

initial begin
    sclk = 0;
    rst_n = 0;
    #100
    rst_n = 1;
end

always #10 sclk <= ~sclk;

ex_dds ex_dds_inst(
    .sclk       (sclk),       //50MHz系统时钟
    .rst_n      (rst_n),      //低电平复位信号
    .dds_wave   (dds_wave)    //DDS波形数据
);
endmodule
           

脚本仿真文件代码如下:

quit    -sim
.main   clear

vlib    work
vlog    ./tb_ex_dds.v
vlog    ./altera_lib/altera_mf.v
vlog    ./../design/ex_dds.v
vlog    ./../quartus_prj/ipcore_dir/rom_8x256_sp.v

vsim    -voptargs=+acc  work.tb_ex_dds

add     wave    tb_ex_dds/ex_dds_inst/*

run     500us
           

 最后打开ModelSim,新建工程, 注意要把系统库文件altera_mf.v和mif文件添加到仿真文件夹里面,不然仿真的时候系统找不到文件。在命令行输入do run.do表示运行脚本仿真文件。系统就会自动仿真,无需添加任何的文件到工程里面,因为脚本里面都关联好了。仿真好了之后就会弹出波形窗口,在dds的波形信号dds_wave单击右键,Format→Analog(automatic)即可看到模拟波形,是一个正弦波,正弦波的周期大致是100000000ps,也就是10KHz,符合设计要求。

ModelSim自动化仿真
ModelSim自动化仿真

 Simulation is OK.