
在電子技術飛速發展的今天,熟練使用相關工具軟件是學習SoC的必經之路。但是,由於SoC是一個完整的系統,既包含處理器核、總線、外設等硬件,也包含處理器需要執行的指令,所以對於“軟件編程”和“硬件編程”的概念必須要區分清楚。關於“軟件編程”和“硬件編程”的概念在很多基礎課程(如C語言、數字設計等課程)中已有介紹,但在學習SoC時,由於“軟件編程”和“硬件編程”的概念“混”在一起,並且一開始不熟悉工具軟件,可能會感覺難以上手。
本文介紹在使用Arm DesignStart計划開放的處理器核搭建SoC並通過FPGA實現的過程中所用工具軟件(不介紹如何操作),理清“軟件編程”和“硬件編程”的概念,熟悉SoC設計的流程。
軟硬件關系
在搭建SoC的過程中需要使用的工具軟件有Modelsim,Vivado,Keil,實現流程如下圖。

我們通過Arm DesignStart獲取的是一個Verilog語言描述的軟核,我們通過添加一些IP實現一個完整的描述SoC的工程。這些IP可以是用IP工具生成的,也可以是我們通過硬件描述語言(Verilog/VHDL)描述的。
Vivado負責將硬件描述語言(Verilog/VHDL)所描述的SoC編譯、綜合、實現,將FPGA內部本身無序的各種邏輯資源(如查找表、觸發器、RAM等)配置成為有序的電路,實現SoC功能。而Keil負責將編寫的軟件編程語言(C/Assembler)編譯成為機器碼十六進制文件。將機器碼作為RAM的初始化內容,即可進行仿真,在Modelsim軟件中觀察SoC工作時各個信號的波形。若將機器碼通過工具下載到由FPGA實現的SoC中,那么就可以讓SoC執行編寫的程序,通過FPGA開發板觀察執行結果。
從流程中也可以理解“軟件編程”和“硬件編程”的區別,“軟件編程”編的其實是一條條的指令,描述的是硬件的“動作”,而“硬件編程”編的是一個個的門電路和它們的連接關系,描述的是是硬件的結構。
以下對這三個工具做詳細的介紹。
Modelsim
Modelsim主要用於硬件描述語言(Verilog,VHDL等)的仿真,並且支持VHDL和Verilog混合仿真。仿真分為前仿(RTL級仿真)和后仿(綜合后門級仿真),這里使用Modelsim仿真屬於前仿,也就是功能仿真,主要目的是通過看輸出波形圖,驗證硬件邏輯是否正確。
Modelsim既可以獨立使用,也可以和Intel Quartus Prime,Xilinx Vivado軟件協同使用。
在官網上可以下載免費版本。
Vivado
Vivado是一個用於FPGA實現的綜合工具,由FPGA廠商Xilinx提供,如果使用Intel(Altera)公司的FPGA,需要使用Quartus Prime軟件。
從前述內容中知道,Vivado負責將硬件描述語言(Verilog/VHDL)所描述的SoC編譯、綜合、實現,將FPGA內部本身無序的各種邏輯資源(如查找表、觸發器、RAM等)配置成為有序的電路,實現SoC功能。
Vivado的軟件界面如下圖。最上方為工具欄,左側為設計流程各個的步驟,中間是文件管理和代碼編輯的區域,下方為調試信息和輸出的一些報告,使用時需注意閱讀,以免被一些只報warning但很“神奇”的錯誤坑了。

Keil
Keil MDK是用於一系列基於Arm Cortex-M的微控制器設備的一個完整的軟件開發環境。界面如下圖所示,與Xilinx Vivado軟件類似,主界面也是由工具欄、工程目錄、代碼編輯、調試信息組成。Keil軟件的主要作用是將C語言/匯編語言寫的程序編譯成機器碼,在進入調試模式時,通過調試器下載機器碼到RAM中,CPU啟動后,開始一條條地從存儲器中取指執行。

調試界面可以看到的信息更多,包括執行過程中的寄存器狀態信息、反匯編代碼,還可以通過右下角的窗口看到運行過程中系統內部一些信號的值,如下圖。調試過程中可以設斷點,也可以單步運行。

從圖中可以看出,Vivado負責將硬件描述語言(Verilog/VHDL)所描述的SoC編譯、綜合、實現,將FPGA內部本身無序的各種邏輯資源(如查找表、觸發器、RAM等)配置成為有序的電路,實現SoC功能。而Keil負責將編寫的軟件編程語言(C/Assembler)編譯成為機器碼十六進制文件。將機器碼作為RAM的初始化內容,即可進行仿真,在Modelsim軟件中觀察SoC工作時各個信號的波形。若將機器碼通過工具下載到由FPGA實現的SoC中,那么就可以讓SoC執行編寫的程序,通過開發板觀察程序的運行結果。
安裝流程
安裝流程以vivado 2018.2為例(其他版本安裝過程是類似的)。
1.打開下載好的安裝包,找到xsetup,雙擊啟動安裝過程。
開始安裝過程
2.Welcome界面直接點擊Next跳過。
直接跳過
3.相關條款選擇“I Agree”,之后點擊Next繼續。
經典 I Agree
4.選擇安裝版本時,選擇Vivado HL System Edition進行安裝。
選擇 System Edition
5.這一步將會遇到一些可選的安裝選項,在Devices欄下,需要選擇7 Series,或者按照默認的選項繼續下一步也可以。當然,如果不需要使用其他系列的FPGA的話,也可以把除了7 Series以外的器件前面的勾叉掉,同時為了進一步節約存儲空間,也可以選擇不安裝Design Tools欄下的Software Development Kit(SDK),這樣選擇的話需要的磁盤空間大約只有12GB。
按需選擇需要安裝的器件
6.選擇安裝路徑,注意路徑中不能含有中文,然后確認進入下一步。
選擇安裝路徑
7.最后一步便是確認之前的選擇和設置,確認無誤后點擊Install開始安裝。
之后便是一段時間的等待,建議這種時候玩會游戲,負罪感沒那么強(不要問我怎么知道的)。
8.安裝完成后打開Vivado,在Help菜單欄下選擇Manage License打開。
打開License Manager
9.在License Manager左側的Get License欄下選擇Load License,然后點擊Copy License,在彈出的對話框中選擇Lincese文件(VivadoLicense.lic),點擊打開。
選擇License
最后顯示成功,點擊確定即完成安裝操作。
Done!
此處附上安裝軟件的視頻。
新建工程
在軟件安裝完成后,雖然已經躍躍欲試,但是根據本人剛開始學習時的經(jiao)驗(xun),越是心急的時候,越要冷靜下來按步驟完成操作,不然可能會弄糟自己學習新東西時愉快的心情。
為了提高學習新工具時的舒適程度,本文以一個簡單流水燈的工程為例,介紹從新建工程開始,到下載到板上並觀察現象的整個流程。
1.首先打開安裝好的Vivado軟件,可以看到如下界面,在Quick Start一欄里點擊Create Project開始創建一個新的工程。
2.第一個界面是介紹界面,直接跳過
3.設置工程名稱及存儲路徑,注意不能含有中文。
4.選擇工程類型時,選擇第一項RTL Project,然后繼續。
5.添加源文件時點擊Create File,在彈出的對話框中選擇源文件類型為Verilog文件,輸入文件名后點擊OK。最后點擊Next進入下一步。
6.添加管腳約束文件時和添加源文件類似,點擊Create File,在彈出的對話框中輸入文件名后點擊OK。最后點擊Next進入下一步。
7.選擇器件時,在搜索框中輸入xc7a75tfgg484,在下方選擇xc7a75tfgg484-2一項,然后點擊Next進入下一步即可。
8.最后確認前面所選擇的信息都無誤后,點擊Finish即可完成工程的創建。
Vivado界面介紹
在介紹Vivado的界面前,首先需要說明一下FPGA開發的基本流程,以便更好地掌握工具的使用。
基本流程如下圖,首先編寫RTL級代碼,接着編寫TestBench后在Modelsim里觀察波形,如果有bug就進行分析修改。在debug結束后,即可在Vivado中新建工程,通過邏輯綜合工具得到門級網表,之后進行門級功能驗證,同樣的,如果有bug就分析修改並重復之前的步驟。Debug結束后可以對模塊的端口進行管腳約束,並啟動Vivado的布局布線工具,最終可以生成比特流下載到FPGA板上觀察現象。
FPGA開發流程
Vivado左側的側邊欄中有很多功能,其中Project Manager欄下的功能主要用於工程管理,包含工程設置(綜合、實現設置,以及一些常規的如編輯器界面設置等),添加文件以及調用IP的入口(IP Catalog)。
Vivado側邊欄
IP Integrator下的功能主要是用於block design,這種方法可以在框圖中添加IP,並將端口連線。Simulation主要用於仿真,但是本人一般選擇更輕量級的Modelsim進行仿真,下一篇文章也會詳細介紹Modelsim。RTL Analysis提供查看RTL原理圖的入口,在Open Elaborated Design下點擊Schematic下可以查看。
Synthesis對RTL代碼進行綜合,將RTL代碼轉化為網表,RTL代碼中如果有語法問題,這一步就會報錯,同時,綜合工具報告中的warning也是值得注意的,經常會有手誤但是能綜合通過的情況,所以一定要仔細查看綜合報告。完成了綜合過程之后,才可以約束管腳。
管腳約束主要有2種方式,第一種是可視化的,第二種是編寫管腳約束文件。可視化的方式如下圖,綜合完成后首先在側邊欄中選擇Open Synthesis Design,然后在右上角標示處選擇IO Planning,最后在下方IO Ports欄下變可以看到信號名及對應的管腳編號(由於已經通過編寫管腳約束的方式分配了管腳,所以可以在Package Pin處看到對應的管腳編號)。編寫管腳約束文件的方式將在下一節進行介紹。
可視化管腳約束界面
Implementation主要包含布局布線兩個過程,布局主要將綜合后的基本單元放到FPGA中合適的位置,而布線則是將這些基本單元連接起來。在這一步中也可以檢查器件資源是否足夠,IO電平設置是否正確。實現完成后點擊Open Implementation Design也可以看到布局布線的結果,如下圖。
實現界面
Program and Debug主要用於下載比特流文件到FPGA板上對FPGA進行配置,調試功能主要結合Vivado的ILA(Integrated Logic Analyzer),調試功能一般在很復雜的設計中才會用到,在工程中遇到了再進行詳細的介紹。
代碼編寫及生成比特流
在建立好工程之后,接下來便需要編輯RTL代碼和管腳約束文件。畫紅圈的部分為工程文件目錄管理,在Design Source欄下存放的便是設計文件,雙擊test.v,即可在右冊代碼編輯區中進行編輯。
編輯test.v
編輯完成test.v並保存后,在Constraints下雙擊pin.xdc,編輯完成后保存。
編輯pin.xdc
接着在左下角的PROGRAM AND DEBUG一欄下點擊Generate Bitstream開始生成比特流,在彈出的對話框中選擇Yes即開始。這里生成比特流時會先進行綜合和實現過程,綜合是把RTL代碼生成網表的過程,而實現主要包含布局布線兩個過程,布局主要將綜合后的基本單元放到FPGA中合適的位置,而布線則是將這些基本單元連接起來,最后生成比特流用於配置FPGA。
生成比特流
選擇啟動選項時,保持默認點擊OK即可。
默認啟動選項
在比特流生成完成時,會彈出如下對話框,選擇Open Hardware Manager后點擊OK即可完成比特流生成過程,下一步需要將FPGA板與PC連接,以下載比特流到FPGA板並觀察。
成功生成比特流后打開Hardware Manager
此處附上新建工程到生成比特流的視頻。(注:視頻中選擇的FPGA芯片型號與文中有所不同,以文中介紹為准)
下載並觀察現象
在進行接下來的步驟前,請確保FPGA板已與PC連接。
打開Hardware Manager以后,在上方HARDWARE MANAGER處點擊Open Target,然后點擊Auto Connect。
連接FPGA板
之后在同樣的位置點擊Program Device,Bitstream File一欄為默認,文件名與工程名相同,后綴為.bit,最后點擊Program,完成后即可在FPGA板上觀察到現象。
下載比特流到FPGA板
此處附上下載比特流到FPGA板的操作視頻。(注:視頻中選擇的FPGA芯片型號與文中有所不同,以文中介紹為准)
之后便可以在FPGA板上觀察到流水燈的現象。