一般的,普通二進制碼與格雷碼可以按以下方法互相轉換:
二進制碼->格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR)(http://bk.7tmusic.com/lemma-php/dispose/view.php/379209.htm),作為對應格雷碼該位的值,最左邊一位不變(相當於左邊是0);
格雷碼-〉二進制碼(解碼):從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變).
數學(計算機)描述:
原碼:p[0~n];格雷碼:c[0~n](n∈N);編碼:c=G(p);解碼:p=F(c);書寫時從左向右標號依次減小.
編碼:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];
解碼:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).
Gray Code是由貝爾實驗室的Frank Gray在20世紀40年代提出的(是1880年由法國工程師Jean-Maurice-Emlle
Baudot發明的),用來在使用PCM(Pusle Code Modulation)方法傳送訊號時避免出錯,並於1953年3月17日取得美國專利。由定義可知,Gray Code的編碼方式不是唯一的,這裡討論的是最常用的一種。 (引用自百度http://baike.baidu.com/view/358724.htm)
所以,在設計格雷碼計數器的時候可以使用狀態機,給每個碼設定一個狀態然後用時鐘來控制它在狀態間轉換,這樣就完成了我們需要的功能,但是若是狀態比較多,如n=6,這時就會有64個狀態,顯然再用狀態機非常不方便,當然理論上是可以的。
用karnaugh化簡也是限制在位數比較少的情況。
所以我們需要的是一種通用的計數方式,最笨辦法就是設計一個二進制計數器binary counter,通過它來計數,然後利用binary -gray的編碼就可以得到對應的格雷碼計數器,在如今fpga資源那么充裕的情況下,我們學習這樣完全可以了,相信二進制計數器大家都會設計,那么接下來的編碼器也不是問題,這樣就解決了。
當然這不是一個好的方法,希望高人們說說自己的思路。
學習嘛,一起進步。