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