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