文章目錄
- 概述
- 一、建立工程
- 二、設(shè)計輸入
- 三、分析和綜合
- 四、功能仿真
- 五、綜合與布局布線
- 六、時序仿真
- 七、IO 分配以及生成配置文件
- 八、配置 FPGA 下載
- 九、固化程序到FLASH中
- 9.1、FPGA 固件存儲方案介紹
- 9.2、Cyclone IV E FPGA 固件燒寫方案
- 9.3、燒寫文件 JIC 的產(chǎn)生
概述
科學(xué)合理的 FPGA 設(shè)計流程是為了更加直觀地展示一個完整的設(shè)計流程,本節(jié)以一個基礎(chǔ)的實驗——二選一選擇器,來介紹完整的 FPGA 設(shè)計開發(fā)流程。
良好的文件夾設(shè)置以及工程管理是學(xué)好 FPGA 設(shè)計的基礎(chǔ),在學(xué)習(xí)之初就應(yīng)建立良好的習(xí)慣。因此首先在新建的工程文件夾下面,分別建立如下圖所示的子文件夾。
各級目錄作用釋義如下:
- prj 為工程文件存放目錄
- prj 文件夾下還建立了子文件夾 ip,用于存放 Quartus Prime 中生成的 IP 核文件
- rtl 為 verilog 可綜合代碼存放目錄
- testbench 為測試文件存放目錄
- img 為設(shè)計相關(guān)圖片存放目錄
- doc 為設(shè)計相關(guān)文檔存放目錄
一、建立工程
每個開發(fā)過程開始時都應(yīng)建立一個 Quartus Prime 工程, Quartus II 以工程的方式對設(shè)計過程進行管理, Quartus II 工程包括創(chuàng)建 FPGA 配置文件需要的所有設(shè)置和設(shè)計文件。
打開安裝好的 Quartus Prime 17.1 軟件,軟件啟動界面及啟動后的主界面如下圖所示:
STEP #1
第一步, 單擊 New Project Wizard 來啟動一個工程向?qū)А?會顯示如下圖所示的工程向?qū)Ы榻B,此處直接單擊 Next 即可。
STEP #2
第二步,選擇新建工程所在路徑、設(shè)置工程命名以及「頂層設(shè)計實體名稱」。在輸入頂層設(shè)計實體時默認與工程名稱一致,此處可根據(jù)具體情況來自行修改,這里我就直接使用默認設(shè)置了,如下圖所示。
選擇工程類型時可以選擇一個全空的工程,也可以基于現(xiàn)有的工程模版來實現(xiàn)。此處選擇新建一個空的工程,如下圖所示。
STEP #3
第三步,添加已有設(shè)計文件。如沒有, 可直接點擊 Next,本次單擊 Next, 如下圖所示。
STEP #4
第四步,選擇器件。在這里選擇 Cyclone IV E 系列的 EP4CE10F17C8
,如下圖所示。 這里可在右面紅色框內(nèi)可通過添加限定條件來減少需要翻看器件的目錄。
?小梅哥的AC501使用的是:Cyclone V 系列的
?5CSEBA2U19I7
STEP #5
第五步, EDA 工具的選擇。從上至下依次是綜合工具、仿真工具以及板級工具, 可根據(jù)實際情況自行選擇。在這里根據(jù)自己安裝情況將仿真工具設(shè)置為 Modelsim-Altera,語言選擇 Verilog HDL,其他選項可暫時不做處理, 如下圖所示。
?若「后期需要設(shè)置或更改 EDA 工具相關(guān)路徑時」, 依次點擊
?[Tools] -> [Options] -> [General] -> [EDA Tool Options] -> ModelSim-Altera
STEP #6
第六步,出現(xiàn)設(shè)置信息概覽頁面,直接單擊 Finish 完成工程的建立。
二、設(shè)計輸入
工程建立完成后,需要為工程添加新的設(shè)計文件,單擊 [File] -> [New] -> Verilog HDL File
,或者工具欄中的 New,彈出如下圖所示的選擇框,此處選擇 Design Files 中的 Verilog HDL File,然后點擊OK。
新的文件建立完成后,輸入下述二選一多路器代碼,并以 led.v
命名保存到工程對應(yīng)的 rtl
文件夾下。
module led(a,b,key_in,led_out); input a;//輸入端口 A input b;//輸入端口 B input key_in; //按鍵輸入,實現(xiàn)輸入通道的選擇 output led_out; //led 控制端口 默認是wire類型 //當 key_in == 0 : led_out = a assign led_out = (key_in == 0)? a : b;endmodule
簡單解釋代碼,當 key_in 為低時,輸出 led_out 和 a 相同,否之 led_out 和 b 相同。
?默認勾選
?Add file to current project
三、分析和綜合
單擊工具欄中的 Start Analysis & Synthesis
來進行分析和綜合, 如下圖所示。如在設(shè)計過程有錯誤的地方,在分析和綜合后會提示 Error 或者 Warning,需針對不同情況進行修改。
?常見的問題以及解決方式,可參見 www.corecourse.cn 網(wǎng)站上相關(guān)文章針對性解決。
?
Quartus的右下角會顯示進度和所用時間,如下圖所示。
分析和綜合沒有問題后,依次點擊[Tools] -> [Netlist Viewers] -> RTL Viewer
,可以看到如下圖所示的硬件邏輯電路,即一個二選一選擇器,符合設(shè)計預(yù)期。
四、功能仿真
STEP #1 編寫測試激勵文件
為了驗證以上邏輯設(shè)計是否成功, 「在直接下載到開發(fā)板觀察現(xiàn)象之前需要進行功能仿真(又稱為行為級仿真或者前仿真)」,功能仿真首先需要編寫激勵文件,此處再新建一個 led_tb.v
文件并輸入如下代碼,保存到工程對應(yīng)的 testbench
文件夾下, 并再次進行「分析和綜合」查看是否存在語法設(shè)計錯誤。
`timescale 1ns/1psmodule led_tb; //激勵信號定義,對應(yīng)連接到待測試模塊的輸入端口 reg signal_a; reg signal_b; reg signal_c; //待檢測信號定義,對應(yīng)連接到待測試模塊的輸出端口 wire led; //例化待測試模塊 led led0( .a(signal_a), .b(signal_b), .key_in(signal_c), .led_out(led) ); //產(chǎn)生激勵 initial begin signal_a = 0;signal_b = 0;signal_c = 0; #100;//延時 100ns signal_a = 0;signal_b = 0;signal_c = 1; #100; signal_a = 0;signal_b = 1;signal_c = 0; #100; signal_a = 0;signal_b = 1;signal_c = 1; #100; signal_a = 1;signal_b = 0;signal_c = 0; #100; signal_a = 1;signal_b = 0;signal_c = 1; #100; signal_a = 1;signal_b = 1;signal_c = 0; #100; signal_a = 1;signal_b = 1;signal_c = 1; #200; $stop; endendmodule
簡單解釋下程序,timescale 指定程序的延時單位和精度。#200 的意思就是延時200ns,#200.123的意思就是延時200.123ns,即演示精度最多為ps級別,200123ps。提醒一點,需要注意下例化的對應(yīng)關(guān)系。
STEP #2 設(shè)置仿真腳本
單擊標題欄的 [Assignments] -> [Settings] -> Simulation
,「查看仿真工具以及語言是否與之前的設(shè)置一致」, 否則根據(jù)實際使用情況進行相應(yīng)的修改,如下圖所示。
選中上述界面下方的 Compile test bench 選項,然后單擊其后的 Test Benches,可以看到如下圖所示界面。
點擊 New, 彈出如下圖所示的 Test Bench 設(shè)置文件對話框,在 Test bench name 中填寫對應(yīng)的激勵名稱led_tb
(Top level module in test bench
會自動設(shè)置與其一樣),接著找到已經(jīng)編寫好的激勵文件,單擊 Add,最后點擊 OK 后回到主界面。
?手動設(shè)置仿真時間為
10us
,方式如下圖所示:?
STEP #3 啟動仿真
單擊 [Tools] -> [Run Simulation Tool] -> RTL Simulation
來進行「前仿真」也就是常說的「功能仿真」,如下圖所示。
?[Tools] -> [Options] -> EDA ToolOptions 可以設(shè)置對應(yīng)的仿真軟件的路徑
?
STEP #4 仿真結(jié)果分析
至此, 即可在仿真軟件 modelsim 中看到如下圖所示的波形文件,可以看出符合設(shè)計預(yù)期, 當 key_in 等于 0 時 led_out 等于 a,當 key_in 等于 1 時 led_out 等于 b,即功能仿真通過。
五、綜合與布局布線
點擊 Quartus Prime 主界面的 Start Compilation,進行綜合&布局布線, 如下圖所示。布局布線過程中如遇出錯, 應(yīng)根據(jù)編譯錯誤信息具體修改。
六、時序仿真
?時序仿真又稱為后仿真,后仿真之前需要把已打開的
?Modelsim
關(guān)閉!
點擊 [Tools] -> [Run Simulation Tool] -> Gate Leval Simulation
或者在工具欄點擊 Gate LevalSimulation
進行后仿真, 也就是門級仿真,如下圖所示。
彈出選擇時序模型對話框,可針對相應(yīng)情況具體選擇。此時可選擇第一個時序模型: 慢速工作、環(huán)境溫度為 85℃、 內(nèi)核供電 1.2V 的情況進行仿真, 如下圖所示。
時序仿真完成后, 可以在 Modelsim 的波形窗口中看到圖 2.2-23 的時序仿真波形。從波形中發(fā)現(xiàn)與之前的功能仿真相比有了一些差異,如: 「存在不希望存在的脈沖、 且在 200ns 時,led 相對輸入信號有一定時間的邏輯延時」。
七、IO 分配以及生成配置文件
IO 分配其方法不唯一,常用的有三種。 在標題欄中 Assignments—Pin Planner 或者直接單擊工具欄的 Pin Planner 進行 IO 分配, 如下所示。同時也可通過編寫 Tcl 文件的方式來實現(xiàn)引腳分配,此處需針對不同板卡進行不同的設(shè)置。
以芯路恒 AC620 開發(fā)板為例, 最終的引腳分配如下圖所示:
此處需注意, 在分配好引腳后,仍需再進行一次「全編譯才能使引腳分配生效」。
八、配置 FPGA 下載
單擊工具欄中的 Programmer, 如下圖所示,彈出以下對話框。確認連接好下載器并在 Hardware Setup 中選中 USB-Blaster 以及被下載的.sof
文件后, 單擊 Start 即可將設(shè)計好的邏輯電路下載到開發(fā)板中。
??
sof
文件是下載到FPGA,掉電即丟失;jic
文件是固化到FLASH中,掉電仍存在!
通過按鍵以及兩根杜邦線控制 P2 插接件下方的 GPIO0 (R1)以及 GPIO1(P2)接入不同的電平值, 可以觀測到 led 燈(LED0)具有不同的亮滅效果。
九、固化程序到FLASH中
9.1、FPGA 固件存儲方案介紹
Intel 或 Xilinx 的 FPGA 芯片,使用的是「基于 SRAM
結(jié)構(gòu)的查找表」,而 「SRAM 的一大特性就是掉電數(shù)據(jù)會丟失」,當使用 JTAG 將 SRAM 配置文件(.sof
)配置到 FPGA 芯片中后,這些數(shù)據(jù)是「直接存儲」在 SRAM 結(jié)構(gòu)的「查找表」中的,因此,一旦芯片掉電,則 SRAM 中的數(shù)據(jù)將丟失,再次上電后, SRAM 中將不再有有效的數(shù)據(jù)。 而「普通的 MCU 內(nèi)部集成了片上程序存儲器 ROM,即使掉電后也能保存程序」。 這也就是常見的,使用 JTAG 下載 SOF 固件到FPGA 中后,板子重新上電,則之前下載的固件又不在了的原因。
當系統(tǒng)設(shè)計完成并驗證結(jié)束后, 準備量產(chǎn)時,希望 FPGA 能夠永久保持電路固件,即讓FPGA 上電后其查找表中就被寫入有效的數(shù)據(jù)。但是又不能總是每次系統(tǒng)上電后就用 JTAG去下載一次程序固件。因此, FPGA 支持另外一種配置方式:「主動串行配置」(AS)。
所謂主動串行配置,就是在 FPGA 芯片外部放置一片「能夠掉電數(shù)據(jù)不丟失的存儲器」,例如最常見的 EPCS、 QFLASH、并口 FLASH
,來存儲設(shè)計好的電路固件。而 FPGA 芯片內(nèi)部,則設(shè)計了一個專用的硬件電路,在芯片剛上電時就主動去讀取存儲器中的固件,并配置到FPGA 芯片的每一個 SRAM 中去。通過這樣一種方式,可在不改變 FPGA 芯片 SRAM 工藝的查找表結(jié)構(gòu)前提下, 使得芯片每次上電后,都能獲得有效的配置數(shù)據(jù)。外部存儲電路配置信息的芯片稱之為「配置芯片」。
早前, 原 Altera 公司規(guī)定只能使用其自己發(fā)售的 EPCS 芯片作為外部配置器件,該 「EPCS 芯片實質(zhì)就是一個 SPI 接口的串行 FLASH 芯片」, 只不過是經(jīng)過了 Altera 的嚴格測試,性能優(yōu)異。而近些年,隨著芯片生產(chǎn)工藝的不斷發(fā)展,很多其他廠家生產(chǎn)的 SPI 接口的 FLASH 芯片也能夠達到 EPCS 的技術(shù)標準,因此 Altera 就放開了該限制,并指出可以使用其他芯片廠家生產(chǎn)的 SPI 接口的 FLASH 芯片代替 EPCS。在芯路恒的 AC620上就使用了一片「華邦公司生產(chǎn)的 16Mbit 的串行 FLASH 芯片 W25Q16 來作為配置芯片」。該芯片性能優(yōu)異,性價比較高,完全能夠達到 EPCS 的性能標準。
9.2、Cyclone IV E FPGA 固件燒寫方案
當需要將設(shè)計好的配置固件固化到該器件中時,有兩種方式。
- 第一種方式,也就是傳統(tǒng)的方式,是使用「專用 AS 接口」(與 JTAG 10 針接口獨立)來直接燒寫該配置芯片,該種方式需要在電路板上設(shè)置一個獨立的 AS 接口,占用 PCB 板面積較大,使用起來不方便。
- 第二種方式,也是現(xiàn)在流行的方式則是「通過 JTAG 接口」,經(jīng) FPGA 芯片間接燒寫配置芯片,其電路如下圖所示。 AC620 開發(fā)板沒有設(shè)計獨立的 AS 接口,因此只支持第二種燒寫方式。
9.3、燒寫文件 JIC 的產(chǎn)生
STEP #1
打開希望固化的 FPGA 設(shè)計工程, 此處以本節(jié)的工程為例。
STEP #2
在 Quartus Prime 軟件中點擊 File—>Convert Programming Files,如下圖所示:
STEP #3
在彈出的窗口中, Programming file type 選擇 JTAG Indirect Configuration File(.jic), Mode選擇 Active Serial, Configuration device 選擇 EPCS16, File name 默認是 output_file.jic,這里,我們養(yǎng)成良好的習(xí)慣,將其改成工程名字: led_test.jic, 如圖 2.3-3 所示。
STEP #4
在 Input files to convert 一欄中,點擊 Flash Loader 一項,在右側(cè)點擊 Add Device 選項,如下圖所示:
STEP #5
在上一步彈出的選項卡中,選擇 Cyclone IV E 下的 EP4CE10(AC620 開發(fā)板上的芯片為 EP4CE10F17C8,可根據(jù)實際情況進行選擇),然后點擊 OK,如下圖所示:
STEP #6
點擊 OK 后會回到先前的配置頁面,此時鼠標再次點擊 SOF Data,再點擊右側(cè)的 AddFile,如下圖所示:
STEP #7
在彈出的窗口中,在工程生成的output files文件夾下找到“key_filter.sof”文件,點擊Open,即可添加進來,如下圖所示:
STEP #8
點擊 Open 后,回到配置頁面,點擊 Generate 按鈕,如下圖所示:
STEP #9
點擊 Generate 按鈕后,軟件開始轉(zhuǎn)換文件,轉(zhuǎn)換成功后彈出成功提示窗口,如下圖所示:
STEP #10
點擊 OK 即可,然后 close 窗口。
STEP #11
打開 Quartus Pime 中的下載工具 Programmer,「將原有的 sof 文件移除」, 點擊 Add Files重新添加 Output Files 文件夾下的 led_test.jic 文件進來,勾選 Programming/Configuration,如下圖所示:
STEP #12
設(shè)置完成后,點擊 Start(確保此時下載器與開發(fā)板已經(jīng)正確連接),則軟件開始燒錄固件,整個燒錄時間大約花費 20 秒鐘左右。
燒錄完成后,此時固件已經(jīng)保存在了配置芯片中,「但是此刻 FPGA 還不能運行該固件,因為當前的固件是存儲在配置芯片中的,并沒有被配置到 FPGA 中,因此需要讓 FPGA 主動執(zhí)行一次從配置芯片中配置固件的過程」,方法很簡單, 「只需開發(fā)板斷電后重新上電即可」。
此時, 使用杜邦線分別接觸不同的電平值,就可以看到 LED 的狀態(tài)發(fā)生變化。斷電再上電,固件依舊保持,整個程序固化工作完成。