Vivado軟件的基本操作(以控制LED燈閃爍為例)
其實(shí)之前早已用過(guò)Vivado進(jìn)行FPGA的開(kāi)發(fā)學(xué)習(xí),但由于每次都是淺嘗輒止地學(xué)了一些時(shí)間,加上Vivado軟件和FPGA開(kāi)發(fā)流程的復(fù)雜性,長(zhǎng)時(shí)間不用就會(huì)遺忘。因此今天還是簡(jiǎn)單地寫個(gè)筆記記錄一下Vivado軟件的一些基本操作,實(shí)現(xiàn)一個(gè)“hello world工程”:控制LED燈的閃爍。
實(shí)驗(yàn)基于的版本是Vivado17.4,F(xiàn)PGA芯片是Xilinx的XC7Z100-2FFG900。
創(chuàng)建Vivado工程
(1)雙擊Vivado快捷方式啟動(dòng)Vivado。
(2)點(diǎn)擊Create Project創(chuàng)建一個(gè)新工程。
(3)在彈出的建立新工程的向?qū)е悬c(diǎn)擊Next。
(4)在彈出的對(duì)話框中輸入工程名和工程存放的目錄,之后點(diǎn)擊Next。
需要注意工程路徑“Project location”不能有中文空格,路徑名稱也不能太長(zhǎng)。由于默認(rèn)勾選了“Create project subdirectory”選項(xiàng),Vivado會(huì)在所選工程目錄下自動(dòng)創(chuàng)建一個(gè)與工程名同名的文件夾,用于存放工程內(nèi)的各鐘文件。 Vivado會(huì)自動(dòng)管理工程文件夾內(nèi)的各種工程文件,并創(chuàng)建相應(yīng)的子目錄。
(5)在工程類型中選擇RTL Project,之后點(diǎn)擊Next。
- “RTL Project”是指按照正常設(shè)計(jì)流程所選擇的類型,這也是常用的一種類型,“ RTL Project”下的 Do not specify sources at this time”用于設(shè)置是否在創(chuàng)建工程向?qū)У倪^(guò)程中添加設(shè)計(jì)文件,如果勾選后,則不創(chuàng)建或者添加設(shè)計(jì)文件;
- “Post synthesis Project”在導(dǎo)入第三方工具所產(chǎn)生的綜合后網(wǎng)表時(shí)才選擇;
- “I/O Planning Project”一般用于在開(kāi)始RTL設(shè)計(jì)之前,創(chuàng)建一個(gè)用于早期IO規(guī)劃和器件開(kāi)發(fā)的空工程;
- “Imported Project” 用于從 ISE、 XST或 Synopsys Synplify導(dǎo)入現(xiàn)有的工程源文件;
- “Example Project”是指創(chuàng)建一個(gè) Vivado提供的工程模板 。
(6)這里添加源文件界面直接點(diǎn)擊Next,選擇在創(chuàng)建完工程之后再創(chuàng)建和添加源文件。以及Target language選擇Verilog(默認(rèn)),但也可以使用VHDL,支持多語(yǔ)言混合編程。
(7)添加約束文件界面直接點(diǎn)擊Next,即在創(chuàng)建完工程之后創(chuàng)建添加約束文件。
(8)接下來(lái)選擇器件型號(hào),這里根據(jù)大家自己的具體芯片型號(hào)去相應(yīng)選擇即可。選擇完成后點(diǎn)擊Next。
具體的ZYNQ命名規(guī)則如下圖所示:
(9)進(jìn)入工程概覽界面,這個(gè)頁(yè)面將之前幾個(gè)步驟中的設(shè)置全部列了出來(lái),供用戶檢查。確認(rèn)無(wú)誤后點(diǎn)擊Finish完成工程的創(chuàng)建。
Vivado主界面介紹
(1)Flow Navigator:提供對(duì)命令和工具的訪問(wèn),包含從輸入到生成比特流的整個(gè)過(guò)程。
(2)數(shù)據(jù)窗口區(qū)域:默認(rèn)情況下,這個(gè)區(qū)域顯示與設(shè)計(jì)源文件和數(shù)據(jù)相關(guān)的信息,如:
- Sources窗口:顯示層次結(jié)構(gòu)(Hierarchy)、IP源文件(IP Sources)、庫(kù)(Libraries)和編譯順序(Compile Order)的視圖。
- Netlist窗口:提供分析后的(elaborated)或綜合后的(synthesisized)邏輯設(shè)計(jì)的分層視圖。
(3)Properties窗口:顯示有關(guān)所選邏輯對(duì)象或器件資源的信息。
(4)工作空間(Workspace):工作區(qū)顯示了具有圖形界面的窗口和需要更多屏幕空間的窗口,包括:
- 用于顯示和編輯基于文本的文件和報(bào)告的Text Editor。
- 原理圖(Schematic)窗口。
- 器件(Device)窗口。
- 封裝(Package)窗口。
(5)結(jié)果區(qū)域窗口:在Vivado中所運(yùn)行命令的狀態(tài)和結(jié)果,顯示在結(jié)果窗口區(qū)域內(nèi),這是一組子窗口的集合。子窗口的集合。在運(yùn)行命令、生成消息、創(chuàng)建日志文件和報(bào)表文件時(shí),相關(guān)信息將顯示在此區(qū)域。默認(rèn)情
況下,此區(qū)域包括以下窗口:
- Tcl Console:允許輸入Tcl命令,并查看以前的命令和輸出的歷史記錄。
- Messages:顯示當(dāng)前設(shè)計(jì)的所有信息,包括”Error”、” Critical Warning”、“Warning”等。
- Log:顯示由綜合、實(shí)現(xiàn)和仿真運(yùn)行創(chuàng)建的日志文件。
- Reports:提供對(duì)整個(gè)設(shè)計(jì)流程中的活動(dòng)運(yùn)行所生成的報(bào)告的快速訪問(wèn)。
- Design Runs:管理當(dāng)前工程的運(yùn)行。
(6)主工具欄:提供了對(duì)Vivado中最常用命令的單擊訪問(wèn)。
(7)主菜單:提供對(duì)Vivado命令的訪問(wèn)。常用的命令會(huì)一直顯示(例如, File > Project > Open),而其他命令只在設(shè)計(jì)活動(dòng)時(shí)顯示 (例如,Reports > ReportDRC)。
(8)窗口布局(Layout)選擇器:提供預(yù)定義的窗口布局,以方便設(shè)計(jì)過(guò)程中的各種任務(wù)。布局選擇器能夠輕松地更改窗口布局,也可以使用菜單欄中的 “Layout”菜單來(lái)更改窗口布局。
創(chuàng)建Verilog輸入文件
(1)點(diǎn)擊左側(cè)的Add Sources或者右側(cè)的“+“號(hào)。
(2)選擇Add or create design sources,之后點(diǎn)擊Next。
(3)選擇Create file。
(4)自己輸入文件名,點(diǎn)擊“OK”。
(5)點(diǎn)擊Finish,會(huì)出現(xiàn)如下窗口。
此窗口用于設(shè)置源文件的模塊名稱和端口列表,Vivado會(huì)根據(jù)在此窗口中的設(shè)置,自動(dòng)地在HDL源文
件中寫入相應(yīng)的verilog語(yǔ)句。我們手動(dòng)輸入代碼,所以這里不作任何設(shè)置,直接點(diǎn)擊 OK即可。
(6)在彈出的對(duì)話框中選擇“Yes”。
(7)此時(shí)“Sources”窗口中就出現(xiàn)了我們剛剛創(chuàng)建的源文件,如下圖所示。
(8)這時(shí)可直接雙擊打開(kāi)這個(gè).v文件進(jìn)行Verilog代碼的編寫。由于Vivado自帶的編輯器不是很好用,所以我這里配置了將vscode代替默認(rèn)的編輯器(網(wǎng)上有詳細(xì)教程,可以自己查一下,包括也可以替換成vim、notepad++等)。
這里定義了一個(gè) 32 位的寄存器timer, 用于循環(huán)計(jì)數(shù) 0~199999999(1 秒鐘), 計(jì)數(shù)到 199999999(1秒)的時(shí)候, 寄存器 timer 變?yōu)?,并翻轉(zhuǎn)四個(gè)LED。這樣原來(lái)LED是滅的話,就會(huì)點(diǎn)亮,如果原來(lái)LED為亮的話,就會(huì)熄滅。由于輸入時(shí)鐘為 200MHz 的差分時(shí)鐘,因此需要添加IBUFDS原語(yǔ)連接差分信號(hào)。
編寫好代碼后切記保存。
`timescale 1ns / 1ps
module led_twinkle(
// 差分時(shí)鐘輸入
input sys_clk_p,
input sys_clk_n,
input rst_n,
output reg [3:0] led
);
reg [31:0] timer_cnt;
wire sys_clk;
IBUFDS # (
.DIFF_TERM("FALSE"),
.IBUF_LOW_PWR("TRUE"),
.IOSTANDAND("DEFAULT")
) IBUFDS_inst (
.O(sys_clk),
.I(sys_clk_p),
.IB(sys_clk_n)
);
always @ (posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin
led <= 4'd0;
timer_cnt <= 32'd0;
end
else if (timer_cnt >= 32'd199_999_999) begin
led <= ~led;
timer_cnt <= 32'd0;
end
else begin
led <= led;
timer_cnt <= timer_cnt + 32'd1;
end
end
endmodule
功能仿真
在設(shè)計(jì)輸入之后,設(shè)計(jì)綜合前進(jìn)行RTL級(jí)仿真,稱為綜合前仿真,也稱為前仿真或功能仿真。前仿真也就是純粹的功能仿真,主旨在于驗(yàn)證電路的功能是否符合設(shè)計(jì)要求,其特點(diǎn)是不考慮電路門延遲與線延遲。功能仿真需要的文件:
- 設(shè)計(jì)HDL源代碼。
- 測(cè)試激勵(lì)代碼(TestBench):根據(jù)設(shè)計(jì)要求輸入/輸出的激勵(lì)程序,由于不需要進(jìn)行綜合,書寫具有很大的靈活性。
- 仿真模型/庫(kù):根據(jù)設(shè)計(jì)內(nèi)調(diào)用的器件供應(yīng)商提供的模塊而定,如:FIFO、ADD_SUB等。在使用Vivado Simulator時(shí),仿真器所需的仿真模型/庫(kù)是預(yù)編譯好并集成在 Vivado中的,因此不需要進(jìn)行額外的預(yù)編譯操作,直接加載HDL設(shè)計(jì)和TestBench即可執(zhí)行仿真。
(1)首先創(chuàng)建一個(gè)TestBench,點(diǎn)擊左側(cè)的Add Sources或者右側(cè)的“+“號(hào)。
(2)在彈出的窗口中選擇“ Add or Create Simulation Sources”,之后點(diǎn)擊Next,如下圖所示。
(3)在接下來(lái)的頁(yè)面中點(diǎn)擊Create File。
(4)在彈出的窗口中輸入TestBench的文件名,TestBench源文件名稱的后綴“tb”可以用來(lái)向用戶示意該源文件是一個(gè) TestBench源文件,僅用于仿真,并不能用于設(shè)計(jì)的綜合和實(shí)現(xiàn)。
(5)點(diǎn)擊OK后點(diǎn)擊Finish。
(6)在彈出的自定義模塊窗口中直接點(diǎn)擊OK即可結(jié)束TestBench源文件的創(chuàng)建。
(7)編寫.v文件代碼。
代碼第一行的timescale是Verilog語(yǔ)法中的不可綜合語(yǔ)法,用于定義仿真的時(shí)間表示仿真的單位時(shí)間為1ns,精度為1ps,這是Xilinx官方推薦的仿真單位時(shí)間和精度。
`timescale 1ns / 1ps
module led_twinkle_tb;
reg sys_clk_p;
wire sys_clk_n;
reg rst_n;
wire [3:0] led;
led_twinkle u_led_twinkle (
.sys_clk_p(sys_clk_p),
.sys_clk_n(sys_clk_n),
.rst_n(rst_n),
.led(led)
);
initial begin
sys_clk_p = 0;
rst_n = 0;
#1000;
rst_n = 1;
end
always #2.5 sys_clk_p = ~sys_clk_p;
assign sys_clk_n = ~sys_clk_p;
endmodule
(8)在“Flow Navigator“窗口中點(diǎn)擊“Run Simulation”并選擇 “Run Behavioral Simulation”。
(9)之后就進(jìn)入了仿真界面。
①Scope窗口:Scope(范圍)是HDL設(shè)計(jì)的層次劃分。在Scope窗口中,可以看到設(shè)計(jì)層次結(jié)構(gòu)。當(dāng)選擇了一個(gè)Scope層次結(jié)構(gòu)中的作用域時(shí),該作用域內(nèi)的所有 HDL對(duì)象,包括reg、wire等都會(huì)出現(xiàn)在“Objects”窗口中??梢栽?“Objects”窗口中選擇HDL對(duì)象,并將它們添加到波形查看器中。
②Object窗口:“Objects”窗口會(huì)顯示在Scopes”窗口中選擇的范圍內(nèi)的所有HDL仿真對(duì)象。例如,在Scope窗口中選擇頂層模塊“l(fā)ed_twinkle”,在“Objects”窗口中就會(huì)自動(dòng)顯示出led_twinkle模塊中所有的對(duì)象。如下圖所示:
③波形窗口:用于顯示所要觀察信號(hào)的波形。若要向波形窗口添加單個(gè)HDL對(duì)象或多個(gè)HDL對(duì)象,可以在“Objects”窗口中,右鍵單擊一個(gè)或多個(gè)對(duì)象,然后從下拉菜單中選擇“Add to Wave Window”選項(xiàng)。例如,可以把 “l(fā)ed_twinkle”模塊 下的“timer_ cnt”計(jì)數(shù)器添加到波形窗口中。
④仿真工具欄:仿真工具欄包含運(yùn)行各個(gè)仿真動(dòng)作的命令按鈕。從左至右依次是:
-
Restart:將仿真時(shí)間重置為零,此時(shí)波形窗口中原有的波形都會(huì)被清除。下次執(zhí)行仿真時(shí),會(huì)從0時(shí)刻重新開(kāi)始。
-
Run all:運(yùn)行仿真,直到其完成所有事件或遇到 HDL語(yǔ)句中的 s t o p 或 stop或 stop或finish命令為止。注意,如果沒(méi)有在 TestBench語(yǔ)句中加入 s t o p 或 stop或 stop或finish命令,當(dāng)點(diǎn)擊Run all命令時(shí),仿真器會(huì)無(wú)休止地一直仿真下去,除非用戶點(diǎn)擊仿真工具欄中的“ Break”按鈕來(lái)手動(dòng)地結(jié)束仿真。但是這里有個(gè)地方需要注意,如果此時(shí)需要仿真的設(shè)計(jì)比較復(fù)雜,則仿真器在運(yùn)行仿真時(shí)會(huì)耗費(fèi)電腦大量的CPU和內(nèi)存資源,此時(shí)有可能會(huì)造成電腦卡頓甚至死機(jī)的情況。所以,如果設(shè)計(jì)比較復(fù)雜,且沒(méi)有在 TestBench語(yǔ)句中加入 s t o p 或 stop或 stop或finish命令,最好不要輕易點(diǎn)擊 Run all命令。
-
Run For:運(yùn)行特定的一段時(shí)間。緊隨在后面的兩個(gè)文本框用于設(shè)定仿真時(shí)長(zhǎng)的數(shù)值大小和時(shí)間單位。
-
Step:按步運(yùn)行仿真,每一步仿真一個(gè)HDL語(yǔ)句。
-
Break:暫停當(dāng)前仿真。
-
Relaunch :重新編譯仿真源并重新啟動(dòng)仿真。
-
源代碼進(jìn)行修改。在修改完 HDL源代碼后,如果需要修改HDL代碼,可以點(diǎn)擊Relaunch按鈕來(lái)重新加載UUT設(shè)計(jì)和 TestBench,以重新對(duì)修改后的HDL源代碼進(jìn)行仿真。此時(shí)就不需要再關(guān)閉并重新打開(kāi)仿真器了。
在剛打開(kāi)仿真器時(shí),仿真器會(huì)首先將TestBench中的信號(hào)加入到波形窗口中 ,并執(zhí)行一段時(shí)長(zhǎng)的仿真。仿真的時(shí)長(zhǎng)由Settings設(shè)置窗口中的參數(shù)值指定,如下圖所示:
可以看到,仿真器啟動(dòng)后默認(rèn)立即執(zhí)行的仿真時(shí)長(zhǎng)是1000ns。由于我們是在默認(rèn)立即執(zhí)行仿真結(jié)束之后,才加入了“timer_cnt”計(jì)數(shù)器信號(hào),所以新加入的”timer_cnt“信號(hào)并沒(méi)有波形。此時(shí)我們需要將仿真時(shí)刻重置為0,重新開(kāi)始仿真。點(diǎn)擊Restart按鈕,波形窗口中的當(dāng)前仿真時(shí)刻點(diǎn)(黃色標(biāo)尺)就會(huì)回歸到0ns,且原先的所有波形都被清除,如下圖所示:
點(diǎn)擊仿真工具欄中的Run For按鈕,默認(rèn)仿真時(shí)長(zhǎng)是10us,此時(shí)就可以看到波形窗口中就出現(xiàn)了波形。
分析與綜合
(1)點(diǎn)擊“Flow Navigator”窗口中的“Open Elaborated Design”按鈕。此時(shí),Vivado會(huì)編譯RTL源文件并進(jìn)行全面的語(yǔ)法檢查,并在Messages窗口中給出相應(yīng)的“Error”和“Warning”。
(2)打開(kāi)分析后 Elaborated的設(shè)計(jì)后Vivado會(huì)生成頂層原理圖視圖,并在默認(rèn)view layout中顯示設(shè)計(jì),如下圖所示:
(3)將打開(kāi)的分析后的設(shè)計(jì)關(guān)閉,再點(diǎn)擊“Flow Navigator”窗口中的“Run Synthesis”按鈕進(jìn)行綜合。
(4)在彈出的窗口中點(diǎn)擊"OK"。
(5)綜合完成后彈出如下窗口,直接關(guān)閉即可。
約束輸入
(1)首先需要?jiǎng)?chuàng)建一個(gè)用于存儲(chǔ)約束語(yǔ)句的約束文件。點(diǎn)擊“Sources”窗口中的 “+”號(hào),在彈出的窗口選擇“ Add or create constraints”,如下圖所示,點(diǎn)擊“Next”:
(2)點(diǎn)擊“Create File”。
(3)在彈出的對(duì)話框中輸入約束文件的名稱“l(fā)ed_twinkle”,然后點(diǎn)擊 OK。
(4)點(diǎn)擊“Finish”即可。
Vivado的約束文件是以“.xdc”為文件后綴的ASCII文本文件,其中存儲(chǔ)的是一條條的xdc約束命令。
點(diǎn)開(kāi)此文件,輸入如下內(nèi)容:
set_property PACKAGE_PIN AJ16 [get_ports {led[0]}]
set_property PACKAGE_PIN AK16 [get_ports {led[1]}]
set_property PACKAGE_PIN AE16 [get_ports {led[2]}]
set_property PACKAGE_PIN AE15 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property PACKAGE_PIN AF18 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN F9 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
create_clock -period 5.000 -name sys_clk_p -waveform {0.000 2.500} [get_ports sys_clk_p]
普通 IO 口只需約束引腳號(hào)和電壓,管腳約束如下:
set_property PACKAGE_PIN “引腳編號(hào)” [get_ports “端口名稱”]
電平信號(hào)的約束如下:
set_property IOSTANDARD “電平標(biāo)準(zhǔn)” [get_ports “端口名稱”]
這里需要注意文字的大小寫,端口名稱是數(shù)組的話用{ }括起來(lái),端口名稱必須和源代碼中的名字一致,且端口名字不能和關(guān)鍵字一樣。
電平標(biāo)準(zhǔn)中“LVCMOS33”后面的數(shù)字指FPGA的BANK 電壓,LED所在BANK電壓為3.3伏,所以電平標(biāo)準(zhǔn)為“LVCMOS33”。Vivado 默認(rèn)要求為所有 IO 分配正確的電平標(biāo)準(zhǔn)和管腳編號(hào)。
對(duì)于xdc文件,每一個(gè)約束命令單獨(dú)占用一行,命令的結(jié)尾沒(méi)有如verilog中的分號(hào)一樣的語(yǔ)句結(jié)束符號(hào)。每一條注釋也單獨(dú)占用一行。命令的第一個(gè)關(guān)鍵字代表該命令的名稱,其后的所有字段都是該命令的參數(shù)列表。
設(shè)計(jì)實(shí)現(xiàn)
(1)約束輸入完畢之后,就可以開(kāi)始實(shí)現(xiàn)設(shè)計(jì)了。點(diǎn)擊“Flow Navigator”窗口中的”Run Implementation”按鈕。
(2)在彈出的界面選擇OK。
可以看到實(shí)現(xiàn)正在進(jìn)行。
(3)直接關(guān)閉實(shí)現(xiàn)完成后的提示窗口。
再次查看“Design Runs”窗口中的實(shí)現(xiàn)結(jié)果,發(fā)現(xiàn)時(shí)序要求都已滿足,即沒(méi)有報(bào)紅,說(shuō)明設(shè)計(jì)成功地在FPGA中完成了實(shí)現(xiàn)。
下載比特流
(1)生成用于下載到器件中的比特流文件,點(diǎn)擊“Flow Navigator”窗口中的“Generate Bitstream”按鈕。
(2)在彈出的窗口中直接點(diǎn)擊OK。
此時(shí)可以看到“Design Runs”窗口中顯示正在生成比特流:
(3)生成完成后,直接關(guān)閉提示窗口。
(4)開(kāi)始下載比特流,點(diǎn)擊“Flow Navigator”窗口中的“Open Hardware Manager”按鈕。
(5)將開(kāi)發(fā)板上電并接好JTAG接口,點(diǎn)擊Open target中的Auto Connect(或Hardware中的此按鈕)。
出現(xiàn)如下界面就表示 Vivado就已經(jīng)和下載器連接成功了:
(6)右擊xc7z100_1,在彈出的菜單中點(diǎn)擊Program Device。
(7)在彈出的對(duì)話框中直接點(diǎn)Program即可。
下載成功后,可以觀察到板子上的LED燈在不停地閃爍。
總結(jié)
至此使用Vivado開(kāi)發(fā)FPGA實(shí)現(xiàn)一個(gè)簡(jiǎn)單的LED閃爍的流程就走完了,可以看到還是比較復(fù)雜的。之后還有Vivado中在線邏輯分析儀的使用、固化文件的生成等,就另起文章記錄了。
參考
達(dá)芬奇之FPGA開(kāi)發(fā)指南 V1.2文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-765120.html
cource_s1_ALINX_ZYNQ(AX7Z100)開(kāi)發(fā)平臺(tái)FPGA教程V1.07文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-765120.html
到了這里,關(guān)于超詳細(xì)FPGA新手小白入門點(diǎn)亮LED燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!