【ZYNQ Ultrascale+ MPSOC FPGA教程】第四章 PL的LED實驗

原創聲明:

本原創教程由芯驛電子科技(上海)有限公司(ALINX)創做,版權歸本公司全部,如需轉載,需受權並註明出處。編程

適用於板卡型號:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG數組

實驗Vivado工程爲「led」。工具

對於ZYNQ來講PL(FPGA)開發是相當重要的,這也是ZYNQ比其餘ARM的有優點的地方,能夠定製化不少ARM端的外設,在定製ARM端的外設以前先讓咱們經過一個LED例程來熟悉PL(FPGA)的開發流程,熟悉Vivado軟件的基本操做,這個開發流程和不帶ARM的FPGA芯片徹底一致。佈局

在本例程中,咱們要作的是LED燈控制實驗,每秒鐘控制開發板上的LED燈翻轉一次,實現亮、滅、亮、滅的控制。會控制LED燈,其它外設也慢慢就會了。性能

1. LED硬件介紹

1.1 開發板的PL部分鏈接了4個紅色的用戶LED燈。這1個燈徹底由PL控制。若是PL_LED1爲高電平,燈則會滅,不然會亮。測試

1.2 咱們能夠根據原理圖的連線關係肯定LED和PL管腳的綁定關係。spa

1.3 原理圖中以PS_MIO開頭的IO都是PS端IO,不須要綁定,也不能用於PL端的引腳綁定設計

2. 建立Vivado工程

2.1 啓動Vivado,在Windows中能夠經過雙擊Vivado快捷方式啓動3d

2.2 在Vivado開發環境裏點擊「Create New Project」,建立一個新的工程。調試

2.3 彈出一個創建新工程的嚮導,點擊「Next」

2.4 在彈出的對話框中輸入工程名和工程存放的目錄,咱們這裏取一個led的工程名。須要注意工程路徑「Project location」不能有中文空格,路徑名稱也不能太長。

2.5 在工程類型中選擇「RTL Project」

2.6 目標語言「Target language」選擇「Verilog」,雖然選擇Verilog,但VHDL也可使用,支持多語言混合編程。

2.7 點擊「Next」,不添加任何文件

2.8 在「Part」選項中,器件家族「Family」選擇「Zynq UltraScale+ MPSoCs」,封裝類型「Package」選擇「sfvc784」,Speed選擇」-1」,Temperature選擇「I」減小選擇範圍。在下拉列表中選擇「xczu2cg-sfvc784-1-i」,「-1」表示速率等級,數字越大,性能越好,速率高的芯片向下兼容速率低的芯片。

2.9 點擊「Finish」就能夠完成之後名爲「led」工程的建立。

2.10 Vivado軟件界面

3. 建立Verilog HDL文件點亮LED

3.1 點擊Project Manager下的Add Sources圖標(或者使用快捷鍵Alt+A)

3.2 選擇添加或建立設計源文件「Add or create design sources」,點擊「Next」

3.3 選擇建立文件「Create File」

3.4 文件名「File name」設置爲「led」,點擊「OK」

3.5 點擊「Finish」,完成「led.v」文件添加

3.6 在彈出的模塊定義「Define Module」,中能夠指定「led.v」文件的模塊名稱「Module name」,這裏默認不變爲「led」,還能夠指定一些端口,這裏暫時不指定,點擊「OK」。

3.7 在彈出的對話框中選擇「Yes」

3.8 雙擊「led.v」能夠打開文件,而後編輯

3.9 編寫「led.v」,這裏定義了一個32位的寄存器timer, 用於循環計數0~24999999(1秒鐘), 計數到24999999(1秒)的時候, 寄存器timer變爲0,並翻轉四個LED。這樣原來LED是滅的話,就會點亮,若是原來LED爲亮的話,就會熄滅。編寫好後的代碼以下:

module led( input sys_clk, input rst_n, outputreg[3:0] led ); reg[31:0] timer_cnt; always@(posedge sys_clk ornegedge rst_n) begin if(!rst_n) begin led <=4'd0; timer_cnt <=32'd0; end elseif(timer_cnt >=32'd24_999_999) begin led <=~led; timer_cnt <=32'd0; end else begin led <= led; timer_cnt <= timer_cnt +32'd1; end end endmodule 

3.10 編寫好代碼後保存

4. 添加管腳約束

Vivado使用的約束文件格式爲xdc文件。xdc文件裏主要是完成管腳的約束,時鐘的約束, 以及組的約束。這裏咱們須要對led.v程序中的輸入輸出端口分配到FPGA的真實管腳上。

4.1 點擊「Open Elaborated Design」

4.2 在彈出的窗口中點擊「OK」按鈕

4.3 在菜單中選擇「Window -> I/O Ports」

4.4 在彈出的I/O Ports中能夠看到管腳分配狀況

4.5 將復位信號rst_n綁定到PL端的按鍵,給LED和時鐘分配管腳、電平標準,完成後點擊保存圖標

4.6 彈出窗口,要求保存約束文件,文件名咱們填寫「led」,文件類型默認「XDC」,點擊「OK」

4.7 打開剛纔生成的「led.xdc」文件,咱們能夠看到是一個TCL腳本,若是咱們瞭解這些語法,徹底能夠經過本身編寫led.xdc文件的方式來約束管腳

下面來介紹一下最基本的XDC編寫的語法,普通IO口只需約束引腳號和電壓,管腳約束以下:

set_property PACKAGE_PIN "引腳編號" [get_ports 「端口名稱」]

電平信號的約束以下:

set_property IOSTANDARD "電平標準" [get_ports 「端口名稱」]

這裏須要注意文字的大小寫,端口名稱是數組的話用{ }刮起來,端口名稱必須和源代碼中的名字一致,且端口名字不能和關鍵字同樣。

電平標準中「LVCMOS33」後面的數字指FPGA的BANK電壓,LED所在BANK電壓爲3.3伏,因此電平標準爲「LVCMOS33」。Vivado默認要求爲全部IO分配正確的電平標準和管腳編號

5. 添加時序約束

一個FPGA設計除了管腳分配之外,還有一個重要的約束,那就是時序約束,這裏經過嚮導方式演示若是進行一個時序約束。

5.1 點擊「Run Synthesis」開始綜合

5.2 彈出對話框點擊「OK」

5.3 綜合完成之後點擊「Cancel」

5.4 點擊「Constraints Wizard」

5.5 在彈出的窗口中點擊「Next」

5.6 時序約束嚮導分析出設計中的時鐘,這裏把「sys_clk_p」頻率設置爲200Mhz,而後點擊「Skip to Finish」結束時序約束嚮導。

5.7 彈出的窗口中點擊「OK」

5.8 點擊「Finish」

5.9 這個時候led.xdc文件已經更新,若是xdc文件已經打開,會提示「Reload」從新加載文件,並保存文件

6. 生成BIT文件

6.1 編譯的過程能夠細分爲綜合、佈局佈線、生成bit文件等,這裏咱們直接點擊「Generate Bitstream」,直接生成bit文件。

6.2 在彈出的對話框中能夠選擇任務數量,這裏和CPU核心數有關,通常數字越大,編譯越快,點擊「OK」

6.3 這個時候開始編譯,能夠看到右上角有個狀態信息,在編譯過程當中可能會被殺毒軟件、電腦管家攔截運行,致使沒法編譯或很長時間沒有編譯成功。

6.4 編譯中沒有任何錯誤,編譯完成,彈出一個對話框讓咱們選擇後續操做,能夠選擇「Open Hardware Manger」,固然,也能夠選擇「Cancel」,咱們這裏選擇 「Cancel」,先不下載。

7. Vivado仿真

接下來咱們不妨小試牛刀,利用Vivado自帶的仿真工具來輸出波形驗證流水燈程序設計結果和咱們的預想是否一致(注意:在生成bit文件以前也能夠仿真)。具體步驟以下:

7.1 設置Vivado的仿真配置,右擊SIMULATION中Simulation Settings。

7.2 在Simulation Settings窗口中進行以下圖來配置,這裏設置成50ms(根據須要自行設定),其它按默認設置,單擊OK完成。

7.3 添加激勵測試文件,點擊Project Manager下的Add Sources圖標,按下圖設置後單擊Next。

7.4 點擊Create File生成仿真激勵文件。

在彈出的對話框中輸入激勵文件的名字,這裏咱們輸入名爲vtf_led_test。

7.5 點擊Finish按鈕返回。

這裏咱們先不添加IO Ports,點擊OK。

在Simulation Sources目錄下多了一個剛纔添加的vtf_led_test文件。雙擊打開這個文件,能夠看到裏面只有module名的定義,其它都沒有。

7.6 接下去咱們須要編寫這個vtf_led_test.v文件的內容。首先定義輸入和輸出信號,而後須要實例化led_test模塊,讓led_test程序做爲本測試程序的一部分。再添加復位和時鐘的激勵。完成後的vtf_led_test.v文件以下:

`timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// // Module Name: vtf_led_test //////////////////////////////////////////////////////////////////////////////////  module vtf_led_test; // Inputs reg sys_clk; reg rst_n ; // Outputs wire[3:0] led; // Instantiate the Unit Under Test (UUT) led uut ( .sys_clk(sys_clk), .rst_n(rst_n), .led(led) ); initial begin // Initialize Inputs  sys_clk =0; rst_n =0; #1000; rst_n =1; end //Create clock always#20 sys_clk =~ sys_clk; endmodule 

7.7 編寫好後保存,vtf_led_test.v自動成了這個仿真Hierarchy的頂層了,它下面是設計文件led_test.v。

7.8 點擊Run Simulation按鈕,再選擇Run Behavioral Simulation。這裏咱們作一下行爲級的仿真就能夠了。

若是沒有錯誤,Vivado中的仿真軟件開始工做了。

7.9 在彈出仿真界面後以下圖,界面是仿真軟件自動運行到仿真設置的50ms的波形。

因爲LED[3:0]在程序中設計的狀態變化時間長,而仿真又比較耗時,在這裏觀測timer[31:0]計數器變化。把它放到Wave中觀察(點擊Scope界面下的uut,再右鍵選擇Objects界面下的timer,在彈出的下拉菜單裏選擇Add Wave Window)。

添加後timer顯示在Wave的波形界面上,以下圖所示。

7.10 點擊以下標註的Restart按鈕復位一下,再點擊Run All按鈕。(須要耐心!!!),能夠看到仿真波形與設計相符。(注意:仿真的時間越長,仿真的波形文件佔用的磁盤空間越大,波形文件在工程目錄的xx.sim文件夾)

咱們能夠看到led的信號會變成f,說明LED燈會由亮變滅。

8. 下載

8.1 鏈接好開發板的JTAG接口,給開發板上電

注意拔碼開關要選擇JTAG模式,也就是所有拔到」ON」,「ON」表明的值是0,不用JTAG模式,下載會報錯。

8.2 在「HARDWARE MANAGER」界面點擊「Auto Connect」,自動鏈接設備

8.3 能夠看到JTAG掃描到arm和FPGA內核

8.4 選擇芯片,右鍵「Program Device...」

8.5 在彈出窗口中點擊「Program」

8.6 等待下載

8.7 下載完成之後,咱們能夠看到PL LED開始每秒變化一次。到此爲止Vivado簡單流程體驗完成。後面的章節會介紹若是把程序燒錄到Flash,須要PS系統的配合才能完成,只有PL的工程不能直接燒寫Flash。在」體驗ARM,裸機輸出」Hello World」一章的常見問題中有介紹。

9. 在線調試

前面介紹了仿真和下載,但仿真並不須要程序燒寫到板子,是比較理想化的結果,下面介紹Vivado在線調試方法,觀察內部信號的變化。Vivado有內嵌的邏輯分析儀,叫作ILA,能夠用於在線觀察內部信號的變化,對於調試有很大幫助。在本實驗中咱們觀察timer_cnt和led的信號變化。

9.1 添加ILA IP核

9.1.1 點擊IP Catalog,在搜索框中搜索ila,雙擊ILA的IP

9.1.2 修更名稱爲ila,因爲要採樣兩個信號,Probes的數量設置爲2,Sample Data Depth指的是採樣深度,設置的越高,採集的信號越多,一樣消耗的資源也會越多。

9.1.3 在Probe_Ports頁面,設置Probe的寬度,設置PROBE0位寬爲32,用於採樣timer_cnt,設置PROBE1位寬爲4,用於採樣led。點擊OK

彈出界面,選擇OK

再以下設置,點擊Generate

9.1.4 在led.v中例化ila,並保存

9.1.5 從新生成Bitstream

9.1.6 下載程序

9.1.7 這時候看到有bit和ltx文件,點擊program

9.1.8 此時彈出在線調試窗口,出現了咱們添加的信號

點擊運行按鈕,出現信號的數據

也能夠觸發採集,在Trigger Setup窗口點擊「+」,深度選擇timer_cnt信號

將Radix改成U,也就是十進制,在Value中設置爲24999999,也就是timer_cnt計數的最大值

再次點擊運行,便可以看到觸發成功,此時timer_cnt顯示爲十六進制,而led也在此時翻轉。

9.2 MARK DEBUG

上面介紹了添加ILA IP的方式在線調試,下面介紹在代碼中添加綜合屬性,實如今線調試。

9.2.1 首先打開led.v,將ila的例化部分註釋掉

9.2.2 在led和timer_cnt的定義前面添加(* MARK_DEBUG=」true」 *),保存文件。

9.2.3 點擊綜合

9.2.4 綜合結束後,點擊Set Up Debug

9.2.5 彈出的窗口點擊Next

按照默認點擊Next

採樣深度窗口,選擇Next

點擊Finish

點擊保存

在xdc文件中便可看到添加的ila核約束

9.2.6 從新生成bitstream

9.2.7 調試方法與前面同樣,再也不贅述。

10. 實驗總結

本章節介紹瞭如何在PL端開發程序,包括工程創建,約束,仿真,在線調試等方法,在後續的代碼開發方式中皆可參考此方法。

相關文章
相關標籤/搜索