目前,xilinx的zynq系列FPGA炒的火熱,SOC成為FPGA發展的必然趨勢。可見所有功能均用硬件描述語言設計是不科學的。硬件邏輯獨有的並行性使其在實時處理和並行算法中占盡優勢,但當執行串行操作時卻需要使用笨重的狀態機來完成。因此,要實現對實時性要求不高的串行操作,對各類IP核的總體控制調度,亦或是快速移植軟件協議棧時,利用FPGA內部CPU是個比較好的選擇。
硬核CPU只在特定系列FPGA芯片中,性能當然沒的說,占用的資源也非常少。但相比硬核,microblaze可移植性較強,性能要求不高的場合下還是非常靈活的。本文依然以經典的串口打印字符串“hello,world”為例,搭建基於microblaze的簡單嵌入式系統。
create block design,添加microblaze軟核后點擊Run Block Automation。
這里暫時不使用DDR之類的緩存設備,利用片內Memory存儲代碼,因此將Local Memory容量增大。
點擊OK后工具自動生成CPU系統所需要的所有必要硬件模塊,包括:時鍾管理單元,復位邏輯,調試模塊,microblaze CPU,以及local memory。
雙擊clk_wiz_1模塊,根據開發板對其進行配置。本例中開發板上使用200MHz差分晶振作為時鍾源,做如下改動。
開發板上復位按鍵低電平有效,改為Active low。
實現串口打印字符串功能,首先得有串口模塊提供硬件支持,添加uartlite IP核。串口IP核同樣可以根據需求重配置,這里保持默認設置:波特率9600,數據位是8bit,無校驗位。
IP核添加並配置完畢,同樣利用工具自動連接。點擊Run Connection Automation,選中所有可連接選項。重新布局后嵌入式硬件系統結構如下:
點擊左側豎排工具欄中的Validate Design,保證系統沒有連接錯誤。
右擊Source窗口中block design名稱,依次選中Generate Output Products和Generate HDL Wrapper。前者生成可綜合,布局布線的.v文件,后者產生工程頂層封裝。
需要注意的是,生成頂層文件時,可以選擇頂層文件自動更新或手動編輯。當需要手動添加硬件模塊到頂層文件時選擇可手動編輯方式,這里保持默認。
之后添加XDC文件,給出引腳號及電平標准即可。
此時與HDL設計流程相同,綜合、布局布線和生成比特流。點擊vivado界面上側主選項欄File->Export->Export Hardware。這里要選中Include bitstream,否則SDK中無法識別硬件系統。最后點擊File->Lanch SDK啟動軟件開發工具,開始軟件設計流程。建立第一個軟件工程時會自動生成BSP包,相當於硬件系統中物理約束了的映射,之后可重復利用,還是比較方便的。
打開HelloWorld工程中.c文件,其中有三個函數,其實是對串口一些操作的封裝。
這了為了方便觀察現象,將串口打印函數放置在while循環中,使其連續打印字符串。保存后代碼自動編譯。
選中工具欄Xilinx Tools->Program FPGA下載代碼。此處在下方選擇生成的HelloWorld.elf可執行文件,將硬件比特流和軟件代碼同時下載到FPGA中。
打開串口調試助手,設置好波特率以及顯示格式,可以看到不斷打印“Hello World”字符串。
本文搭建了基於Microblaze的最簡單的嵌入式系統,對IP Integrator和SDK環境有了初步的認識。在后續的博文中,會進一步闡述自定義總線形式IP核的生成,調用以及與CPU之間的數據交互。