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