(1)
Grey碼在FPGA實際應用中是實用的碼,在8421BCD碼累加計數器中,如果寄存器需要發生多位(兩位或者以上)的跳變,會出現中間態,這樣作為組合邏輯的輸入是不穩妥的。
下面看兩個中間態的例子:
這是累加器的狀態轉換時序觀察,存在中間不希望的狀態。如果作為組合邏輯的輸入,狀態有可能跑飛。
左邊0111 -> 0101 -> 1000,右邊0101 -> 0111 -> 0110
(2)
采用格雷碼可以避免中間態的出現,因為相鄰兩個狀態之間只有1 bit差異。
下面是8421BCD碼(自然計數碼)和格雷碼的對應關系,以3bit為例:
自然碼 0 1 2 3 4 5 6 7
自然碼二進制 000 001 010 011 100 100 101 111
格雷碼對應的十進制 0 1 3 2 6 7 5 4
格雷碼 000 001 011 010 110 111 101 100
在百度百科上面看到了這個圖片,發現了規律:
對於這個4 bit格雷碼,我們發現最高位(g3)在組群前一半是0,后一半是1,非常整齊。而且非最高位(g2,g1,g0)組成的狀態關於黃線對稱,比如離黃線最近的g2g1g0都是100,再遠一位是101,。。。最遠一位是000。
按照這個規則,我們可以由n長度的格雷碼生成n+1長度的格雷碼。
- - 附錄 - -
把這個圖倒過來,看到白色藍色的方塊圖案:
我們發現格雷碼的方塊圖案關於紅線是軸對稱的(除了最高位g3),
8421BCD碼的方塊圖案關於紅線是取反軸對稱的(除了最高位d3)。