我原先都是調(diào)試C語言程序,然后直接用硬件驗證的,沒有注意到仿真的重要性。在FPGA上面,仿真占了很大的一部分。在我們實際驗證之前,就采用仿真來排除可能出現(xiàn)的錯誤,能夠節(jié)省很多時間。仿真過程中也可以讓我們更加深入的思考所設(shè)計的系統(tǒng)。因此Modelsim就顯得很重要了。
最初都是使用quartus進(jìn)行直接調(diào)用的,對modelsim的整個操作流程還是不了解,后來直接用modelsim調(diào)用編寫的程序。
Modelsim也可以編譯verilog的程序的,我們可以建立一個空的工程進(jìn)行編譯的。我們這里使用的方法是在quartus里面進(jìn)行編譯。這兩種方法我都測試過,都是可以的。
下面現(xiàn)在列出具體的方法。
// 注意一點,最后我們仿真需要兩個文件,一個是我們的源文件.V文件,另外一個就是我們的testbench文件。我們最后仿真的時候,其實仿真的是testbench文件。
(1),使用quartus編寫源文件,此處以38譯碼器為例。
/*
decode38
*/
module decode_38(keyin,led,clk);
input clk;
input [2:0]keyin;
output [7:0]led;
reg [2:0]read_key;
reg [7:0]led;
always@(keyin)
begin
read_key=keyin;
case(read_key)
3'd0: led=8'b1111_1110;
3'd1: led=8'b1111_1101;
3'd2: led=8'b1111_1011;
3'd3: led=8'b1111_0111;
3'd4: led=8'b1110_1111;
3'd5: led=8'b1101_1111;
3'd6: led=8'b1011_1111;
3'd7: led=8'b0111_1111;
default:
led=8'b1111_1111;
endcase
end
endmodule
(2)編寫testbench文件
`timescale 1 ns/ 1 ps
module decode_38_vlg_tst();
reg clk;
reg [2:0] keyin;
// wires
wire [7:0] led;
reg [3:0]invect;
initial
begin
#10 clk=1'b0;
forever
#10 clk=~clk;
end
initial
begin
for(invect=0;invect<8;invect=invect+1)
begin
keyin=invect[3:0];
#10 $display($time," clk=%b,keyin=%b,led=%b",clk,keyin,led);
end
end
initial
begin
#120 $stop;
end
decode_38 i1 (
// port map - connection between master ports and signals/registers
.clk(clk),
.keyin(keyin),
.led(led)
);
endmodule
(3)啟動modelsim ,F(xiàn)ile->New->Project,建立工程
(4)保存新建的工程
(5)添加項目到建立的工程之中。此處選擇Add Existing File(因為要仿真的文件我們已經(jīng)編譯好了)
(6)選擇編譯好的文件。需要加載我們的.V文件,以及testbench文件,一次可以加載多個文件的。
(7)在“Project”選項卡中顯示剛才加載的文件,此時Status狀態(tài)欄顯示“?”,因為我們現(xiàn)在還沒有對其進(jìn)行編譯呢
(8)選擇菜單欄Complie進(jìn)行全編譯
(9)打開Library選項卡中的work庫,找到我們加載的兩個文件(.v .vt)。
(10)選中testbench文件,并右擊鼠標(biāo),準(zhǔn)備simulate
(11)右擊我們的testbench文件,選中Add->To Wave-> All items in region
(12)設(shè)置仿真時間,我們這里設(shè)置10ms
(13)在最下面的命令行窗口輸入”run”,或者選中Simulate->Run-All
(14)得到仿真結(jié)果