天天看點

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.