(一)手把手教你如何通過ARM DesignStart計劃在FPGA上搭建一個Cortex-M3軟核
一、ARM DesignStart計劃
1.1 如何下載ARM DesignStart Cortex-M3相關(guān)文件
? 關(guān)于ARM DesignStart計劃的介紹:ARM DesignStart計劃——私人定制一顆ARM處理器 - 知乎 (zhihu.com)。
? 在arm Developer官網(wǎng)[Arm Developer](https://developer.arm.com/downloads)右上方的Downloads中搜索ARM DesignStart Cortex-M3第一個即是FPGA上定制的Cortex-M3軟核IP。
? 以下是我從官網(wǎng)下載的Cortex-M3的百度網(wǎng)盤鏈接,M0也是同樣的方法:https://pan.baidu.com/s/1jO1cTTL89xig5wEomUTrlQ?pwd=1234。
? 上面我廢話了兩句是因為我一開始在官網(wǎng)主頁中直接搜索ARM DesignStart Cortex-M3一直找不到軟核工具包,只能找到相關(guān)的用戶說明書,Cortex-M3軟核IP要到Downloads才能找到??傊俏宜阉鞣绞讲粚Φ脑颍o大家避個坑。
1.2 Cortex-M3 DesignStart Eval工具使用介紹
? 在arm Developer官網(wǎng)主頁面中直接搜索Arm Cortex-M3 DesignStart Eval User Guide可以找到Cortex-M3軟核IP的相關(guān)用戶使用手冊。
? 在該用戶使用手冊文件的1-17頁有具體的文件結(jié)構(gòu)說明。其中我們用到的我覺得比較重要的是Cortex-M3內(nèi)核文件夾,在下圖1.5路徑中:
在cmsdk(Cortex-M System Design Kit,Cortex-M系統(tǒng)設(shè)計工具包)文件夾中,有著大量官方提供的現(xiàn)成的MCU實現(xiàn)組件,像串口、定時器等外設(shè),ahb、apb總線接口,經(jīng)過封裝的FPGA內(nèi)部sram存儲器等,這些組件都是由verilog代碼實現(xiàn)的。如下圖1.7所示:
? 另外一個很常用的用戶使用手冊是Arm Cortex-M System Design Kit Technical Reference Manual,可以直接在官網(wǎng)主頁搜索得到。這個用戶手冊中有很大一部分是對cmsdk工具包文件夾中的系統(tǒng)組件的說明,例如對上圖1.7中cmsdk_apb_uart
和cmsdk_apb_time
這兩個由verilog代碼實現(xiàn)的外設(shè)IP的寄存器構(gòu)成、時序邏輯等都在該文檔中有詳細(xì)說明。在我們的系統(tǒng)實現(xiàn)中,我就是對著這個文檔對gpio、uart和timer這三個外設(shè)編寫的軟件驅(qū)動。該文檔的具體內(nèi)容如下圖1.8所示:
如上圖可以看到定時器外設(shè)的寄存器地址偏移、位寬、描述等,除此之外還有模塊端口信號,特征描述等。
二、如何搭建軟核
? 在搭建SoC系統(tǒng)的過程中碰到過許多問題查閱了許多資料,這里就不一一詳細(xì)說明了,我把查閱過的視頻和資料都列出來:
-
使用Keil設(shè)計基于ARM DesignStart M3軟核的軟件程序_嗶哩嗶哩_bilibili
該視頻前半段是在VIVADO上搭建硬件資源,后半段在配置KEIL,因為我們是在安路的平臺上搭建,因此跳過了前面的部分,看的是后半段的KEIL配置以及代碼編寫,主要是實踐操作性。
-
使用CMSDK搭建CortexM3SoC - 極術(shù)社區(qū) - 連接開發(fā)者與智能計算生態(tài) (aijishu.com)
這篇文章可以結(jié)合著下面的極術(shù)社區(qū)的視頻一起看,主要寫了:
- 使用CMSDK生成總線矩陣,這部分比較復(fù)雜,主要就是給主從設(shè)備分配端口和地址,具體怎么操作我不太懂是我隊友做的。
- 硬件上添加CMSDK APB外設(shè),文中以uart為例如何將外設(shè)模塊端口信號和APB總線相連,連接至AHB總線上也大同小異。
- 自定義外設(shè),簡要地講解了如何編寫外設(shè)硬件代碼和完成外設(shè)軟件驅(qū)動。
- 最后給出了一份硬件和軟件上的參考范例。
-
極術(shù)公開課|【集創(chuàng)賽培訓(xùn)】基于Arm Cortex M3的SoC設(shè)計與FPGA實現(xiàn)_嗶哩嗶哩_bilibili
這是往年集創(chuàng)賽ARM杯的培訓(xùn)視頻,很有必要看一遍,看完之后可以對整個軟核的搭建有一個清晰的概念,主要偏向理論性并給出整體框架概念。
-
GitHub - ian-lab/my_CortexM3
一個開源GitHub項目,是一個完整的Cortex-M3的SoC系統(tǒng)范例。
-
目錄 - Arm Cortex-M0的SoC實現(xiàn) (yuque.com)
硬木課堂知識庫,其中一個章節(jié)就是Arm Cortex-M0的SoC實現(xiàn),基于安路EG4S20。這幾篇文章兼有理論和實踐,理論上如總線的知識、SoC的組成等,對在大腦中構(gòu)建一個整體SoC概念很有幫助。實踐上這篇文章手把手教你硬件代碼如何編寫,KEIL上如何配置等等。但是因為這篇文章是用匯編語言進(jìn)行軟件編寫的,因此在我比賽過程中就沒有參考。另外這些文章中提到的下載的文件都沒有,不用找和問了。
三、總體架構(gòu)
3.1 整體架構(gòu)展示
? 本系統(tǒng)的系統(tǒng)框圖如圖3.1。在基于ARM DesignStart計劃開放的Eval版ARM Cortex-M3軟核搭建片上系統(tǒng),硬件主要模塊包括(圖中的ACC硬件加速器實際上還沒有):
- ARM Cortex-M3處理器內(nèi)核;
- 一、二級AHB系統(tǒng)總線和二級APB系統(tǒng)總線;
- 總線間接口和總線與外設(shè)間接口;
- 掛載在AHB和APB總線上的外設(shè):
- 由FPGA片上BRAM實現(xiàn)的程序和數(shù)據(jù)存儲器ITCM和DTCM;
- 片上功能外設(shè),包括串口UART,GPIO,定時器TIMER,外部SDRAM,F(xiàn)LASH;
- SWD調(diào)試接口;
- 外部SDRAM與總線之間的高速緩存Cache。
? 以上系統(tǒng)框圖以及頂層代碼的排布都是按照系統(tǒng)地址遞增的順序排列的,為的是能有更清晰的邏輯,下面是整個系統(tǒng)的地址層次。
? Cortex-M3的總線位寬為32位,因此提供了4GB的存儲器尋址空間。在我們設(shè)計的片上SOC中,具有片內(nèi)RAM,片外SDRAM和外設(shè)驅(qū)動層電路,因此具有靈活的地址映射和尋址方式。具體的地址空間映射如下圖3.2所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-764613.html
3.2 頂層文件代碼分析
? 我們的所有工程都會上傳到我的github倉庫,后期也會不斷做修改:JimmyForest · GitHub。以下是我對著頂層文件進(jìn)行的代碼分析,簡單講述了搭建軟核的思路以及軟核的框架結(jié)構(gòu):文章來源地址http://www.zghlxwxcb.cn/news/detail-764613.html
- 最開始的一個GLOBAL BUF(這個在我們的代碼的注釋中,以下的都是)是對全局時鐘走線的處理,走全局時鐘網(wǎng)絡(luò)的信號具有低偏斜、低抖動以及高扇出的特點。
- 接下來是DEBUG IOBUF對調(diào)試接口的三態(tài)處理,因為安路中找不到相應(yīng)的三態(tài)原語,因此就用了
1'bz
代替。 - 后面兩個是全局復(fù)位的處理。
- 接下來的
cortexm3ds_logic
模塊是官方提供的Cortex-M3內(nèi)核,即圖3.1中的Cortex-M3 Core,為整個系統(tǒng)的中央CPU。該模塊的底層代碼由大量的assign語句構(gòu)成,且所有信號均由無規(guī)律的字母和數(shù)字組成無實際含義,因此具有很差的可讀性。另外該內(nèi)核主要有三大主機(jī)接口與一級AHB總線相連接,分別是I_bus(Instructions)指令總線,D_bus(Data)數(shù)據(jù)總線和SYSTEM_bus系統(tǒng)總線。前兩個分別是內(nèi)核與ITCM和DTCM交互分別取指和數(shù)據(jù)讀寫,系統(tǒng)總線還不是很懂,CSDN上有說法是這條總線用來加載外設(shè)。 - 在內(nèi)核模塊的后面是一級AHB稀疏總線矩陣
L1AhbMtx
,這是AHB總線的核心部分。該模塊包含多個子模塊,其中包括多個仲裁器、地址譯碼器、從機(jī)的輸入級和主機(jī)的輸出級模塊(后面兩個什么意思和功能我不懂,是根據(jù)注釋翻譯的)。相比于后面的二級AHB總線模塊這是一個完整的總線模塊,擁有總線的完整功能,可以通過在第二點中2、3兩小點中提供文章和視頻提供的方法進(jìn)行生成。 - 在一級AHB總線矩陣模塊下面的是
ahb_eram
,此處的eram也即可理解為BRAM即為塊狀(BLOCK)RAM,利用大塊的RAM作為ITCM指令存儲空間。之前采用分布式SRAM作為ITCM的存儲空間導(dǎo)致存儲資源不夠是因為SRAM的本質(zhì)是LUT查找表,LUT較適合用于小容量的存儲和邏輯電路的綜合,對于大容量的存儲使用SRAM效率十分低下。 - 在ITCM下面的是
cmsdk_ahb_to_sram
,這個并不是DTCM存儲器SRAM,而是AHB總線和DTCM的接口層。下面的cmsdk_fpga_sram
才是DTCM的SRAM實例化模塊。這里采用分布式SRAM是因為在KEIL中配置ITCM和DTCM時。ITCM大小為64kb bit,DTCM大小為16kb bit。因此DTCM大小較小采用了分布式RAM實現(xiàn)。 - 接下來的是APB總線部分,首先是APB與AHB的接口模塊
cmsdk_ahb_to_apb
。后面是APB總線的核心部分cmsdk_apb_slave_mux
,根據(jù)名字看mux是多路選擇器,但模塊內(nèi)部不僅包含了從機(jī)多路選擇器還包含了地址譯碼器。因為APB總線是單主機(jī)結(jié)構(gòu)因此不存在仲裁器。具體的總線內(nèi)容放到下一篇文章。 - 再下面是兩個掛載在APB總線上的外設(shè),串口和定時器。前面APB總線的地址譯碼器決定了兩個外設(shè)的基地址。
- 在APB后面的是二級AHB總線,和APB總線一樣,AHB與AHB總線之間有一個同步橋模塊
cmsdk_ahb_to_ahb_sync
,是一級AHB總線和二級AHB總線之間的數(shù)據(jù)指令同步接口模塊。 - 在同步橋下面是
AHBlite_Interconnect
,AHBlite是只AHB總線的簡化版本,AHB支持多主機(jī)而AHBlite僅支持單主機(jī),因此AHBlite在AHB總線的基礎(chǔ)上可以簡化仲裁器等大量的控制信號。例如在該系統(tǒng)中一級AHB總線是二級AHB總線的主機(jī),在二級AHB總線下可以掛載多個外設(shè)。AHB的AHBlite_Interconnect
模塊和APB的cmsdk_apb_slave_mux
一樣也是由地址譯碼器和多路選擇器組成。 - 在二級AHB總線下面是三個掛載在總線上的外設(shè)GPIO、LCD和FLASH。最后在一級AHB總線上單獨(dú)掛載了一個外設(shè)外部SDRAM,不掛載在二級AHB總線上是為了提高外部SDRAM的數(shù)據(jù)讀寫效率。數(shù)據(jù)經(jīng)過總線的讀寫會造成時鐘延遲降低數(shù)據(jù)的傳輸效率。
- 在頂層文件的代碼最后一行一個
assign
語句是系統(tǒng)中斷,IRQ
信號的位寬大小為240表示該系統(tǒng)最大可以支持240個自定義的外部中斷。如在該系統(tǒng)中就有定時器中斷,GPIO1的中斷等等。
到了這里,關(guān)于(一)手把手教你如何通過ARM DesignStart計劃在FPGA上搭建一個Cortex-M3軟核的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!