文獻標識碼: A
文章編號: 0258-7998(2014)12-0023-04
0 引言
ARM微處理器具有高性能、低功耗特點,市場占有率上ARM微處理器超過了75%,其產品從最初的單核ARM7發展到現在的多核Cortex R系列,相應的指令集從最原始的ARMv1到現在的ARMv8。每一種指令集都是在前一種指令集的基礎上增加若干指令用于提升性能,這樣微處理器保持了良好的向下兼容特性,用于低端芯片的工程可以完美地移植到高端的芯片上,具有良好的繼承性。其中ARMv4是第一次用于商業芯片的指令集,因而ARMv4是ARM微處理器指令發展源泉。對于ARM微處理的研究國內目前主要集中在應用軟件上,通過ARM微處理器設計了一段什么樣的代碼,完成了什么樣的功能[1-2],而對于微處理器自身的研究較少。參考文獻[3]利用ARMv4指令集加入wishbone總線設計了一款新的32位微控制器,其微處理器結構、流水線運行模式都與原來一樣,沒有什么變化。參考文獻[4]針對ARMv4指令集做了一個仿真平臺,主要用于監控微處理器程序運行狀態,而對微處理器本身并沒有什么改變。參考文獻[5]完成了一個指令模擬器,即在一臺計算器上模擬一個ARM微處理器,其結構和指令完全都是按照芯片標準設計沒有一點變化。中國龍芯處理器以類MIPS指令集為基礎,采用自己設計的架構形成國產CPU。本文借鑒龍芯的發展模式,以ARMv4指令集為基礎,采用哈佛結構,優化內存訪問指令,充分利用資源共享,減少芯片面積,改進后的嵌入式微處理器性能有所提升。
1 嵌入式微處理器模塊設計
1.1 結構設計
當前微處理器有兩種存儲結構,馮·諾依曼結構和哈佛結構,如圖1所示。馮·諾依曼結構是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲空間和數據存儲空間指向同一個存儲器的不同物理位置,共用一條數據總線,因而當讀取指令時,就必須暫停讀取數據,兩者只能分別進行操作。這種結構會制約后面流水線的并行操作。當流水線上一條指令訪問存儲器時,下一條指令必須等待上條指令訪問結束才可以訪問存儲器,期間流水線需要插入NOP指令等待,不能充分發揮流水線優勢。哈佛結構是一種將程序指令存儲和數據存儲分開的存儲器結構。微處理器首先從程序指令存儲器中讀取程序指令內容,解碼后得到數據地址,或直接從寄存器中直接獲得數據地址,再到相應的數據存儲器中讀取數據,并進行下一步的操作。由于程序指令存儲和數據存儲分開,且擁有獨立的數據訪問總線。因而讀取程序和讀取數據可以同時進行,這樣可以更好發揮流水線優勢,本文采用哈佛結構。
1.2 單周期32位乘法器設計
乘法器是重要而復雜的一個運算單元,乘法器電路信號傳播路徑長,電路延時比較大,針對乘法器很多人做了不同優化。參考文獻[6]引入流水線乘法器,通過分部計算減少了單次乘法器的運算周期,適用于連續乘法器運算。但單次乘法器運算,使用時鐘周期反而隨流水線增長而增加,并不適用于微處理器方面。參考文獻[7]針對傳統Booth編碼方式進行了優化,提出新的編碼方式。相比傳統Booth該方法減少了10%面積。同時優化部分積產生電路如圖2所示,在部分積相加階段采用單獨4-2壓縮器,相比2個3-2壓縮器構成的4-2壓縮器減少了門級電路。整個乘法器運算過程如圖3所示。
2 系統優化
2.1 第二操作數獲取
ARMv4指令集中數據的運算都是基于寄存器,通常一條指令包括1-3個寄存器,指明源寄存器和目的寄存器。指令中立即數一般會通過邏輯左移、邏輯右移、算術右移、循環右移、帶擴展的循環右移1位移位得到原立即數。這樣就需要5個32位的移位寄存器,這將增加芯片面積和功耗。通??刂七壿媶卧牡倪壿嬞Y源少于運算單元消耗的資源。通過對數據的前期操作最后使用一個邏輯左移實現上面5種移位功能[8-9],大大減少邏輯資源。邏輯右移轉換成邏輯左移的實現過程如下:通過將被移數據補足為64位,然后將右移偏移量取負數,通過左移負數個單位,高位得到的32位結果就是邏輯右移的結果,移位示意圖如圖4所示。
算術右移通過邏輯左移的實現過程如下:通過將被移數據補足為64位,然后判斷被移數據的正負性,若為負數則將數據取反,正數無需處理。然后將右移偏移量取負數,通過左移負數個單位,保留高位得到的32位數據結果。根據被移數據的正負性,若為負數則將數據取反,正數保持不變,最后得到的結果就是算術右移的最終結果,移位示意圖如圖5所示。
循環右移通過邏輯左移的實現過程如下:通過將被移數據補足為64位,然后將右移偏移量取負數,通過左移負數個單位,將移位后的高32位數據與低32數據進行與運算得到結果即是循環右移的結果,移位示意圖如圖6所示。
帶擴展的循環右移1位的實現過程如下:由于每次只能移位一個距離單位,只需要保留被移的數據的高31位,然后將進位標志C放在數據的最高位,即可實現帶擴展的循環右移1位功能。移位示意圖如圖7所示。
2.2 乘法器和乘加法器指令實現
ARMv4指令集中的乘法運算有32位乘法運算,32位乘加運算,無符號乘法運算,無符號乘加運算、有符號乘法運算、有符號乘加運算6種。通常不同功能乘法器需要不同設計。這樣6類乘法需要2個乘法器和2個加法器。如果將有符號數在運算前轉換成無符號數,最后將運算結果根據之前的符號位轉換成有符號結果,這樣就將有符號乘法轉換為無符號乘法。對于簡單的乘法運算轉換為被加數為0的乘加運算,這樣所有的乘法和乘加運算都轉換為乘加運算。通過上面轉換后,6種乘法指令到最后都通過前置數據轉換共用一個乘加運算實現,如圖8所示。
3 FPGA實現和Modelsim驗證
實驗所用FPGA芯片為Altera EP4CE30F23C7, EP4CE30器件總共有28 848個邏輯單元,器件中分布RAM有107 520 bit。由于芯片具有豐富的RAM,微處理器內部RAM和ROM均采用FPGA內部RAM實現。整個工程采用Verilog語言編寫,使用synplify pro 2011進行綜合,在Quartus 13.0下進行布局布線。利用Modelsim10.0a進行功能驗證和時序分析。設計ROM 32 KB,RAM 16 KB,時鐘20 MHz,其中內部RAM、ROM通過使用FPGA內部M4K存儲單元組成。C語言測試代碼使用?滋Vision V4.22編譯生成,由于FPGA無法直接初始化32位HEX文件,需要將HEX文件轉換為MIF格式。代碼轉化軟件通過VC ++ 6.0編寫。通過將轉換后將生成的MIF文件下載到ROM中進行測試驗證。
3.1 移位寄存器仿真
指令中包含的第二操作常數一般是通過8位常數循環右移得到。因而并不是所有常數都是合法常數。例如 mov r0,#0x1000;是合法指令,0x1000可以通過0x01循環右移20個單位得到。但是mov r0,#0x1001;就是非法指令,因為0x1001無法通過一個8位數據循環右移得到。上文中通過一個邏輯左移實現4種邏輯運算功能,為了驗證其正確性下面將通過4條指令分別測試邏輯左移、邏輯右移、算術右移、循環右移4種功能。測試代碼及理論運算結果如下:
movr0,#0x01//將r0初始化為1,結果為1
mov r0,r0,LSL#12//將r0邏輯左移12位,結果為0x1000
mov r0,r0,LSR#4//將r0邏輯右移4位,結果為0x100
mov r0,r0,ASR#8//將r0算術右移8位,結果為0x01
mov r0,r0,ROR#8//將r0循環右移8位,其結果位0x1000000
Modelsim仿真如圖9所示。
從Modelsim仿真結果看出,設計的單個邏輯左移移位寄存器很好的完成了上述4種功能。
3.2 乘法器和乘加法器仿真
經過優化后的乘法指令和乘加指令都通過同一個乘加器實現。為了驗證其正確性,分別采用6種乘法指令分析其正確性。測試思路是通過編寫指定的代碼,進行理論計算,然后對比微處理器運行結果。測試代碼及理論運行結果如下:
movr0,#0x120000;orr r0,#0x3400;orr r0,#0x56
movr1,#0x80000000;orr r1,#0x7800;orr r1,#0x9a
movr5,#0x01
上面6段代碼主要是初始化r0、r1、r5值,運行后r0為0x123456,r1為0x8000789a, r5為0x01。
mul r4,r0,r1:運算結果為0x91a33937bcbbc,由于只取32位結果,r4結果為0x937bcbbc。
mla r4,r0,r1,r5:運算結果為0x91a33937bcbbd,由于只取32位結果,r4結果為0x937bcbbd。
umull r4,r5,r0,r1:無符號乘法結果為0x91a33937bcbbc,r5結果為0x91a33,r4結果為0x 937bcbbc。
umlal r4,r5,r0,r1:無符號乘發結果為0x91a33937bcbbc,乘加r5結果為0x123467,r4結果為0x 26f79778。
smull r4,r5,r0,r1:r1最高位為1有符號運算時先轉換為無符號數0x7fff8766,然后計算得到無符號結果0x91a226c843444,轉換成有符號后r5結果為0xfff6e5dd,r4結果為0x 937bcbbc。
smlal r4,r5,r0,r1:r1最高位為1有符號運算時先轉換為無符號數0x7fff8766,然后計算得到無符號結果0x91a226c843444,轉換成有符號結果為0xfff6e5dd937bcbbc,乘加后r5結果為0xffedcbbb,r4結果為0x26f79778。
Modelsim仿真如圖10所示。從仿真結果看出,設計的單個乘加器正確的完成了上述6類指令的功能。
3.3 Dhrystone性能測試
Dhrystone的計量單位為每秒計算多少次Dhrystone,它是一個相對值。程序用C語言編寫,能運行在大多數微處理器上,是測試處理器運算能力的最常見基準程序之一?;鶞食绦蚴褂?滋Vision V4.22軟件下ARM自帶的Dhrystone2.1基準測試程序,去掉全部優化后,將編譯好的文件下載到本文設計的微處理器。選用NXP公司的ARM LPC2102微處理器芯片作為對比。LPC2102在ARMv4指令集基礎上增加了Thumb指令集,測試時禁用交叉編譯只生成32位的ARM指令。結果如表1所示。
從表1中可以看出,改進后的微處理器,相比當前市面同種類微處理器性能有近20%提升。
4 結論
當前高性能、高效率的微處理器基本采用哈佛結構。本文以ARMv4指令集為基礎,將傳統馮·諾依曼結構更改為哈佛結構,擁有獨立指令總線和數據總線,其優點是在流水線階段可以同時進行訪問ROM和RAM,避免了單總線引起的資源競爭。采用單周期乘法器,提高微處理器的運算速度。在設計乘法器時,利用資源共享,最終一個乘加器實現了6條指令功能。采用單一邏輯左移移位寄存器實現多種模式移位功能。實驗結果表明,本文設計的微處理器能正確運行ARMv4指令集,同等條件下比當前市面同種類芯片性能有20%提高。大多數應用程序在不修改就可以提高20%性能。
參考文獻
[1] 董海濤,莊淑君,陳冰,等.基于ARM+DSP+FPGA的可重構CNC系統[J].華中科技大學學報(自然科學版),2012,40(8):82-87.
[2] 竺樂慶,張三元,幸銳.基于ARM與WinCE的掌紋鑒別系統[J].儀器儀表學報,2009,30(12):2624-2628.
[3] 孫永琦.基于ARMv4指令集的32位RISC微控制器的設計與實現[D].浙江:浙江理工大學,2012.
[4] 徐懷亮,劉曉升,王宜懷,等.一種ARM指令集仿真器的實現與優化[J].蘇州大學學報(工科版),2009,29(2):28-31.
[5] 賈少波.基于X86平臺的ARM指令集模擬器的設計[J].電子設計工程,2013,21(12):164-169.
[6] 周怡,李樹國.一種改進的基4-Booth編碼流水線大數乘法器設計[J].微電子學與計算機,2014,1(6):60-63.
[7] 翟召岳,韓志剛.基于Booth算法的32位流水線型乘法器設計[J].微電子學與計算機,2014,31(3):146-149.
[8] 杜慧敏,王明明,沈子杰.32位桶式移位寄存器FPGA實現[J].西安郵電學院學報,2008,13(1):99-102.
[9] 陳永強,雷雨.可變長移位寄存器在高速數據采集中的應用與FPGA實現[J].西華大學學報(自然科學版),2013,32(4):61-63.
基金項目:廣東省工程技術研究中心項目(2012gczxA003)