基于PGL22G的物聯(lián)網(wǎng)Sensor HUB設計
作者 黃國偉(福州大學(xué),福建 福州 350108)
本文引用地址:http://dyxdggzs.com/article/201901/397270.htm摘要:基于紫光同創(chuàng )PGL22G型號FPGA芯片,進(jìn)行OpenMIPS軟核的移植,使之成為MCU,在軟核中通過(guò)Wishbone總線(xiàn)進(jìn)行互聯(lián)。隨后,基于OpenMIPS架構進(jìn)行μC/OS系統的移植,在μC/OS系統下通過(guò)GPIO口進(jìn)行數據采集,并將采集到的存儲至EEPROM中,可通過(guò)電腦查詢(xún)EEPROM存儲的數據。通過(guò)相應的通信模塊進(jìn)行傳感器數據的發(fā)送。發(fā)送的數據可以在相應微信公眾號中實(shí)時(shí)查看。
關(guān)鍵詞:FPGA;OpenMIPS軟核;UC/OS II;移植
1 框架描述
1.1 MCU框架描述
OpenMIPS軟核的MCU整體框架如圖1所示,MCU主要由寄存器單元,協(xié)處理器單元,FSM單元,算術(shù)單元,數據單元構成[1]。寄存器單元包括針對32位指令格式的通用寄存器,針對乘除法運算結果的乘除法結果寄存器,程序計數器,存放OpenMIPS相關(guān)操作指令的指令寄存器。用于數據處理的算數模塊(包括四則運算和部分特殊的數據移位操作),數據選擇模塊;針對于五級流水線(xiàn)設計的狀態(tài)模塊,其構成與實(shí)現于下一段介紹;針對本設計使用的五級流水線(xiàn)還添加了協(xié)處理器模塊用于工作狀態(tài)的配置。
1.2 流水線(xiàn)框架描述
本設計的五級流水線(xiàn)框架如圖2所示,結合圖1的MCU架構圖可見(jiàn):首先通過(guò)取址模塊去獲取相應指令,與此同時(shí)程序計數器技術(shù)同狀態(tài)控制模塊數據交互后實(shí)現對于當前執行狀態(tài)的控制,通過(guò)譯碼模塊和32個(gè)通用寄存器的數據讀寫(xiě)實(shí)現指令的譯碼,將譯碼后的指令放入執行模塊進(jìn)行判斷后進(jìn)入相應的算數模塊實(shí)現相應的數據計算處理,通過(guò)放存模塊確定存入對應的寄存器地址,最終將結果放入對應的寄存器[2]。
2 SOPC實(shí)現原理
通過(guò)PGL22G構成MCU主體,搭載Wishbone總線(xiàn)實(shí)現與UART、Flash、GPIO等外部設備的數據交互。
2.1 五級流水線(xiàn)的實(shí)現
如圖2所示,五級流水線(xiàn)可以概括為取指、譯碼、執行、訪(fǎng)存、回寫(xiě),下面分別介紹五級各自實(shí)現原理。
取指階段是取出指令存儲器中的指令,同時(shí)程序計數器(以下簡(jiǎn)稱(chēng)PC)值遞增。PC中,因為一條指令是32位,而設計基于OpenMIPS的MCU是采用字節尋址的方式,由此每條指令對應4個(gè)字節,PC每次尋址結束后地址加4。在取指譯碼模塊間有取指譯碼模塊用于緩存取指階段的指令及其對應地址。
譯碼階段是指針對指令給出相應運算和操作的對應操作數,通過(guò)32位通用寄存器實(shí)現對指令的同時(shí)讀取和寫(xiě)入。譯碼模塊通過(guò)對通用寄存器的訪(fǎng)問(wèn)實(shí)現指令對應運算和操作的譯碼過(guò)程,將獲取到的指令譯出對應的源操作數送出。在譯碼和執行模塊間有譯碼執行模塊用于緩存譯碼階段給出的運算類(lèi)型,源操作數和對應訪(fǎng)問(wèn)寄存器的地址相關(guān)數據。
執行階段是對獲取到的源操作數進(jìn)行相應的指定運算,并將運算出的結果送入到運算訪(fǎng)存模塊進(jìn)行緩存。
訪(fǎng)存階段將執行階段的結果送入回寫(xiě)階段。
回寫(xiě)階段將相應的指令與那算結果寫(xiě)入對應地址的寄存器,由此完成一個(gè)周期五級流水線(xiàn)的操作。
2.2 指令存儲的實(shí)現
將FPGA設計為SOPC的初衷便是使用對應MCU指令集的編程方式減少對于設計人員的數字電路實(shí)現要求,指令存儲決定MCU對應運行指令的正確。結合對于FPGA資源的考慮以及對應MCU指令程序編譯燒寫(xiě)的便捷,使用外接SPI Flash作為ROM使之成為指令的存儲設備。
首先輸入對應Flash工作模式數據,然后通過(guò)計數器進(jìn)行計數實(shí)現地址數據的發(fā)送,當計數器停止即地址數據發(fā)送結束,此時(shí)DQ1管腳輸出所需數據,SPI Flash讀取數據仿真波形如圖3所示。
2.3 數據存儲器RAM的實(shí)現
通過(guò)pango軟件生成一個(gè)地址位寬為14的32位存儲器,寫(xiě)操作時(shí)根據sel的值修改其中對應的字節即可。由于系統中地址位寬為32,但針對數據存儲時(shí)所需要的地址寬為14,再結合指令加一即為移動(dòng)四位因此取系統地址位寬的第2~15位作為存儲器對應地址[3]。
2.4 協(xié)處理器的實(shí)現
協(xié)處理器用于系統控制,主要用于配置CPU工作狀態(tài),實(shí)現高速緩存控制,異常處理和控制,存儲管理單元控制。首先對協(xié)處理器中的寄存器進(jìn)行寫(xiě)操作,依次寫(xiě)入地址,將不同的數據保存到不同的寄存器中;依據讀取地址,將相應的寄存器值輸出即可。協(xié)處理器的訪(fǎng)問(wèn)指令只需遵循MIPS32指令集中的訪(fǎng)問(wèn)指令mtc0,mfc0即可。在譯碼階段依據指令讀出通用寄存器的值,在執行階段確定寫(xiě)入通用寄存器的值,將信息傳遞至訪(fǎng)存階段。訪(fǎng)存信息傳遞至回寫(xiě)階段,回寫(xiě)階段修改對應地址的寄存器值即可。
2.5 Wishbone總線(xiàn)的實(shí)現
Wishbone總線(xiàn)有多種連接方式:點(diǎn)對點(diǎn)、數據流、共享總線(xiàn)、交叉互聯(lián)等。在點(diǎn)對點(diǎn)連接方式中,有一個(gè)主設備和一個(gè)從設備。
通過(guò)狀態(tài)機來(lái)實(shí)現Wishbone的操作和控制。復位的時(shí)候進(jìn)入空閑狀態(tài)WB_IDLE。當處于空閑狀態(tài)WB_IDLE時(shí),如果處理器發(fā)出了訪(fǎng)問(wèn)請求,且當前沒(méi)有處于流水線(xiàn)清除過(guò)程中,那么會(huì )進(jìn)入總線(xiàn)忙狀態(tài)WB_BUSY,開(kāi)始訪(fǎng)問(wèn)總線(xiàn)。但是,如果處于流水線(xiàn)清除過(guò)程中,那么本次的總線(xiàn)訪(fǎng)問(wèn)當然會(huì )無(wú)效,所以不必進(jìn)入WB_BUSY狀態(tài)。當處于總線(xiàn)忙狀態(tài)WB_BUSY時(shí),如果收到Wishbone總線(xiàn)的響應,表示本次訪(fǎng)問(wèn)結束,此時(shí)需要判斷流水線(xiàn)是否處于暫停狀態(tài)。如果沒(méi)有處于暫停狀態(tài),那么將訪(fǎng)問(wèn)到的數據送入處理器,進(jìn)入空閑狀態(tài)WB_IDLE,等待下一次訪(fǎng)問(wèn)請求。如果處于暫停狀態(tài),那么將訪(fǎng)問(wèn)到的數據暫時(shí)保存起來(lái),同時(shí)進(jìn)入等待暫停結束狀態(tài)WB_WAIT_FOR_STALL。當流水線(xiàn)暫停結束時(shí),再將訪(fǎng)問(wèn)到的數據送入處理器,并且進(jìn)入空閑狀態(tài)WB_IDLE,等待下一次訪(fǎng)問(wèn)請求。當處于總線(xiàn)忙狀態(tài)WB_BUSY時(shí),如果發(fā)生異常,那么會(huì )清除流水線(xiàn),此時(shí)將直接取消此次Wishbone總線(xiàn)訪(fǎng)問(wèn),并且回到狀態(tài)WB_IDLE。
2.6 UART和GPIO的實(shí)現
UART將并行的數據轉變?yōu)榇械臄祿l(fā)送,或將接收到的串行數據轉變?yōu)椴⑿袛祿?。通過(guò)串口可以實(shí)現與計算機或其他設備的通信。在PGL22G開(kāi)發(fā)板上有串口轉USB模塊,UART模塊控制是OpenCores站點(diǎn)提供的UART IP Core,其兼容常見(jiàn)UART設備;支持Wishbone數據規范。
GPIO是以位為單位進(jìn)行數字輸入輸出的I/O接口,作為單純通用輸入/輸出I/O,輸入時(shí)從外部讀取輸入信號,輸出時(shí)將寫(xiě)入的值輸出到外部。處理器通過(guò)GPIO與其他外設相連。GPIO控制是OpenCores站點(diǎn)提供的GPIO IP Core,其I/O口數量從1到32可配置;所有I/O口可以配置為雙向接口;輸入接口可以觸發(fā)中斷;支持Wishbone數據規范。
3 μC/OS系統的移植
借鑒μC/OS-II在其他MIPS架構處理器上移植的代碼進(jìn)行修改,在Linux中下載版本號為V2.91的μC/OS-II源碼以及針對MIPS M14K的μC/OS-II移植代碼[4]。去掉includes目錄下無(wú)需使用的cpu.h文件。os_cpu.h中的文件定義了處理器相關(guān)的常量、宏、結構體,這里可以完全使用MIPS M14K的移植代碼,無(wú)需修改。os_cpu_a.S文件異常處理樣例,和一些入堆棧使用的常數,以及一些函數。將OS_CPU_SR_Save中的Status寄存器的最低位修改為0;DisableInterruptSource中的函數對應的Status寄存器中IM字段指定為修改為0。修改os_cpu_c.c文件,將新任務(wù)的入口地址task存放到堆棧中對應證書(shū)寄存器$31的位置[5];將BSP_Interrupt_Handler函數中的Compare寄存器的值增加0x50000,因為本次系統的頻率為27 MHz,為保證中斷是在12 ms個(gè)時(shí)鐘周期內發(fā)生。將修改后的文件進(jìn)行編譯,最終得到相應的.bin文件,與BootLoader.bin合并后得到相應的.bin文件,將.bin文件燒入SPI Flash中,當OpenMIPS運行時(shí)會(huì )首先運行BootLoader,后者將μC/OS-II的代碼復制到RAM中,然后跳轉到RAM,最終控制權交由μC/OS-II,由此實(shí)現了μC/OS系統的移植和運行。
4 結論
本設計基于紫光PGL22G FPGA開(kāi)發(fā)板實(shí)現了OpenMIPS內核的MCU移植,實(shí)現了操作系統μC/OS-II的移植使之構成SOPC系統增加系統的靈活性和穩定性。實(shí)現了傳感器的數據采集(常見(jiàn)的數字信號和模擬信號的傳感器均可拓展實(shí)現數據采集,由此實(shí)現Sensor HUB),以及數據的本地存儲和訪(fǎng)問(wèn)。通過(guò)通信數據實(shí)現了數據的上傳發(fā)送,同時(shí)可以在微信公眾號中進(jìn)行數據的查詢(xún)。
在本設計中還有一些可以改進(jìn)的地方:首先,OpenMIPS架構具有一定的缺陷,我們可將本設計的架構改為RISC-V架構。該架構開(kāi)源,可以拿到全部的源代碼進(jìn)行裁剪或修改以實(shí)現我們的需求。此外,該架構以運算為核心,在大數據上和人工智能上具有無(wú)可比擬的優(yōu)勢。其次,在存儲上可用DDR存儲器來(lái)替代EEPROM,因為DDR存儲器具有速度快、存儲量大等等的優(yōu)勢。最后,可接入更多種類(lèi)不同的傳感器,真正實(shí)現sensor HUB的主題。
參考文獻
[1]蔡啟先,劉明,余祖峰.MIPS64指令集模擬器的建模與實(shí)現方法[J].計算機工程,2010,(18):245-246.
[2]劉秋菊,張光照,王仲英.基于MIPS指令集的流水線(xiàn)CPU設計與實(shí)現[J].實(shí)驗室研究與探索,2017,(8):148-152.
[3]雷思磊. 自己動(dòng)手寫(xiě)CPU[M].電子工業(yè)出版社,2014.
[4]陶銳,李洋,曹海燕.基于A(yíng)RM7內核的UCOS-Ⅱ移植研究[J].企業(yè)技術(shù)開(kāi)發(fā),2012,31(05):68+74.
[5]李備,彭楚武,譚凌峰,陳敬恩.UCOS移植中的硬件抽象層構建技術(shù)[J].電子產(chǎn)品世界,2006(16):93-94+92.
作者簡(jiǎn)介:
黃國偉(1994-),男,研究生,主要從事嵌入式系統的研究。
本文來(lái)源于科技期刊《電子產(chǎn)品世界》2019年第2期第45頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處
評論