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.