梅媛 沈祖斌
【摘 要】簡述了格雷碼的來源和發展歷史,介紹了格雷碼的軸角編碼器的輸出原理,以及格雷碼的兩大特點,一是數與數之間都只發生一位跳變,二是在利用格雷碼計數器時會降低功耗。另外介紹了格雷碼與二進制之間的兩種轉換方法:公式法和查表法;以及格雷碼計數器的應用中出現的毛刺狀態和格雷碼計數器的應用原理。
【關鍵詞】格雷碼;格雷碼計數器;毛刺;軸角編碼器
1 格雷碼來源
格雷編碼在被工程師所熟知之前一直應用于機械應用。1878年,法國工程師Emile Baudot在運用電報的過程中使用了格雷編碼。他因此也獲得了法國榮譽軍團勛章。但是在當時格雷編碼并不適用于所有地方,比如脈沖編碼調制的原則就不符合格雷編碼的原理。
Frank Gray ,貝爾實驗室的研究員,發明了一種方法使用真空座裝置將模擬信號轉化為格雷編碼。1953年,這個方法和裝置被Frank Gray申請專利,于是這個編碼被命名為格雷碼[1]。其中利用了軸角編碼器將格雷碼輸出,編碼器是附接到旋轉軸的圓盤,圓盤包含了對于二進制1是透明的區域和對于二進制0是不透明的區域,光源放置在圓盤的一側,傳感器在圓盤另一側。當光源和傳感器之間出現清晰的區域時,傳感器以二進制1輸出;出現不透明區域時,傳感器以二進制0輸出。
格雷碼是一種無權碼,其編碼特點是任意兩相鄰代碼間只有一位數碼不同,這對數碼的傳輸有很大的幫助,因為他大大減少了由一個狀態到下一個狀態時電路中的模糊狀態,提高了電路的抗干擾能力,所以格雷碼是一種錯誤最小化的編碼。
格雷碼的顯著特點是所表示的數遞增時不發生較大誤差。例如,當十六進制數由7變為8時,若采取的是二進制碼,則其編碼將由0111變為1000。此時,四位二進制狀態都發生變化,對于實現二進制碼的具體設備而言,其四位設備狀態不可能同時發生改變,于是有可能出現下列情況:7(0111),5(0101),4(0100),12(1100),8(1000)。盡管最終結果是從7(0111)變到8(1000),但出現錯誤的中間轉換過程。若無措施禁止這些中間錯誤輸出,則會發生較大誤差。若采用格雷碼,則不會產生這種誤差。因當十六進制數由7變為8時,其對應的格雷碼將從0100變為1100,只有一位二進制數發生改變,也無中間錯誤結果出現。
格雷碼的另一個特點是在工作計數狀態時,每次都只有一位發生跳變,跳變的次數遠遠少于二進制計數器,所以使用格雷碼計數器可以大大降低系統的功耗。對于表1,我們很清楚的看出來,在從0-8的轉變中,格雷碼計數器發生了8位改變,而二進制計數器發生了14位的改變。因此,如果采用CMOS電路,功耗主要產生在電路狀態的切換處,在格雷碼的計數器輸出端消耗的功率僅為二進制計數器輸出消耗的功率的57%。
表1 二進制計數器和格雷碼計數器的比較
2 格雷碼與二進制碼的轉換
因為格雷碼是一種無權碼,并且在工程上有廣泛的應用,這都要進行格雷碼和二進制碼的轉換。通過軟件轉換則會降低運算速度,用硬件方法轉換數據,使數據能得到即時轉換,運算過程較為簡捷,加快了處理速度。用異或邏輯門芯片及電阻網絡組成轉換電路很容易實現格雷碼和二進制碼的轉換,但成本比較高。因此在對速度要求不是很高的地方一般都用軟件方法來實現。
軟件轉換有多種方法:
2.1 公式法
格雷碼轉換為二進制碼的算法則較為繁瑣,如下:
Rn為n位的格雷碼,Cn為轉換后的二進制碼
Cn = Rn
Cn-1 = Rn⊕Rn-1
Cn-2 =Rn⊕Rn-1⊕Rn-2
……
C1 = Rn⊕Rn-1⊕Rn-2⊕…⊕R2⊕R1,
C0 = Rn⊕Rn-1⊕Rn-2⊕…⊕R2⊕R1⊕R0
2.2 查表法
最簡單的一種方法,根據傳輸位數,建立二進制碼和格雷碼一一對應的表格,例如列出一個長度為2048個碼組的各類碼表,每組碼的長度為11位,為方便查表,每一碼組占用兩個字節,碼表共占用4KB的程序空間。程序設計的核心是通過循環查表指令把格雷碼轉換為二進制碼,再將二進制碼轉換成BCD碼和顯示碼,但如果碼組太多,系統的程序空間也會相應增大,單片機必須擴展外部程序存儲器。同時查表指令的循環次數也相應增加,大大增加了譯碼的時間。
3 格雷碼的應用
從廣義上來說,寄存器是由一系列的觸發器和組合門電路組成,用來執行數據處理任務。觸發器保存數據,組合門電路是確定要傳送到觸發器中的新的或變換的數據。而計數器是在施加時鐘脈沖時經過預定的狀態序列的寄存器,他的門電路以產生規定的二進制狀態序列的方式連接。
計數器在數字系統中應用廣泛,如在電子計算機的控制器中對指令地址進行計數,以便順序取出下一條指令;在數字儀器中對脈沖的計數等等。計數器可以用來顯示產品的工作狀態,一般來說主要是用來表示產品已經完成了多少份的折頁配頁工作。它主要的指標在于計數器的位數。
在實際應用中,二進制計數器是最廣泛應用的一種方法,它可以在電路設計中被調用來實現系統在一定時間間隔后完成動作,但是二進制計數器的進位過程會出現一些中間狀態。在表一中我們很清楚的了解二進制在碼值變化的時候位數的變化情況。在我們的邏輯思維里,如4位異步串行二進制計數器進位期間讀數由0111變化到1000時,0->1、1->0、1->0、1->0這四位的變化是同時進行的,但是在實際的物理器件中,在信號變化的瞬間,組合邏輯的輸出有先后順序,這四位并不是同時變化,往往會出現一些不正確的尖峰信號,這些尖峰信號稱為“毛刺”。電路低速運行的時候,這些毛刺不能被檢測到,對后續電路不會有影響,但是電路高速運行的時候,這些毛刺就不能被忽視,這就有可能會得到0110、0100和0000三個錯誤數值。由此可以看出,用二進制計數器是有可能在數據變化中有較大的毛刺產生。
而計數器在整個系統被頻繁的調用,所以對計數器的要求是要求非常準確的。正如前文所述,格雷碼的特點就是相鄰兩個數值之間只有一位發生跳變,那么可以采用格雷碼計數器代替二進制計數器,即利用格雷碼計數時每次計數變化只有一位的輸出電平發生翻轉,這樣就可以減少中間的轉換過程,有效地避免了毛刺的產生。
此時可以采用格雷碼計數器,盡管格雷碼計數器的設計比較復雜,占用的FPGA的內部資源更多,但是現在半導體的成本越來越低,并且采用格雷碼計數器可以大大增強系統的穩定性和可靠性。
根據格雷碼計數的特點,格雷碼計數器的設計大概思路就是:將相應的普通二進制碼轉換成對應的格雷碼。在二進制計數過程中,通過異或關系將其轉換成格雷碼再輸出,而二進制數并不輸出,這樣就得了格雷碼計數器[2]。從而有效地避免了毛刺的產生,保證了計數的穩定和可靠。
4 總結
簡單的敘述了格雷碼產生的歷史、格雷碼和二進制的轉換方法以及利用格雷碼的錯誤最小化的特點運用于格雷碼計數器。由于格雷碼計數的時候只有一位碼數發生變化,在計數時只有一位發生跳變,減少了毛刺的產生,所以相較于其他計數器更具有穩定性和可靠性。
關于格雷碼不僅僅只有錯誤最小化和功耗低的特點,他還有很多其他的性質,對格雷碼有興趣的學者可以更加深入的去研究格雷碼。
【參考文獻】
[1]Knuth, Donald E. “Generating all n-tuples.” The Art of Computer Programming, Volume 4A: Enumeration and Backtracking, pre-fascicle 2a, October 15, 2004.
[2]沙燕萍,皇甫偉, 曾烈光.異步FIFO的VHDL設計[J].電子技術應用,2001;(6):13-17.
[3]段波.格雷碼及其轉換的應用[J].國外建材科技,2005(8).
[4]李莉.基于FPGA的多位格雷碼計數器[J].科學技術與工程,2009(12).
[5]M.Morris Mano,Charles R.Kime.邏輯與計算機設計基礎(英文版·第四版)[M].機械工業出版社.
[責任編輯:張濤]