寫在前面的話
學過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調試
圖爲按鍵按下的信號示意圖,固然毛刺產生不僅是那幾個尖峯。
經過老前輩大量的程序證實,毛刺產生段,不會某個值不會保持20ms。(這裏不糾結了)
該信號通過FPGA引腳進入FPGA內部,以下圖5,輸入的觸發器的時鐘爲採樣時鐘。htm
從輸入按鍵信號到最後的採樣值,
其中採樣值中的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