一. 4位計數器的設計與模擬驗證(2)
1. FPGA設計模擬的相關概念
圖1 FPGA設計模擬流程圖
(1)前模擬
也被稱為之功能模擬,使用專門用於模擬的工具對設計進行功能模擬,從而驗證電路的功能是不是滿足我們的計劃。功能模擬可以讓設計人員及時的發現設計中的錯誤,從而馬上糾正過來,對於設計的可靠性有很大的幫助。
(2)綜合後的模擬
把綜合生成的標準延時反標註到綜合模擬模型中去,就可以估計門延時對設計的影響,但是這步模擬只能夠估算門延時,而無法知道佈線延時,所以綜合模擬後的結果與實際執行結果還是存在一定的差距。這一步模擬是對於IC設計使用的,不過目前的綜合工具做的比較完善了,開發使用的IDE就能夠完成這部分的工作,所以這部分模擬往往也被忽略了,本學習筆記裡就不會用到綜合後的模擬。
(3)佈局佈線後的模擬
佈局佈線後的模擬就是我們最常使用的時序模擬,因為佈局佈線之後模擬時延檔案基本齊全,無論是門延時,還是佈線延時都已經有了估算的結果,所以佈局佈線之後的時序模擬結果往往就能對應之後實際電路的工作結果。時序模擬是FPGA開發流程中的必須過程,任何一個合格的設計者都會通過時序模擬來確保自己的整個設計是穩定可靠的,如果發現了時序違規(Timing Vilotation)等時許錯誤,設計者就需要去對自己的邏輯電路進行改良。
(4)板級模擬
在一些高速設計中,由於設計電路的速度要求比較高,所以為了保證我們設計的穩定性和可靠性,設計者會選擇使用第三方的板級驗證工具進行板級模擬,本學習筆記中無論是設計的開發難度還是設計出的電路標準並沒有IC設計那麼高,所以板級模擬也是不適用的。
(5)線上模擬
在設計下載到板子上之後,我們的模擬並不是就結束了,一般來說我們還要通過監聽JTAG介面等來實時的瞭解FPGA在執行的時候各個訊號,從而分析實際執行的時候時序是不是正確的。
2. Modelsim工程的建立
(1)在Modelsim中選擇"選單欄的File -> New -> Project..."
(2)建立工程,輸入工程名為"Counter_Design_TB",選擇工程儲存目錄為我們FPGA設計的目錄,但是請注意我們對工程的模擬測試往往不止一個,所以在模擬工程目錄下也要養成單獨建立子目錄的習慣。
圖2 工程建立視窗
(3)複製我們需要模擬的Verilog設計檔案到我們的Modelsin目錄裡,此步是在彈出的窗口裡選擇"Add Exitsting File"
圖3 工程檔案選擇、建立視窗
3. Testbench 激勵檔案的編寫
Modelsim 對於Verilog檔案的編寫支援並不理想,在語法高亮、自動縮排上做的都不是太好,所以建議使用第三方編輯器來進行程式碼的編寫。
`timescale 1ns/1ns //設定模擬時間精度為1ns,如果不設定的話,預設為1ps
module Counter_Design_TB;
//時鐘生成模組
reg clk;
reg rst_n;
localparam PERIOD = 20; //20ns * 50M = 1s
initial
begin //對持續輸出的電平,每10ns進行一次反轉,就構成了20ns一個週期的方波訊號,這個訊號就是我們全域性主時鐘
clk = 0;
forever #(PERIOD / 2)
clk = ~clk;
end
//連續兩個時鐘週期的低電平訊號,我們將其認為是復位訊號
task task_reset;
begin
rst_n = 0;
repeat(2) @ (negedge clk);
rst_n = 1;
end
endtask
//例化目標模擬電路,也就是我們的Counter_Design模組的例項化
Counter_Design u_Counter_Design
(
//全域性時鐘例項化
.clk (clk),
.rst_n (rst_n),
//計數器輸出例項化
.cnt (cnt)
);
//激勵訊號的初始化
//不過本設計實際上不需要初始化任何訊號,只是為了testbench設計的完整性,所以在此補上一個空的激勵任務
task task_sysinit;
begin
end
endtask
//程序設計
initial
begin
task_sysinit;
task_reset;
end
endmodule
4. Modelsin波形的模擬與分析
圖4 Modelsin 模擬設計流程
(1)全編譯,也就是編譯我們剛才編寫的Counter_Design_TB 和 Counter_Design
圖5 編譯後的結果
(2)接著指定Testbench檔案,新增訊號,做好準備。
a. 選擇目標模擬測試檔案
b.進入模擬頁面
補充:
此時下方的提示視窗會有一個警告資訊:"** Warning: (vsim-3015) C:/Users/26386/Documents/FPGA_code/01_Counter_Design/simulation/modelsim/Counter_Design_TB/Counter_Design_TB.v(34): [PCDPC] - Port size (4 or 4) does not match connection size (1) for port 'cnt'. The port definition is at: C:/Users/26386/Documents/FPGA_code/01_Counter_Design/simulation/modelsim/Counter_Design_TB/Counter_Design.v(9)."
這是此版本的Modelsim一個設計缺陷,只有在進入模擬的時候才會對實際電路進行檢查,之前的編譯過程對於電路錯誤的發掘深度並不充分,而這個錯誤的意思是,在Counte_Design_TB 原始碼裡,提示cnt 的長度不夠,因為我們沒有對其進行定義,所以需要在原始碼例化模組之前補充如下定義程式碼段:
wire [3:0] cnt;
c.新增訊號
(3)接著採用指令碼進行模擬、復位、反覆除錯
a. 輸入命令 "run xx ns",就可以執行模擬檔案指定時間,結果如上
b.輸出波形的格式可以設定,上圖就是將cnt的輸出格式設定為hex(16進位制),和Analog(模擬波形)