Modelsim的demo入門教程

寫在前面的話
學過MCU設計的朋友都知道,系統調試是多麼的重要。而對於FPGA設計來講,仿真確實最重要的。
一個完整的項目,必須有完整的仿真平臺。
有朋友說,按鍵仿真模型無法搞。 我只能說,你並不瞭解硬件及處理按鍵的工做原理,若是你知道。按鍵仿真模型很容就能夠作

開始學習VERIlOG HDL的朋友是否是很乏味,由於不知道課文中的代碼是否正常工做,實際工做會是怎麼樣子的。
今天給你們講解的是一個Modelsim仿真的DEMO

這裏開始吧
設計中包含3個文件:
1.工程設計文件(可綜合執行成硬件電路文件):demo_test.v
2.仿真平臺文件(不可綜合執行成硬件電路文件):testbench_demo_test.sv  (這裏的文件後綴能夠是.v)
3.Modelsim執行腳本文件:run.dohtml

demo_test.v工具

 1 /********************************/
 2 //     Filename    :    demo_test.v
 3 //     Editor        :    Camp
 4 //     Version    :    0.01
 5 //     Date        :    2012.11.26
 6 /********************************/
 7 `timescale 1ns/1ps
 8 `define UD #1
 9 module demo_test(
10     input    clk,        // 默認是wire型
11     input    reset,
12     
13     input    [3:0]    ain,bin,
14     
15     output    reg [3:0]    cout,    // 定義爲reg型
16     
17     output    [15:0]    tout
18 );
19 
20 wire [3:0]    a_xor_b;
21 
22 assign a_xor_b = ain & bin;
23 
24 always @(posedge clk)
25     if(reset==1)
26         cout <= `UD 4'b0000;
27     else
28         cout <= `UD a_xor_b;
29 
30 assign tout = 0;
31 endmodule

testbench_demo_test.sv學習

 1 /********************************/
 2 //        Filename    :    testbench_demo_test.v
 3 //     Editor        :    Camp
 4 //     Version    :    0.01
 5 //        Date        :    2012.11.26
 6 /********************************/
 7 `timescale 1ns/1ps
 8 module testbench_demo_test;
 9 reg clk,reset;
10 reg [3:0] ain,bin;
11 wire [3:0] cout;
12 initial begin
13     clk = 0;
14     forever #10 clk = ~clk;
15 end
16 task init_task;    //復位初始化任務
17 begin
18     reset = 0;    
19     ain = 4'h0;bin = 4'h1;
20     repeat(2) @(posedge clk);    // 延遲2個時鐘週期
21     #1 reset = 1;
22     repeat(1) @(posedge clk);
23     #1 reset = 0;
24     repeat(1) @(posedge clk);
25 end
26 endtask
27 initial begin        // 主控流程
28     init_task; // 復位初始化調用
29     //以上覆位完成,如下添加你的代碼
30     
31     //添加代碼結束    
32     $stop;    //中止仿真
33 end
34 demo_test u_test(
35     .clk(clk),
36     .reset(reset),
37     .ain(ain),
38     .bin(bin),
39     .cout(cout),
40     .tout(tout));
41 endmodule 

run.dospa

 1 #######################################
 2 ##        Filename    :    run.do
 3 ##        Editor        :    Camp
 4 ##        Version    :    0.01
 5 ##        Date        :    2012.11.26
 6 #######################################
 7 vlib work
 8 vmap work work
 9 
10 vlog -reportprogress 300 -work work ./*.v
11 vlog -reportprogress 300 -work work ./*.sv
12 
13 vsim -novopt work.testbench_demo_test 
14 
15 add wave sim:/testbench_demo_test/*
16 add wave sim:/testbench_demo_test/u_test/*
17 
18 run -all

 

啓動仿真平臺
     A. 把三個文件放置到同一個目錄下,該目錄的路徑必須是純英文或有短下劃線(關於這點本身注意),
     B. 啓動Modelsim;
     C. 制定Modelsim的直接目錄, File -> Change Directory. 指定到A指向的目錄。
     D.在Transcript框中輸入:do run.do    <回車>
     E.等待波形結果.

     在熟悉"啓動仿真平臺"後,
     F.開始分析代碼, 這個本身把握 。 接下來G1或者G2
     G1.分析腳本文件run.do.   查看"啓動仿真平臺"A指向目錄產生的文件或文件夾,簡單瞭解腳本實現方式.
     G2.在代碼相應位置輸入課文中的一些例子。再次啓動仿真平臺
     H.進入高級設計階段。


常見問題
  一個必需要提醒的問題:
       常常聽到有人問這麼一個問題,並且有時還碰到一些工做一年的朋友也問: 爲何個人信號一直是高阻狀態?
         對於仿真而言,全部信號如何沒有賦值,軟件認爲該信號就爲高阻狀態,好比如下代碼
           initial beign
                    forever #10 clk = ~clk;
           end
         設計者意圖很明顯: 生成一個週期爲20個刻度的時鐘。
         但仿真結果讓人沒法接受. 高阻出現了。
         爲何?
         固然是由於clk沒有初始值。 高阻取反獲得什麼,沒人知道,軟件固然沒有那麼厲害。 固然就輸出高阻了。
         以上的例子能夠表明不少仿真中出現的問題,包括設計文件。

  對於IPcore如何仿真
        不少剛剛學習仿真的朋友,不知道如何仿真IPcore,因此無奈只能在Quartus II中(或者ISE中)調用Modelsim的方法,其實這個都不是問題。
        固然第一步要生成IPcore的Verilog文件,第二步把該文件加入到仿真中,且添加相應的庫文件,通常運行Modelsim仿真時若是缺乏某個庫文件,仿真錯         誤中就會提示。只要到QuartusII(或者ISE)安裝目錄中尋找相關的庫文件,複製到用戶經常使用的庫文件夾中,且編譯到仿真平臺中便可, 每次碰到的缺           少的庫文件,複製該用戶庫文件夾中,下次使用直接編譯,累加起來的一些庫文件也就熟悉了.   長此以往,直接擺脫綜合工具的束縛。

  仿真中ROM初始化文件沒起做用
         這個問題是一個目錄問題,只要把初始化文件複製到仿真直接目錄下便可("啓動仿真平臺"A指向目錄)


  待續....

對初學者的建議
      若是QUARTUSII(或者ISE)中綜合有錯誤提示,給網友提問請把第一個錯誤列出來.一個一個搞定 (由於不少時候第一個錯誤就會引起後面的錯誤)

  待續....設計

 


另外補充知識:按鍵輸入
       對於按鍵輸入的解剖,對於全部FPGA輸入均可以做爲一個參考
       按鍵的信號輸入圖4
調試

         圖4code


       圖爲按鍵按下的信號示意圖,固然毛刺產生不僅是那幾個尖峯。
       經過老前輩大量的程序證實,毛刺產生段,不會某個值不會保持20ms。(這裏不糾結了)
       該信號通過FPGA引腳進入FPGA內部,以下圖5,輸入的觸發器的時鐘爲採樣時鐘。
htm

                          圖5


        從輸入按鍵信號到最後的採樣值,
        其中採樣值中的x表明的是未知,固然只有0或者1兩種可能。爲何呢? 由於在採樣時,因爲是毛刺,觸發器的創建時間或者保持時間沒有知足。固然也就沒法判斷觸發器的輸出端(Q端)是什麼值,但,結果不是1就是0.  由於數字電路中沒有其它出現。 
       前部分已經說明(毛刺產生段,不會某個值不會保持20ms),因此設計時,只要保證個人採樣值保持一個狀態(1或者0),超過期間T。就認爲輸入是該狀態。關於T,多是20ms,也多是20.01ms,或者19.5ms,不用太精確。看用的邏輯多少,找個合適的設計。好比計數2^20次方 * 20ns (其中採樣頻率爲50MHz) = 20.97..  ms  也能夠知足要求。問題不大。


        推算出仿真平臺。 對於仿真模型。 仿真模型輸出不可能如同按鍵同樣是模擬電路,輸出確定是如同圖5中的採樣值。 輸入到工程系統做爲激勵便可。
blog

相關文章
相關標籤/搜索