?「導(dǎo)讀」:本文旨在通過 LED 的 Demo,實現(xiàn)快速上手基于PGL22G的FPGA開發(fā)。
?
@
一、創(chuàng)建工程
「STEP #1」
啟動 Pango Design Suite 2020.3 開發(fā)環(huán)境(在開始菜單中選擇 pango->Pango DesignSuite 2020.3>Pango Design Suite 。Pango Design Suite(簡稱 PDS)或者雙擊桌面的Pango Design Suite 2020.3 的圖標(biāo)直接打開軟件。
在這里插入圖片描述
「STEP #2」
在 PDS 開發(fā)環(huán)境里雙擊 Create Project 或 File->New Project...這兩種方式都可,如下圖:
在這里插入圖片描述
「STEP #3」
彈出一個 PDS 的工程向?qū)?,點擊 Next 按鈕。
在這里插入圖片描述
「STEP #4」
在彈出的對話框中輸入工程名和工程存放的目錄,這里取一個 led_test 的工程名,點擊 Next;
在這里插入圖片描述
「STEP #5」
在下面的對話框中默認(rèn)選擇 RTL Project, 因為我們這里使用 verilog 行為描述語言來編程,單擊 Next
在這里插入圖片描述
「STEP #6」
進(jìn)入 Add Design Source Files 界面,這里先不添加任何設(shè)計文件。點擊 Next;
在這里插入圖片描述
「STEP #7」
這里問是否添加已有的 IP,保持默認(rèn)不添加,單擊 Next;
在這里插入圖片描述
「STEP #8」
提示是否添加已有的約束文件,這里約束文件我們也沒有設(shè)計好,也不添加。
在這里插入圖片描述
「STEP #9」
在接下來的對話框選擇所用的 FPGA 器件,以及進(jìn)行一些配置。開發(fā)板首先在 Family 欄里選擇 Logos
,Device 中選擇 PGL22G
,在 Package 欄選擇 BG324
, Speed grade 欄選擇-6
;綜合工具選擇 ADS
;單擊 NEXT 進(jìn)入下一界面:
在這里插入圖片描述
「STEP #10」
再次確認(rèn)一下板子型號有沒有選對, 沒有問題再點擊“Finish”完成工程創(chuàng)建。
在這里插入圖片描述
「STEP #11」
工程創(chuàng)建后如下圖所示:
二、編寫流水燈的 verilog 代碼
「STEP #1」
雙擊 Sources 下的 Designs 圖標(biāo);
「STEP #2」
在 Add Design Source Files 界面中進(jìn)行如下設(shè)置,點擊 OK;
「STEP #3」
可以看到已經(jīng)新建的 led_test.v 文件,點擊 OK 按鈕。
在這里插入圖片描述
向?qū)崾灸x I/O 的端口,這里我們可以不定義,后面「自己在程序中編寫」就可以,單擊 OK 完成
這時在 Navigator 界面下的 Designs 里已經(jīng)有了一個 led_test.v 文件, 并且自動成為項目的「頂層」(Top)模塊了。
「STEP #4」
接下去我們來編寫 led_test.v
的程序,這里我們定義了一個 32 位的寄存器 timer
,用于循環(huán)計數(shù) 0~199_999_999(4 秒鐘)。
- 當(dāng)計數(shù)到 49_999_999(1 秒)的時候,熄滅第一個 LED 燈;
- 當(dāng)計數(shù)到 99_999_999(2 秒)的時候,熄滅第二個 LED 燈;
- 當(dāng)計數(shù)到 149_999_999(3 秒)的時候,熄滅第三個 LED 燈;
- 當(dāng)計數(shù)到 199_999_999(4 秒)的時候,熄滅第四個 LED 燈,計數(shù)器再重新計數(shù)。
`timescale 1ns/1nsmodule led_test( sys_clk, // system clock 50Mhz on board rst_n, // reset ,low active led // LED,use for control the LED signal on board); input sys_clk;input rst_n;output [3:0] led;//define the time counterreg [31:0] timer; reg [3:0] led;always @(posedge sys_clk or negedge rst_n) begin if (~rst_n) timer <= 32'd0; // when the reset signal valid,time counter clearing else if (timer == 32'd199_999_999) //4 seconds count(50M*4-1=199999999) timer <= 32'd0; //count done,clearing the time counter else timer <= timer + 1'b1; //timer counter = timer counter + 1endalways @(posedge sys_clk or negedge rst_n) begin if (~rst_n) led <= 4'b0000; //when the reset signal active else if (timer == 32'd49_999_999) //time counter count to 1st sec,LED1 Extinguish led <= 4'b0001; else if (timer == 32'd99_999_999) begin //time counter count to 2nd sec,LED2 Extinguish led <= 4'b0010; end else if (timer == 32'd149_999_999) //time counter count to 3nd sec,LED3 Extinguish led <= 4'b0100; else if (timer == 32'd199_999_999) //time counter count to 4nd sec,LED4 Extinguish led <= 4'b1000; end endmodule
頂層模塊編寫幾個注意事項:
- ①、在定義寄存器時,如果「寄存器在 always 塊里使用必須定義為 reg 類型」;
- ②、如果「僅是用于連線或是直接賦值需定義為 wire 類型」;
- ③、wire 類型只能在 assign 中「連續(xù)賦值」,即:assign 語句中的賦值目標(biāo)變量(位于左側(cè)),「必須是 wire 型的」。
- ③、「輸入信號的類型不能定義為 reg 型」
三、添加 UCE 約束
?PDS開發(fā)中的約束文件默認(rèn)是
?.fdc
格式
User Constraint Editor
(Timing and Logic
)簡稱 UCE,主要是完成「管腳的約束,時鐘的約束,以及組的約束」。這里我們需要對 led_test.v
程序中的「輸入輸出端口分配到 FPGA 的真實管腳」上。
「STEP #1」
點擊菜單欄“Tools”下的"User Constraint Editor";
在這里插入圖片描述
「STEP #2」
在彈出的界面中單擊 Device;
在這里插入圖片描述
「STEP #3」
在 Device 中單擊 I/O,可看到工程中用到的 IO 端口;
「STEP #4」
按如下方式分配管腳,LOC
就是「與硬件中 FPGA 相對應(yīng)的管腳」,VCCIO
是 「FPGA 的 IO 的電壓標(biāo)準(zhǔn)」,與硬件對應(yīng),其它在這里保持默認(rèn)即可;
在這里插入圖片描述
「STEP #5」
單擊保存后會彈對話框,在這里選擇默認(rèn);
在這里插入圖片描述
四、 生成位流文件
「雙擊」 Generate Bitstream
,然后軟件會按照 Synthesize-> Device Map-> Place & Route-> Generate Bitstream
來產(chǎn)生位流文件。
在這里插入圖片描述
如果工程在生成位流文件過程中沒有錯誤,則會出現(xiàn)下圖中每一步都正確的“√
”,否則就會在 Messages 欄中顯示 errors 的錯誤。
在這里插入圖片描述
位流文件生成完成后,我們可以在 Report Summary
頁面的到了 FPGA
「資源」的使用情況。
在這里插入圖片描述
此外還可以通過下圖操作查看 RTL
視圖;
在這里插入圖片描述
在這里插入圖片描述
五、下載和調(diào)試
?直接下載到FPGA的程序文件格式為:
?.sbit
,該種方式掉電「會丟失」! 間接下載到FLASH的程序文件格式為:.sfc
,該種方式掉電「不會丟失」!
在上面生成了位流文件(.sbit
)后,我們可以把 sbit 文件下載到 FPGA 芯片中,看一下 LED實際運行的效果。下載和調(diào)試之前先連接硬件,把 JTAG 下載器和開發(fā)板連接,然后開發(fā)板上電(下圖為開發(fā)板的硬件連接圖)。
在這里插入圖片描述
「STEP #1」
單擊界面中的“Configuration
”按鈕,作用一是下載程序到 FPGA
中運行;二是固化程序到 flash
中。
在這里插入圖片描述
「STEP #2」
在彈出的界面中的「單擊」“Boundary Scan
”,然后「在右側(cè)空白區(qū)單擊右鍵選擇」“Scan Device
”;
在這里插入圖片描述
「STEP #3」
在掃描到 JTAG 設(shè)備后會彈出如下對話框,并按如下加載.sbit
文件即可;
「STEP #4」
然后可以看到「左側(cè)顯示了要加載的文件」,「選中右側(cè)綠色的方塊」,「右擊會彈出下拉菜單」并選擇"Program...
",下載完成后在板上可以在開發(fā)板上看到 LED 流水燈的效果。注意:「這種方式程序是在 FPGA 運行,掉電后會消失」。
在這里插入圖片描述
六、FLASH 程序固化
可能已經(jīng)有朋友發(fā)現(xiàn)下載.sbit 文件到 FPGA 后,開發(fā)板重新上電后配置程序已經(jīng)丟失,還需要 JTAG 下載。這豈不麻煩!好吧,這一節(jié)我們來介紹「如何把配置程序固化到開發(fā)板上的 FLASH中」,這樣不用擔(dān)心掉電后程序丟失了。
在我們的開發(fā)板上有一個 8Pin
的 128Mbit
的 FLASH
, 用于存儲配置程序
。我們「不能直接把sbit
文件下載到這個 FLASH 中」,「只能下載 sfc
文件到 flash 中」。下面為大家介紹 FLASH 程序的固化的流程。
「STEP #1」
首先,需要 sbit
文件轉(zhuǎn)換成能下載的 flash 的 sfc
文件。在完成上節(jié)下載和調(diào)試后,「選擇菜單」"Operations
"下"Convert File
"進(jìn)行文件轉(zhuǎn)換。
在這里插入圖片描述
然后彈出如下界面,這里要根據(jù)硬件的 flash
型號來選擇 flash
的廠家和設(shè)備型號,開發(fā)板用到的是 WINBOND
的 W25Q128Q
。Flash Read Mode
選擇 SPI X4
然后選擇要轉(zhuǎn)換的 sbit
文件,點擊 OK 即可轉(zhuǎn)換;
在這里插入圖片描述
轉(zhuǎn)換完成后顯示如下界面,單擊 OK;
在這里插入圖片描述
「STEP #2」
選中右側(cè)綠色的方塊,右擊會彈出下拉菜單并選擇"Scan outer Flash
"。
選擇已生成的 sfc
文件,單擊 Open;
在這里插入圖片描述
可以看到界面中有了 flash
器件,選中“Outer Flash
”綠色方塊并「右擊選擇菜單」中“Program...
”
彈出正在編程的進(jìn)度界面,flash 編程完成后進(jìn)度界面自動消失。
至此,SPI FLASH 燒寫完畢,led_test 程序已經(jīng)固化到 SPI FLASH 中了。我們來驗證一下,關(guān)電重新啟動開發(fā)板,等待一會兒你就可以看到開發(fā)板上的 LED 燈已經(jīng)在做跑馬運動了。
七、仿真驗證
接下來我們不妨小試牛刀,讓仿真工具 modelsim
來輸出波形驗證流水燈程序設(shè)計結(jié)果和我們的預(yù)想是否一致。具體步驟如下:
「STEP #1」 添加激勵測試文件,點擊 Project 下的 Add Source;
在這里插入圖片描述
「STEP #2」
點擊 Add or create simulation sources 并"Next";
在這里插入圖片描述
「STEP #3」
在彈出的對話框中輸入激勵文件的名字,這里我們輸入名為 vtf_led_test,其它按下圖設(shè)置;
「STEP #4」
點擊 OK 按鈕返回。
「STEP #5」
這里我們先不添加 IO Ports,點擊 OK。
在這里插入圖片描述
「STEP #6」
在 Simulation 目錄下多了一個剛才添加的 vtf_led_test 文件。雙擊打開這個文件,可以看到里面只有 module 名的定義,其它都沒有。
在這里插入圖片描述
「STEP #7」
接下去我們需要編寫這個 vtf_led_test.v 文件的內(nèi)容。首先定義輸入和輸出信號,然后需要實例化 led_test 模塊,讓 led_test 程序作為本測試程序的一部分。再添加復(fù)位和時鐘的激勵。完成后的 vtf_led_test.v 文件如下:
`timescale 1ns / 1ns//////////////////////////////////////////////////////////////////////////////////// Module Name: vtf_led_test//////////////////////////////////////////////////////////////////////////////////module vtf_led_test;// Inputsreg sys_clk;reg rst_n;// Outputswire [3:0] led;// Instantiate the Unit Under Test (UUT)led_test uut ( .sys_clk(sys_clk), .rst_n(rst_n), .led(led));initial begin // Initialize Inputs sys_clk = 0; rst_n = 0; // Wait 100 ns for global reset to finish #1000; rst_n = 1; // Add stimulus here #20000; // $stop; endalways #10 sys_clk = ~ sys_clk; //20ns endmodule
仿真模塊編寫流程:
- ①、首先定義輸入和輸出信號;
- ②、然后實例化模塊;
- ③、最后添加復(fù)位和時鐘的激勵。
仿真模塊編寫幾個注意事項:
- ①、模塊中的
input
信號在仿真代碼中定義為reg
類型; - ②、模塊中的
output
信號在仿真代碼中定義為wire
類型!
「STEP #8」
編寫好后保存,vtf_led_test.v
「自動成了這個仿真的頂層」了,它下面是設(shè)計文件 led_test.v
;
在這里插入圖片描述
「STEP #9」
接下來設(shè)置 PDS 的仿真配置,在軟件菜單 Project->Project Setting
,然后在彈出的界面中進(jìn)行如下設(shè)置,注意仿真庫的路徑在《00.Pango Design Suite 2020.3 安裝》教程中已介紹。設(shè)置好后單擊 OK。
在這里插入圖片描述
「STEP #10」
右擊仿真文件并在下拉菜單中選擇 Run Behavioral Simulation
。這里我們做一下「行為級的仿真」就可以了。
如果沒有錯誤,PDS 會調(diào)用 Modelsim 仿真軟件開始工作了
「STEP #11」
在彈出仿真界面后如下圖,界面是仿真軟件自動運行到仿真設(shè)置的 50ms
的波形。
由于 LED[3:0]在程序中設(shè)計的狀態(tài)變化時間長,而仿真又比較耗時,在這里觀測 timer[31:0]計數(shù)器變化。把它放到 Wave 中觀察(「點擊界面中的 uut, 再右擊右側(cè) timer, 在彈出的下拉菜單里選擇 Add Wave」)。
在這里插入圖片描述
添加后 timer 顯示在 Wave 的波形界面上,如下圖所示。
點擊 Restart 按鈕復(fù)位一下,再點擊 Run All 按鈕。(需要耐心!?。。?,可以看到仿真波形與設(shè)計相符。
在這里插入圖片描述
我們可以看到 led 的信號會逐一變 1,說明 LED1~LED4 燈逐個熄滅。
?補(bǔ)充:「仿真自帶例程」幾點注意:
?
- ①、路徑名稱「不能含有中文或空格」
- ②、「需要重新編譯仿真庫」,具體操作如下:
- 打開
Tools -> Compile Simulation Libraries
,分別:
- 設(shè)置 Compiled Library Location 為:
D:/modeltech64_10.1c/pango_sim_libraries
;- 設(shè)置 Simulator Executable Path 為:
D:/modeltech64_10.1c/win64
,然后點擊Compile(大概需要2min)
這里為止,我們的第一個項目就圓滿完成了,相信您也掌握了 PDS 的 FPGA 開發(fā)的整個流程,再也不是那個 FPGA 的門外漢了吧!