二進制碼高速轉換及其在自動化測試中的套用
二進制一一BCD碼轉換器,常用於數字計算機接口設備中,廣泛地套用於數位化儀器儀表、 數顯裝置、 雷達與導航和遙感與遙測等數字式測定目標座標系統中。 由於這些數字系統的內部工作常採用二進制碼進行運算操作,因此如何有效地把數字系統工作結果的二進制數據轉換為BCD碼(Binsry Coded Decimal、 二一一十進制碼),進而轉換為所習慣的十進制數字並自動地顯示或列印出來,這對方便、 迅速、 準確地處理數字系統的工作結果和對系統的自動檢測、 故障排除與維護使用都是很重要的)。
如何設計與選用合適的二進制一 一BCD碼轉換方法,這對自動化測試裝置來說,是相當重要的。 基本的轉換方法有兩種 : 計數器法與硬體法,計數器法雖然方法簡單,用硬體最少,設備成本也較低,但轉換速度最慢,例如轉換n位二進制數碼的轉換時間就需要2 個時鐘脈衝周期,對16位二進制數字轉換,時鐘脈衝頻率為5MC,則需轉換時間13.lms。而硬體法由於兩種數碼之間沒有簡單的邏輯關係,因此電路常常較為複雜,但轉換速度可做得很高。 至於選擇什麼樣的轉換方法,首先需要考慮的是速度要求,只有在滿足給定速度要求後,然後再考慮設備的複雜程度,用積體電路數量的多少,也就是設備成本問題。 在字長一定的情 下,用積體電路的數量,這就取決於設計方法和積體電路的製造工藝了。
BCD碼是一種很有用的代碼,它能以最少的硬體來實現二進制與十進制數字的轉換。BCD碼是用一組四位二進制碼來表示一位十進制數字的一種方法。 它只取四位二進制碼可能有的十六種組 合中的十種來表示0一 9十個數字。 在BCD碼中,1001是最大的四位組。BCD碼既不同於二進制碼,也不同於十進制碼,它是把十進制與二進制的特點結合在一起的,在每個四位組內部是二進制的,但從組到組是十進制的。 直到十進制數值9為止 ,BCD碼與二進制碼相同,在大於數值9,BCD碼與二進制碼則完全不同,例如13的二進制數為1101,但13的BCD數是00010011。 雖然用BCD碼錶示一個十進制數字,比用二進制碼來表示,一般需要用更多的位數,也就是需要用更多的硬體,例如表示一個6位十進制數字,在BCD碼中,需要24位 ;而在二進制碼中,只需要20位。 然而,BCD碼的主要優點是變成十進制數字容易,變回來也容易。 由於BCD碼這種計算上的低效率,在BCD與與十進制數字相互轉換中很容易實現,而得到了補償。 因此,BCD碼這種數字表示方式,常用於計算機接口設備中,例如需用十進制輸入的打字機、 終端顯示器等。二進制一-BCD碼轉換器用於飛彈武器系統、 雷達與導航、 遙感與遙測、 靶場測量等數字式測定目標座標系統中的研究工作不斷擴展、 套用也日益廣泛。 顯然,如何把這些系統測得目標角度、 距離、 速度等參數的二進制數據,轉換為所習慣的十進制數字並自動地顯示出來,這對方便、 迅速地處理分析目標飛行參數是很重要的。 這種自動顯示數據的方法,與一般雷達傳統使用的同步感測器指示法、 波門延時電位計指示法、 指示燈指示 等方法相比較,它具有指示精度高、 顯示直觀、使用方便,實時測試數據等許多明顯的優點。
基本轉換器
1、轉換步驟
介紹的二進制—BCD碼轉換方法,其工作步驟扼要敘述如下:
在進行二進制—BCD碼轉換時,首先要檢驗三個最高的二進制位,若這個單獨的三位數碼其值等於或大於5,則加3並向左移一位;若這個三位數碼其值小於5,則只向左移一位,而不需要加3。
每移一位後,都必須檢驗每個BCD十進制位,若新組成的四位數碼,其值等於或大於5,則加3並向左移一位,若其值小於5,則只向左移一位。然後繼續重複這種過程,直到二進制的最低位移入到BCD的最低位的位置為止。 至此,BCD數字就等值於二進制數字。
2、基本轉換器的說明
二進制一一BCD碼轉換器,是由很多個相同的四位基本轉換器組合而成。顯然,基本轉換器應解決在考慮來自二進制輸入低位的移入以及BCD輸出向高位進位的情況下二進制碼與BCD碼的轉換問題。
在自動化測試中的套用
套用介紹的轉換器設計方法,已研製成功了一個用於一般數字系統的8位串列數據自動測試裝置。 它的功用是以所習慣的十進制數字形式自動地顯示出數字系統工作結果的二進制數據。這種自動顯示數據的方法,具有指示精度高、顯示直觀、使用方便、實時測試數據等許多明顯的優點。
自動測試裝置的主要技術參數及性能如下:
(1) 測試數據:被測試數字系統的輸出數據為串列8位,先以最高位到達測試裝置。
(2) 轉換時間:最大轉換時間不超過2μs。
(3) 工作方式:自動測試方式,測試率為2000次/秒,由數字系統的“取數據脈衝”同步工作。
(4) 移位脈衝:8個移位脈衝串的重複頻率為5MC。
(5) 數據顯示:以十進制數字形式顯示數據。
只要測試裝置的轉換時間允許,還可任意增加測試數據位數和測試率。
自動測試裝置包括五部分:移位脈衝產生器、串列輸入並行輸出移位暫存器、儲存暫存器、二進制一一BCD碼轉換器、BCD解碼顯示器。
被測試的數字系統,在每個工作周期內,把工作結果以二進制碼方式儲存在輸出暫存器中,並給測試裝置輸送一個‘’取數據脈衝”。測試裝置接收到‘’取數據脈衝”後,通過門電路的控制,使振盪器立即開始產生移位脈衝,計數器計至第8個脈衝時,即第8個移位脈衝結束後,振盪器就停止工作。由振盪器輸出的8個移位脈衝串,一路加到測試裝置的串列輸入並行輸出移位暫存器,另一路經過單穩態電路延時後,送至被測試數字系統的輸出暫存器,使數字系統的輸出數據以8位串列碼方式送到測試裝置。
設計方法與計算,套用到自動化測試後,使用效果良好。可供研究自動化測試、數顯裝置,計算機接口設備,雷達與導航、靶場測量等參考。
即時編譯的動態二進制碼轉換器
描述一個為GBA設計的基於即時編譯的二進制碼轉換器(Binary Translator)。二進制碼轉換器是在把一種機器( 下文稱" 源機器") 上運行的應用程式(下文稱" 源套用") 轉換成在另一種機器( 下文稱"目的機器") 上運行的應用程式( 下文稱"目的套用") 的程式。在新的機器出現後,大量的現存機器上的套用都需要通過二進制轉換器轉換成新機器上的套用。從轉換的時機上來分,二進制碼轉換器分為靜態轉換器和動態轉換器兩種,靜態轉換器靜態的分析源套用的二進制碼並直接轉換成目的套用,但是這樣做往往很難甚至於不可能,因為可能很難分析出源套用的二進制碼中哪些是代碼哪些是數據,不容易保證轉換了所有的可執行二進制碼;源套用甚至可能在運行期動態生成源機器的機器碼並運行,靜態轉換完全沒有辦法處理這種情況。所以靜態轉換器一般不易實現。動態轉換器則保留源套用的二進制碼,在運行時每次轉換一小段正準備執行的代碼(通常轉換一個基本塊) 並運行。這樣可以保證所有可能執行到的二進制碼都得到轉換。動態轉換有別於解釋執行的地方在於它消除了解釋器循環的跳轉,並且一段源機器代碼在轉換之後可以多次執行。
GBA是一款掌上遊戲機,該機使用ARM7TDMI的CPU(主頻16.78MHz),配備256K工作記憶體,96K顯存,IO和記憶體統一編址。在GBA平台上有大量精彩的套用,但是在除了PC以外的平台上還沒有一個很好的模擬器來支持GBA套用。
描述的二進制碼轉換器功能是將GBA套用轉換為其它平台下的應用程式。轉換後的應用程式包含源套用的二進制碼,同時也包含一個模擬運行環境和一個即時編譯器。模擬運行環境模擬GBA的圖像顯示和各種系統調用,即時編譯器把源套用的二進制碼即時編譯成目標機器上的二進制碼並在模擬環境中運行。
所以程式包含兩部分內容,一部分是把GBA套用轉換成目的套用。另一部分是GBA二進制碼的即時編譯器和模擬運行環境。
模擬運行環境
1、記憶體地址沙箱:模擬運行環境通過一個地址沙箱來模擬源套用的記憶體空間,所有源套用的記憶體讀寫操作都通過記憶體沙箱進行,以保證與源套用產生相同的效果。GBA平台的記憶體訪問可以分為幾類:
1)讀寫工作記憶體,顯存;
2)讀寫功能暫存器和IO連線埠(GBA是統一編址);
3)讀唯讀數據。
其中讀寫功能暫存器和IO連線埠可以在編譯時探測出並且轉換為調用對應功能函式的目標代碼。讀唯讀數據和讀寫工作記憶體都通過記憶體沙箱的地址映射表映射到目的運行環境的記憶體中。可以想像,這樣的每次讀寫都作映射的開銷是很大的,所以即時編譯器要對這些記憶體讀寫作很多最佳化。
2、圖形模擬環境:使用一塊緩衝區模擬GBA平台的顯存。GBA有較為複雜的二維圖形硬體加速,基本概念有以下幾種:
1)背景(Backgrounds): 背景可以看作顯示在螢幕上的一層圖像。GBA支持最多四個背景,背景支持三種模式: 文本,放縮/旋轉,點陣圖。
2)精靈(Sprites): 精靈是可以在螢幕上移動的較小的圖片。GBA支持最多128個精靈。
3)視窗( Windowing): 視窗是一個剪裁區域,可以設定區域內顯示或不顯示。GBA支持兩個視窗。
以上的功能是通過顯存和一些功能暫存器來實現的。可以把最終的螢幕顯示看作以顯存和暫存器內容為自變數的函式。有可能某個暫存器的值稍有改變,螢幕的輸出變化就很大。而且圖形操作一般具有x*y的複雜度,所以圖形模擬可能會成為一個瓶頸。
3、BIOS模擬和硬體模擬(DMA,串口,Timer,鍵盤):GBA的BIOS提供一些系統調用,如除法運算,LZ77解壓縮,Huffman解壓縮等等,硬體也通過一些暫存器控制,這些訪問都被編譯成調用功能函式。
4、同步與中斷:由於是編譯執行,無法精確的模擬原CPU的周期,只能在編譯時估計編譯單元所需周期並在運行時統計。在中斷髮生時,無法停止編譯後的目標機器代碼的執行,所以只能在編譯時插入查詢函式來主動探測中斷是否發生。
即時編譯器
1、編譯過程:即時編譯器以函式為單位進行編譯,在運行時,每次發生函式調用(ARM機器指令BL,BLX),就在系統中查詢即將調用的函式是否已經被編譯,如果該函式已經被編譯,則取得該函式入口並跳轉到已經編譯的代碼上執行;如果該函式尚未編譯,則編譯它並在系統中登記其狀態,編譯完畢後運行。
首先把ARM7的機器碼編譯成一種中間代碼(IntermediateRepresentation),再從中間代碼生成目標機器代碼,以便於移植到各種機型之上。中間代碼以函式- >基本塊- >語句的關係來組織,所以編譯過程可以分解為:
1)基本塊劃分( 劃分基本塊後就知道函式範圍了);
2)基本塊內編譯( 生成中間代碼);
3)根據基本塊生成整個函式的目標代碼。
2、基本塊劃分:發生函式調用而未命中時開始編譯,編譯從函式的入口地址開始,往下掃描代碼並分出基本塊,一直到:
1)所有的基本塊都只指向當前函式的基本塊;
2)除了入口的一個基本塊以外,所有的基本塊都只被本函式的基本塊所指向。得到的這樣一個函式在編譯後會記下其地址及範圍。如果稍後的運行中有其它的跳轉指向了該函式的範圍之內,迫使該範圍內的代碼重新劃分基本塊並編譯。
3、基本塊內編譯:基本塊內編譯成中間代碼,中間代碼主要是模擬ARM的指令,所以和ARM指令一一對應。ARM的暫存器都看作是全局變數。基於同步和中斷處理的考慮,在每個基本塊的末尾,都會插入一條函式調用指令,以該基本塊在ARM CPU上運行所需的周期數(在編譯時確定)為參數,該函式內在全局累加周期數,並據此作適當的同步(比如延時)。該函式同時也要查詢此刻是否有中斷髮生,一旦發生了中斷,就保存現場,開始運行中斷處理函式。
4、根據基本塊生成整個函式的目標代碼:根據每個基本塊的中間代碼編譯出目標代碼,並針對函式的局部變數作出最佳化。因為函式的局部變數在函式結束時就消失了,所以不必在生成的目標代碼中保留器狀態。最後根據基本塊的關係,定位各個基本塊的目標代碼生成目標函式。