寫在前面的話
學過MCU設計的朋友都知道,系統調試是多么的重要。而對於FPGA設計來說,仿真確實最重要的。
一個完整的項目,必須有完整的仿真平台。
有朋友說,按鍵仿真模型沒法搞。 我只能說,你並不了解硬件及處理按鍵的工作原理,如果你知道。按鍵仿真模型很容就可以做
開始學習VERIlOG HDL的朋友是不是很乏味,因為不知道課文中的代碼是否正常工作,實際工作會是怎么樣子的。
今天給大家講解的是一個Modelsim仿真的DEMO
這里開始吧
設計中包含3個文件:
1.工程設計文件(可綜合執行成硬件電路文件):demo_test.v
2.仿真平台文件(不可綜合執行成硬件電路文件):testbench_demo_test.sv  (這里的文件后綴可以是.v)
3.Modelsim執行腳本文件:run.do
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.do
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

 
       圖為按鍵按下的信號示意圖,當然毛刺產生不只是那幾個尖峰。
       通過老前輩大量的程序證明,毛刺產生段,不會某個值不會保持20ms。(這里不糾結了)
       該信號經過FPGA引腳進入FPGA內部,如下圖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中的采樣值。 輸入到工程系統作為激勵即可。
