張 珂,李 濤,,邢立冬
(1.西安郵電大學計算機學院,陜西 西安 710121;2.西安郵電大學電子工程學院,陜西 西安 710121)
在數字系統中,微程序控制可以簡化控制邏輯,具有控制電路規整、功能靈活可變和可升級維護的特點,甚至在相近的系統之間具有可配置復用等優點。微程序控制器作為整個系統控制邏輯的核心部件,制約著整個系統的性能,因此對其結構進行探討和優化有著重要意義。基于OpenGL圖形標準的Khronos組織制訂了機器視覺處理的基本層標準OpenVX 1.3[1],設計了一款能夠實現OpenVX 1.3中Kernel函數的通用并行可編程處理器,本文主要研究微控制器在OpenVX處理器上的應用。
目前研究人員針對微控制器模塊設計問題已做了大量研究。文獻[2]采用分組直接控制方法設計微程序控制器,減少了存儲容量,降低了微處理芯片的成本。文獻[3]提出頁式微程序ROM設計,減少了微程序中ROM的位寬。文獻[4]通過隱含下址編碼、流水和預譯碼等設計技術,提高了微碼的執行效率。文獻[5]提出了“內部計算機”采用電路邏輯,“外部計算機”采用程序邏輯觀點。文獻[6]提出了一個簡單的“微程序化計算機”,給出了總體結構和微指令格式,最后給出了“執行機器語言指令的微程序”。文獻[7]采用了微指令預取的設計,對微指令的執行過程進行了加速處理。
本文針對文獻[4]中微控制器解析命令過程導致內部存儲量大的問題和文獻[2,5-7]中轉移步驟復雜且功能不是很完善的問題,首先基于相聯邏輯原理[8]設計了一種相聯存儲器,提高了控制存儲器CS(Control Storage)的利用率,減少了存儲器面積;然后基于判斷條件分組匹配的方法設計了轉移地址產生模塊,提高了轉移地址產生速度;最后基于OpenVX處理器映射標準Kernel算法,進而優化微指令。
本文設計的OpenVX處理器包含4×4個處理單元PE(Processing Element)、路由和微控制器MCU(Micro-program Controller Unit)。控制器的主要功能是通過操作字段和順序控制字段產生控制信號,實現對數據通路的控制。處理器總體結構如圖1所示。

Figure 1 Overall architecture of processor OpenVX
處理圖像時,MCU向PE發送指令,每個PE包含8個ALU、2個定點乘法器、2個浮點乘法器、1個定點除法器、1個浮點除法器、1個內部交叉開關、8個32×16的寄存器堆和寄存器堆的訪存模塊。PE之間的數據交互由控制信號和路由完成。其中,控制器發出控制指令從寄存器堆中讀取需要處理的像素信息,將數據發送給PE中的運算單元進行計算。通過控制運算單元中邏輯運算器的數據流向,完成在固定的硬件資源上實現復雜圖像處理的功能。
在數字系統中,相比于硬布線控制,微程序控制可以簡化有規律的控制邏輯,便于檢查設計中的錯誤,即使出現錯誤,也易于增加和修改指令功能,靈活性較強。其基本思想是把操作控制信號編寫成微指令,存放到一個只讀存儲器中,依次讀出這些微指令,從而產生整個處理器所需要的各種控制信號,使相應的部件執行規定的操作[9,10]。
本文自主設計了OpenVX并行處理器微控制器,其結構如圖2所示,主要包括:起始地址產生模塊、轉移地址生成模塊、轉移信號分組和微程序存儲器(包含數據通路控制信號)。
相比于傳統的微控制器,本文設計的微控制器具有以下3個特點:可編程程度高、模塊化程度高和適用性程度高。微程序提前存儲在控制存儲器CS中,機器啟動后,給出控制存儲器的首地址。第1條微指令是取指微指令,當取出一條指令時,首先通過相聯存儲器得到該指令的微程序的起始地址,輸入給下地址選擇器,得到控制存儲器中相應的微指令。接著根據條件組中條件信息選取轉移類型字段中地址編號,選擇一個地址做為下一條微指令的地址。最后將操作信號送往數據通路,從而控制整個系統。

Figure 2 Structure of MCU

Figure 3 Group field direct coding
微程序控制器除了結構的設計和優化,微指令的設計也是至關重要的,OpenVX處理器中微操作命令數在300個以內。因此,盡可能地縮短控制字段長度能有效減少控存容量,提高指令執行效率。
本文遵循以下原則進行微指令格式設計:
(1)微指令字寧短勿長;
(2)微程序長度寧短勿長;
(3)意義明確,便于修改;
(4)執行速度快。
具體采用分組直接控制法中的分組思想與字段直接編碼法相結合的方式,格式如圖3所示。
假設將微指令分為5組,每組有10條微指令。在操作控制字段中,組選擇字段中用A~E表示5組不同的微指令位,1~10表示10個微命令位,A1~A10,B1~B10,…,E1~E10表示輸出的微操作。除了組選擇字段外,其余控制字段采用字段直接編碼方式。例如共有24個微命令,構成了8個互斥類,即分為8段。每段中間有一個空位表示不做任何操作。條件組字段決定下一步執行哪條微指令,以及要采取的操作,操作與微指令本身相關;轉移類型字段是當微程序出現分支(即出現條件轉移)時,通過條件判斷和狀態返回的信息修改微地址內容;下地址字段給出了當滿足轉移條件時,接下來應執行的微指令地址,否則順序執行。
本文根據OpenVX像素處理的5類函數:點函數、局部處理函數、全局參數抽象處理函數、迭代處理和跟蹤處理函數,設計的操作操作指令格式。設計指令格式共18位,即5種類型(3位)、31個函數(5位)和起始地址(10位)。在外部設置一個17×26的寄存器堆,用來存放儲操作碼及其對應的起始地址。操作指令格式如圖4所示。

1715141090OpcodeTypeMainAddress
圖4中,OpcodeType表示5種函數類型;Main表示具體的函數操作碼,比如Gaussian、Sobel和Canny等,Address表示對應該指令的地址。
將函數映射到微程序的主要挑戰是微指令的設計,總體的設計格式已在3.2節中進行了說明,本節詳細介紹每條微指令中各字段所代表的控制信號,并通過設計舉例進行驗證。微指令字長336位,具體意義如圖5所示。

309位21位4位2位操作控制字段條件控制字段轉移類型字段下地址字段
操作控制字段包括GS、輸出配置OC(Output Configuration)、指令編碼IC(Instruction Coding)、寄存器堆編號RHN(Register Heap Number)、PE編號PE_NUM(PE Number)和移位信號SS(Shift Signal)。每個PE中設計了8個運算單元,所以微指令設計8組操作控制信號。下面以操作控制字段為例,詳細介紹每個字段的定義,具體如表1所示。

Table 1 Format of operation control field
下面以Canny算法為例進行分析,其流程如圖6所示。

Figure 6 Flow chart of Canny algorithm

Figure 7 Take number instruction types
接著采用Gaussian 5×5進行濾波,以第1次取的數據為例,說明Gaussian濾波處理流程。具體控制流如圖8所示。假設Xi(i=1,2,3,…)代表從寄存器堆中取出的像素數據。將數據發送至PE1進行運算,X1和X5由ALU1進行加法運算,處理完的中間結果寫回1號寄存器堆中的地址,此操作的微命令格式為:ADD(00011)RHN(001)PE_NUM(0001)R3(0011)R1(0001)R5(0101)。中間結果繼續發送到PE1中進行運算,其他像素處理方式相同。一組25個像素需要5行微指令,深度為16,則需要5×16=80條微指令。然后使用Sobel 5×5進行邊緣檢測,得到G1和G2。因都屬于卷積操作,控制流程相同,不再進行說明。

Figure 8 Control flow using Gaussian 5×5 filter

通過條件控制字段,當且僅當某一像素梯度大小大于或等于其垂直于邊緣處的像素梯度時,將其保留為潛在的邊緣像素。例如,如果像素的方向是0度,只有當它的梯度大小大于與它成90度和270度的像素的梯度大小時,才會被保留。如果一個像素通過這個條件被抑制,那么它在最終的輸出圖像中一定不能作為邊緣像素出現,即在最終的輸出圖像中它的值必須為0。

Table 2 Gradient size microcommands

Table 3 Comparison of microprogram optimization results

Figure 10 Structure of starting address generation module
輸出圖像中的最終邊緣像素通過雙閾值遲滯過程進行識別。所有大于高閾值的保留像素在最終輸出圖像中被標記為已知邊緣像素(值為非零),所有小于或等于低閾值的像素都不能在最終輸出圖像中標記為邊緣像素。
OpenVX1.3中函數類型較多,對像素的處理也不盡相同,比如卷積操作、逐像素操作等等。微程序的編寫具有一定的復雜性,本文主要從硬件資源和指令優化2方面進行優化,硬件資源優化主要體現在起始地址產生模塊和轉移地址模塊,指令優化從數據相關性、增加輔助操作字段和子程序設計等3方面進行,如圖9所示。

Figure 9 Optimization contents
起始地址產生模塊優化采用相聯存儲器加輔助電路設計,如圖10所示。與指令碼嵌入方式相比,除了具有存儲功能外,還具有信息處理功能,它能根據內容的特征并行查找存儲單元,顯著提高查找速度。
綜上所述,現如今,國民經濟正在持續不斷的發展著,人們對于自己居住環境的要求也是更加嚴格了,特別是極為重視對建筑中的水電安裝這一工程。在對建筑工程進行建設的過程中,水電安裝這一工程是非常重要的,在建筑工程中水電安裝這項技術決定著人們在居住環境上舒適的程度。本文對建筑水電安裝工程技術創新措施加以分析,指出工程技術之中存在著的問題,然后并指出相應創新的措施。使工程的質量得到提升,使居民在生活上的水平得到有效的提升。
存儲體由寄存器堆構成,檢索寄存器存儲輸入的操作碼,將寄存器的內容和存儲體中每一單元的內容進行比較,將比較結果中的不關心位屏蔽掉,屏蔽之后的結果進行按位與運算。此時,如果比較結果相同,那么按位與后的結果是1,否則是0。然后,對所有結果進行編碼,編碼結果作為選擇器的選擇信號,選擇器的輸入為存儲體每一個單元的內容。最后對選擇器的輸出進行截位,得到最終的微程序起始地址。
通過列舉Gaussian 3×3、Sobel 3×3、Gaussian 5×5、Sobel 5×5、閾值、色系變換、位深度變換、膨脹和仿射變換等函數分析控制存儲器利用率。9條指令分別對應的微指令條數為1,1,5,5,48,16,16,23和33。公共操作的空指令和停機指令各需要1條微指令,取數指令需要64條微指令,間接地址判斷微程序需要2條微指令,取命令微程序需要3條微指令。
通過采用指令碼嵌入方式進行測試,控制存儲器需要占用的大小為112 221 bits,由所有機器指令微程序與公共操作微程序組成。而起始地址產生模塊采用相聯存儲器設計,12條指令,操作碼5 bits,微指令地址7 bits,則相聯存儲器所用的存儲體寬度為12 bits,深度為22,其占用空間大小為(5+7)×12=144 bits。此時微程序占用控制存儲器的大小為(1+1+5+5+48+16+16+23+33+1+64+2+3)×331=72158 bits,相比指令碼嵌入方式控制存儲器利用率提高了35.7%。
一般微程序控制器一次只能判斷一個條件,當所有的條件判斷完成后發出控制信號。如果要產生正確的地址就需要一步一步進行判斷,轉移速度很慢。本文采用條件分組的方式快速匹配出轉移地址,如圖11所示。具體做法是:在復雜數字系統的命令解析中,一個操作需要判斷的條件有很多,將所有的條件分為若干組,每組可分配2~6個條件,條件可分在同一組的原則是這幾個條件互斥;通過組選擇字段選擇出一個條件組,再與來自數據路徑的狀態寄存器進行匹配,看條件是否滿足,選擇出2~6個地址中的一個,使得在一條微指令里完成2~6個條件的判斷,減少轉移地址產生步數。

Figure 11 Logic of transition address generation module
采用上述方法,以公共微指令為例,接收到指令的可能是5種函數類型,首先需要判斷當前輸入的參數Cmd_In[14:10]代表的函數類型。當滿足Cmd_In==點函數(001),選擇微指令下地址字段中的地址AD1送往控制地址寄存器CAR,作為下一條微指令的地址,執行相應操作。如果都不滿足,則選擇順序取微指令,CAR+1作為下一條微指令的地址,該微指令執行完后,就返回到取命令操作微程序,該命令的解析工作完成。該命令有5個操作,可以分為4個條件,采用傳統的微程序控制器,最多需要判斷4次才能轉到相應的操作上,采用上述描述的條件分組方式,每組內并行判斷,只需要1條微指令。
從數據依賴性方向進行分析,微指令中發出的微命令可能同時對存儲在同一個寄存器中的數進行操作,產生時延,減緩指令執行速度。為了減少指令條數,縮短微指令長度,首先根據數據相關性,對指令進行排序,提升運算速率。以在高斯濾波函數設計為例,部分匯編程序指令如下所示:
1.ADDR26,R1,R5
2.ADDR32,R32,R33
3.ADDR27,R21,R25
4.ADDR26,R26,R27
5.ADDR28,R2,R4
6.ADDR2,R28,R29
7.ADDR29,R6,R10
8.ADDR28,R30,R32
9.ADDR30,R16,R20
10.ADDR29,R32,R33
11.ADDR31,R22,R24
12.ADDR30,R26,R27
13.ADDR33,R31,R32
14.ADDR31,R28,R30
15.ADDR32,R3,R3;SLLR3,2;SLLR3,1
16.ADDR33,R11,R11;SLLR11,2;SLLR11,1
上述指令按照序號順序執行,每行微指令可以執行8個操作指令,但是數據之間存在相關性,其中,第8條指令和第9條指令中都存在R30,只有第9條指令完成后才能執行第8條。假設在t1和t2時刻完成上述指令運行,根據本文設計的微指令格式,可對上述16條指令進行排序,分為2組:(1,3,5,7,9,11,13,15),(2,4,6,8,10,12,14,16),分別在t1和t2時刻執行,這樣減少了指令條數,提高了執行速率。
微指令格式的優化方面,在微指令的基本功能外,增加輔助操作字段,采用組合型微指令,可進一步提高微指令執行的并行度,縮短微程序長度。比如:原本每條微指令需要增加5位移位操作字段,本文設計將移位操作嵌入到加法操作中,使用1位就可完成移位操作。
最后運用子程序設計方法對微指令進行優化。OpenVX函數中存在許多重復的操作,如從寄存器堆中取數操作、模板操作等,通過子程序設計方法實現這些函數。以Gaussian函數中取數操作為例,每條指令執行完后,都有取數操作的微命令。通過設置取數操作子程序,使Gaussian 5×5函數微指令條數從9條優化到5條。優化前后對比結果如表3所示,微程序總體縮短31.7%。
本文采用XILINX公司的20 nm XCVU440芯片搭建FPGA板級驗證平臺進行驗證,實驗結果如圖12所示。

Figure 12 Comparison of image results
圖12a是原圖,圖12b為高斯處理處理后的圖像,圖12c為Sobel函數處理后的圖像,圖12d為Canny函數處理后的圖像。分別統計出部分函數每秒處理的圖像幀數,可以達到像素快速刷新的效果,具體結果如表4所示。

Table 4 Number of image frames processed per second at different resolutions
對Gaussian 3×3、Sobel 3×3、Gaussian 5×5、Sobel 5×5、閾值、色系變換、位深度變換和仿射變換等函數的微程序轉移步數進行統計,結果如表5所示。與傳統的轉移地址產生模塊即單組判斷條件進行對比,使用本文設計的轉移地址產生模塊,可以減少50%轉移步數。

Table 5 Comparison of transfer steps
通過優化微指令,提高控制存儲器利用率,減少轉移步數等,使處理器整體性能得到了提高。以下對OpenVX并行處理器處理速度進行分析,通過與文獻[11-13]設計的Sobel函數專用圖形處理器進行對比,本文處理器所用時間較短,處理速度較快。對比結果如表6所示。

Table 6 Comparison of processing time
本文設計了OpenVX并行處理器的微程序控制器,基于傳統的微程序控制器,對起始地址和轉移地址產生模塊進行優化,使控制存儲器利用率提高了38.7%,平均轉移步數減少了50%。最后通過數據依賴性關系、增加輔助字段和設計子程序等對指令進行優化,提高了執行效率。另外,通過手動優化微指令,出錯率較高,今后的研究將重點考慮自動優化微指令工具設計,以進一步進行指令優化。