ModelSim自动化仿真

xiaoxiao2021-02-28  112

    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输出波形的频率:

其中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文件。

 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,符合设计要求。

 Simulation is OK.

转载请注明原文地址: https://www.6miu.com/read-23821.html

最新回复(0)