對于Versal來說PL(FPGA)開發(fā)是至關(guān)重要的,這也是Versal比其他ARM的有優(yōu)勢的地方,可以定制化很多ARM端的外設(shè),在定制ARM端的外設(shè)之前先讓我們通過一個LED例程來熟悉PL(FPGA)的開發(fā)流程,熟悉Vivado軟件的基本操作,這個開發(fā)流程和不帶ARM的FPGA芯片完全一致。
在本例程中,我們要做的是LED燈控制實驗,每秒鐘控制開發(fā)板上的LED燈翻轉(zhuǎn)一次,實現(xiàn)亮、滅、亮、滅的控制。
1.1 LED硬件介紹
開發(fā)板的PL部分連接了1個紅色的用戶LED燈。這1個燈完全由PL控制。如果PL_LED1為高電平,三級管導(dǎo)通,燈則會亮,否則會滅。
1.2創(chuàng)建Vivado工程
(1).啟動Vivado,在Windows中可以通過雙擊Vivado快捷方式啟動 (2).在Vivado開發(fā)環(huán)境里點擊“Create New Project”,創(chuàng)建一個新的工程。
(3).彈出一個建立新工程的向?qū)?,點擊“Next”
(4).在彈出的對話框中輸入工程名和工程存放的目錄,我們這里取一個led的工程名。需要注意工程路徑“Project location”不能有中文空格,路徑名稱也不能太長。
(5).在工程類型中選擇“RTL Project”
(6).目標(biāo)語言“Target language”選擇“Verilog”,雖然選擇Verilog,但VHDL也可以使用,支持多語言混合編程。
(7).點擊“Next”,不添加任何文件
(8).選擇“xc2302-sfva784-1LP-e-S”
(9).點擊“Finish”就可以完成以后名為“l(fā)ed”工程的創(chuàng)建。
(10).Vivado軟件界面
1.3創(chuàng)建Verilog HDL文件點亮LED
(1).點擊Project Manager下的Add Sources圖標(biāo)(或者使用快捷鍵Alt+A)
(2).選擇添加或創(chuàng)建設(shè)計源文件“Add or create design sources”,點擊“Next”
(3).選擇創(chuàng)建文件“Create File”
(4).文件名“File name”設(shè)置為“l(fā)ed”,點擊“OK”
(5).點擊“Finish”,完成“l(fā)ed.v”文件添加
(6).在彈出的模塊定義“Define Module”,中可以指定“l(fā)ed.v”文件的模塊名稱“Module name”,這里默認(rèn)不變?yōu)椤發(fā)ed”,還可以指定一些端口,這里暫時不指定,點擊“OK”。
(7).在彈出的對話框中選擇“Yes”
(8).雙擊“l(fā)ed.v”可以打開文件,然后編輯
(9).編寫“l(fā)ed.v”,這里定義了一個32位的寄存器timer, 用于循環(huán)計數(shù)0~199999999(1秒鐘), 計數(shù)到199999999(1秒)的時候, 寄存器timer變?yōu)?,并翻轉(zhuǎn)四個LED。這樣原來LED是滅的話,就會點亮,如果原來 LED為亮的話,就會熄滅。由于輸入時鐘為200MHz的差分時鐘,因此需要添加 IBUFDS 連接差分信號,編寫好后的代碼如下:
timescale1ns/1ps module led( //Differential system clock input sys_clk_p, input sys_clk_n, input rst_n, outputreg led ); reg[31:0] timer_cnt; wire sys_clk ; IBUFDSIBUFDS_inst ( .O(sys_clk), // Buffer output .I(sys_clk_p), // Diff_p buffer input (connect directly to top-level port) .IB(sys_clk_n)// Diff_n buffer input (connect directly to top-level port) ); always@(posedge sys_clk) begin if(!rst_n) begin led<=1'b0; timer_cnt<=32'd0; end elseif(timer_cnt >=32'd199_999_999) //1 second counter, 200M-1=199999999 begin led<=~led; timer_cnt<=32'd0; end else begin led<= led; timer_cnt<= timer_cnt +32'd1; end end endmodule |
(10).編寫好代碼后保存
1.4 添加管腳約束
Vivado使用的約束文件格式為xdc文件。xdc文件里主要是完成管腳的約束,時鐘的約束, 以及組的約束。這里我們需要對led.v程序中的輸入輸出端口分配到FPGA的真實管腳上。
(1).新建約束文件
(2).Create File
(3).將復(fù)位信號rst_n綁定到PL端的按鍵,給LED和時鐘分配管腳、電平標(biāo)準(zhǔn),約束如下
set_property PACKAGE_PIN AB23 [get_ports sys_clk_p] set_property PACKAGE_PIN F21 [get_ports rst_n] set_property PACKAGE_PIN E20 [get_ports led] set_property IOSTANDARD LVCMOS15 [get_ports led] set_property IOSTANDARD LVCMOS15 [get_ports rst_n] set_property IOSTANDARD LVDS15 [get_ports sys_clk_p] create_clock -period 5.000 -name sys_clk_p -waveform {0.000 2.500} [get_ports sys_clk_p] |
1.5 生成pdi文件
(1).編譯的過程可以細(xì)分為綜合、布局布線、生成bit文件等,這里我們直接點擊“Generate Device Image”,直接生成pdi文件。
(2).在彈出的對話框中可以選擇任務(wù)數(shù)量,這里和CPU核心數(shù)有關(guān),一般數(shù)字越大,編譯越快,點擊“OK”
(3).編譯的時候發(fā)現(xiàn)有報錯
[DRC CIPS-2] Versal CIPS exists check - wdi: Versal designs must contain a CIPS IP in the netlist hierarchy to function properly. Please create an instance of the CIPS IP and configure it. Without a CIPS IP in the design, Vivado will not generate a CDO for the PMC, an elf for the PLM.
從報錯來看,versal設(shè)計是必須包含CIPS的,也就是PS端,因此需要添加CIPS核。
(4).選擇Create Block Design
(5).添加CIPS
(6).雙擊CIPS,選擇PL_Subsystem,只有PL端的邏輯
(7).右鍵Generate Output products
(8).之后右鍵創(chuàng)建HDL
(9).在led.v中例化PS端文件
(10).之后再Generate Bitstream,編譯中沒有任何錯誤,編譯完成,彈出一個對話框讓我們選擇后續(xù)操作,可以選擇“Open Hardware Manger”,當(dāng)然,也可以選擇“Cancel”,我們這里選擇 “Cancel”,先不下載。
1.6 Vivado仿真
接下來我們不妨小試牛刀,利用Vivado自帶的仿真工具來輸出波形驗證流水燈程序設(shè)計結(jié)果和我們的預(yù)想是否一致(注意:在生成bit文件之前也可以仿真)。具體步驟如下:
(1).設(shè)置Vivado的仿真配置,右擊SIMULATION中Simulation Settings。
(2).在Simulation Settings窗口中進(jìn)行如下圖來配置,這里設(shè)置成50ms(根據(jù)需要自行設(shè)定),其它按默認(rèn)設(shè)置,單擊OK完成。
(3).添加激勵測試文件,點擊Project Manager下的Add Sources圖標(biāo),按下圖設(shè)置后單擊Next。
(4).點擊Create File生成仿真激勵文件。
在彈出的對話框中輸入激勵文件的名字,這里我們輸入名為vtf_led_test。
(5). 點擊Finish按鈕返回。
這里我們先不添加IO Ports,點擊OK。
在Simulation Sources目錄下多了一個剛才添加的vtf_led_test文件。雙擊打開這個文件,可以看到里面只有module名的定義,其它都沒有。
(6). 接下去我們需要編寫這個vtf_led_test.v文件的內(nèi)容。首先定義輸入和輸出信號,然后需要實例化led_test模塊,讓led_test程序作為本測試程序的一部分。再添加復(fù)位和時鐘的激勵。完成后的vtf_led_test.v文件如下:
timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// // Module Name: vtf_led_test ////////////////////////////////////////////////////////////////////////////////// module vtf_led_test; // Inputs reg sys_clk_p; reg rst_n ; wire sys_clk_n; // Outputs wire led; // Instantiate the Unit Under Test (UUT) led uut ( .sys_clk_p(sys_clk_p), .sys_clk_n(sys_clk_n), .rst_n(rst_n), .led(led) ); initial begin // Initialize Inputs sys_clk_p=0; rst_n=0; // Wait for global reset to finish #1000; rst_n=1; end //Create clock always#2.5 sys_clk_p =~ sys_clk_p; assign sys_clk_n =~sys_clk_p ; endmodule |
(7). 編寫好后保存,vtf_led_test.v自動成了這個仿真Hierarchy的頂層了,它下面是設(shè)計文件led_test.v。
(8). 點擊Run Simulation按鈕,再選擇Run Behavioral Simulation。這里我們做一下行為級的仿真就可以了。
如果沒有錯誤,Vivado中的仿真軟件開始工作了。
(9). 在彈出仿真界面后如下圖,界面是仿真軟件自動運行到仿真設(shè)置的50ms的波形。
由于LED[3:0]在程序中設(shè)計的狀態(tài)變化時間長,而仿真又比較耗時,在這里觀測timer[31:0]計數(shù)器變化。把它放到Wave中觀察(點擊Scope界面下的uut, 再右鍵選擇Objects界面下的timer, 在彈出的下拉菜單里選擇Add Wave Window)。
添加后timer顯示在Wave的波形界面上,如下圖所示。
(10). 點擊如下標(biāo)注的Restart按鈕復(fù)位一下,再點擊Run All按鈕。(需要耐心?。。。梢钥吹椒抡娌ㄐ闻c設(shè)計相符。(注意:仿真的時間越長,仿真的波形文件占用的磁盤空間越大,波形文件在工程目錄的xx.sim文件夾)
我們可以看到led的信號會變成1,說明LED燈會變亮。
1.7下載
(1). 連接好開發(fā)板的JTAG接口,給開發(fā)板上電,注意拔碼開關(guān)要選擇JTAG模式,也就是全部拔到”O(jiān)N”,“ON”代表的值是0,不用JTAG模式,下載會報錯。
(2). 在“HARDWARE MANAGER”界面點擊“Auto Connect”,自動連接設(shè)備
(3). 選擇芯片,右鍵“Program Device...”
(4). 在彈出窗口中點擊“Program”
(5). 等待下載
(6). 下載完成以后,我們可以看到PL LED開始每秒變化一次。到此為止Vivado簡單流程體驗完成。后面的章節(jié)會介紹如果把程序燒錄到Flash,需要PS系統(tǒng)的配合才能完成,只有PL的工程不能直接燒寫Flash。在”體驗ARM,裸機輸出”Hello World”一章的常見問題中有介紹。
審核編輯:劉清
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107746 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119813 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59664 -
FPGA芯片
+關(guān)注
關(guān)注
3文章
246瀏覽量
39746 -
Vivado
+關(guān)注
關(guān)注
19文章
804瀏覽量
66221
原文標(biāo)題:【ALINX 技術(shù)分享】AMD Versal AI Edge 自適應(yīng)計算加速平臺之 PL LED 實驗(3)
文章出處:【微信號:ALINX,微信公眾號:ALINX】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論