對于Versal來說PL(FPGA)開發是至關重要的,這也是Versal比其他ARM的有優勢的地方,可以定制化很多ARM端的外設,在定制ARM端的外設之前先讓我們通過一個LED例程來熟悉PL(FPGA)的開發流程,熟悉Vivado軟件的基本操作,這個開發流程和不帶ARM的FPGA芯片完全一致。
在本例程中,我們要做的是LED燈控制實驗,每秒鐘控制開發板上的LED燈翻轉一次,實現亮、滅、亮、滅的控制。
1.1 LED硬件介紹
開發板的PL部分連接了1個紅色的用戶LED燈。這1個燈完全由PL控制。如果PL_LED1為高電平,三級管導通,燈則會亮,否則會滅。
1.2創建Vivado工程
(1).啟動Vivado,在Windows中可以通過雙擊Vivado快捷方式啟動 (2).在Vivado開發環境里點擊“Create New Project”,創建一個新的工程。
(3).彈出一個建立新工程的向導,點擊“Next”
(4).在彈出的對話框中輸入工程名和工程存放的目錄,我們這里取一個led的工程名。需要注意工程路徑“Project location”不能有中文空格,路徑名稱也不能太長。
(5).在工程類型中選擇“RTL Project”
(6).目標語言“Target language”選擇“Verilog”,雖然選擇Verilog,但VHDL也可以使用,支持多語言混合編程。
(7).點擊“Next”,不添加任何文件
(8).選擇“xc2302-sfva784-1LP-e-S”
(9).點擊“Finish”就可以完成以后名為“led”工程的創建。
(10).Vivado軟件界面
1.3創建Verilog HDL文件點亮LED
(1).點擊Project Manager下的Add Sources圖標(或者使用快捷鍵Alt+A)
(2).選擇添加或創建設計源文件“Add or create design sources”,點擊“Next”
(3).選擇創建文件“Create File”
(4).文件名“File name”設置為“led”,點擊“OK”
(5).點擊“Finish”,完成“led.v”文件添加
(6).在彈出的模塊定義“Define Module”,中可以指定“led.v”文件的模塊名稱“Module name”,這里默認不變為“led”,還可以指定一些端口,這里暫時不指定,點擊“OK”。
(7).在彈出的對話框中選擇“Yes”
(8).雙擊“led.v”可以打開文件,然后編輯
(9).編寫“led.v”,這里定義了一個32位的寄存器timer, 用于循環計數0~199999999(1秒鐘), 計數到199999999(1秒)的時候, 寄存器timer變為0,并翻轉四個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).將復位信號rst_n綁定到PL端的按鍵,給LED和時鐘分配管腳、電平標準,約束如下
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).編譯的過程可以細分為綜合、布局布線、生成bit文件等,這里我們直接點擊“Generate Device Image”,直接生成pdi文件。
(2).在彈出的對話框中可以選擇任務數量,這里和CPU核心數有關,一般數字越大,編譯越快,點擊“OK”
(3).編譯的時候發現有報錯
[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設計是必須包含CIPS的,也就是PS端,因此需要添加CIPS核。
(4).選擇Create Block Design
(5).添加CIPS
(6).雙擊CIPS,選擇PL_Subsystem,只有PL端的邏輯
(7).右鍵Generate Output products
(8).之后右鍵創建HDL
(9).在led.v中例化PS端文件
(10).之后再Generate Bitstream,編譯中沒有任何錯誤,編譯完成,彈出一個對話框讓我們選擇后續操作,可以選擇“Open Hardware Manger”,當然,也可以選擇“Cancel”,我們這里選擇 “Cancel”,先不下載。
1.6 Vivado仿真
接下來我們不妨小試牛刀,利用Vivado自帶的仿真工具來輸出波形驗證流水燈程序設計結果和我們的預想是否一致(注意:在生成bit文件之前也可以仿真)。具體步驟如下:
(1).設置Vivado的仿真配置,右擊SIMULATION中Simulation Settings。
(2).在Simulation Settings窗口中進行如下圖來配置,這里設置成50ms(根據需要自行設定),其它按默認設置,單擊OK完成。
(3).添加激勵測試文件,點擊Project Manager下的Add Sources圖標,按下圖設置后單擊Next。
(4).點擊Create File生成仿真激勵文件。
在彈出的對話框中輸入激勵文件的名字,這里我們輸入名為vtf_led_test。
(5). 點擊Finish按鈕返回。
這里我們先不添加IO Ports,點擊OK。
在Simulation Sources目錄下多了一個剛才添加的vtf_led_test文件。雙擊打開這個文件,可以看到里面只有module名的定義,其它都沒有。
(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_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的頂層了,它下面是設計文件led_test.v。
(8). 點擊Run Simulation按鈕,再選擇Run Behavioral Simulation。這里我們做一下行為級的仿真就可以了。
如果沒有錯誤,Vivado中的仿真軟件開始工作了。
(9). 在彈出仿真界面后如下圖,界面是仿真軟件自動運行到仿真設置的50ms的波形。
由于LED[3:0]在程序中設計的狀態變化時間長,而仿真又比較耗時,在這里觀測timer[31:0]計數器變化。把它放到Wave中觀察(點擊Scope界面下的uut, 再右鍵選擇Objects界面下的timer, 在彈出的下拉菜單里選擇Add Wave Window)。
添加后timer顯示在Wave的波形界面上,如下圖所示。
(10). 點擊如下標注的Restart按鈕復位一下,再點擊Run All按鈕。(需要耐心!!!),可以看到仿真波形與設計相符。(注意:仿真的時間越長,仿真的波形文件占用的磁盤空間越大,波形文件在工程目錄的xx.sim文件夾)
我們可以看到led的信號會變成1,說明LED燈會變亮。
1.7下載
(1). 連接好開發板的JTAG接口,給開發板上電,注意拔碼開關要選擇JTAG模式,也就是全部拔到”ON”,“ON”代表的值是0,不用JTAG模式,下載會報錯。
(2). 在“HARDWARE MANAGER”界面點擊“Auto Connect”,自動連接設備
(3). 選擇芯片,右鍵“Program Device...”
(4). 在彈出窗口中點擊“Program”
(5). 等待下載
(6). 下載完成以后,我們可以看到PL LED開始每秒變化一次。到此為止Vivado簡單流程體驗完成。后面的章節會介紹如果把程序燒錄到Flash,需要PS系統的配合才能完成,只有PL的工程不能直接燒寫Flash。在”體驗ARM,裸機輸出”Hello World”一章的常見問題中有介紹。
審核編輯:劉清
-
led燈
+關注
關注
22文章
1592瀏覽量
107950 -
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
RTL
+關注
關注
1文章
385瀏覽量
59759 -
FPGA芯片
+關注
關注
3文章
246瀏覽量
39795 -
Vivado
+關注
關注
19文章
812瀏覽量
66470
原文標題:【ALINX 技術分享】AMD Versal AI Edge 自適應計算加速平臺之 PL LED 實驗(3)
文章出處:【微信號:ALINX,微信公眾號:ALINX】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論