我原先都是調(diào)試C語(yǔ)言程序,然后直接用硬件驗(yàn)證的,沒(méi)有注意到仿真的重要性。在FPGA上面,仿真占了很大的一部分。在我們實(shí)際驗(yàn)證之前,就采用仿真來(lái)排除可能出現(xiàn)的錯(cuò)誤,能夠節(jié)省很多時(shí)間。仿真過(guò)程中也可以讓我們更加深入的思考所設(shè)計(jì)的系統(tǒng)。因此Modelsim就顯得很重要了。
最初都是使用quartus進(jìn)行直接調(diào)用的,對(duì)modelsim的整個(gè)操作流程還是不了解,后來(lái)直接用modelsim調(diào)用編寫(xiě)的程序。
Modelsim也可以編譯verilog的程序的,我們可以建立一個(gè)空的工程進(jìn)行編譯的。我們這里使用的方法是在quartus里面進(jìn)行編譯。這兩種方法我都測(cè)試過(guò),都是可以的。
下面現(xiàn)在列出具體的方法。
// 注意一點(diǎn),最后我們仿真需要兩個(gè)文件,一個(gè)是我們的源文件.V文件,另外一個(gè)就是我們的testbench文件。我們最后仿真的時(shí)候,其實(shí)仿真的是testbench文件。
(1),使用quartus編寫(xiě)源文件,此處以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)編寫(xiě)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)啟動(dòng)modelsim ,F(xiàn)ile->New->Project,建立工程
(4)保存新建的工程
(5)添加項(xiàng)目到建立的工程之中。此處選擇Add Existing File(因?yàn)橐抡娴奈募覀円呀?jīng)編譯好了)
(6)選擇編譯好的文件。需要加載我們的.V文件,以及testbench文件,一次可以加載多個(gè)文件的。
(7)在“Project”選項(xiàng)卡中顯示剛才加載的文件,此時(shí)Status狀態(tài)欄顯示“?”,因?yàn)槲覀儸F(xiàn)在還沒(méi)有對(duì)其進(jìn)行編譯呢
(8)選擇菜單欄Complie進(jìn)行全編譯
(9)打開(kāi)Library選項(xiàng)卡中的work庫(kù),找到我們加載的兩個(gè)文件(.v .vt)。
(10)選中testbench文件,并右擊鼠標(biāo),準(zhǔn)備simulate
(11)右擊我們的testbench文件,選中Add->To Wave-> All items in region
(12)設(shè)置仿真時(shí)間,我們這里設(shè)置10ms
(13)在最下面的命令行窗口輸入”run”,或者選中Simulate->Run-All
(14)得到仿真結(jié)果