有時候沒有采用BCD計數器,又需要用十進制形式顯示二進制數據,最常用的方法是編碼轉換:將二進制碼轉換成BCD碼(8421)。
8421碼:8421碼又稱十進制碼,它只選用了四位二進制碼中前10組代碼,4個碼表達10個數,即用0000~1001分別代表它所對應的十進制數,余下的六組代碼不用。
如果要我將二進制碼轉成BCD碼,我會看看他們何時分道揚鑣,以此觀察二者的區別。
對於BCD計數器,當計數到1001時,下一次計數要進位,得到0001_0000。對於二進制計數器,下一次計數得到的是1010。
不可能重新計一次數來得到BCD碼,太浪費時間了,但是直接讓我轉我也束手無策。我們很快發現按位重建的話,消耗的時鍾周期數是二進制位數,還可以接受。深入思考一下,發現是可行的。就像標准LSB乘法一樣,從二進制高位開始重建,用一個寄存器每個周期進行shift-add操作。如果不干其他的,花費n個周期即可重建出n-bit二進制數。這個工作量已經是一個比特串行乘法器了,結果肯定是原來的二進制數不會錯。每4個bit分為一組BCD碼,對於任意一組在任意一個周期狀態下,只要數據≥5,那么下一次移位就會超出BCD碼范圍,對於BCD計數器來說需要進位。為使4位二進制碼進位,要滿足逢16進一。由於BCD碼是逢10進一,直接給當前組4bit數據補上差距3即可。下一次移位的時候,差距擴大為6,如果BCD碼應該進位,那么二進制碼也會進位,同步進位,目的達成。
寄存器中的編碼已經是BCD碼了,但是這個BCD碼代表的值和二進制代表的值是一樣的。二進制重建可以進行shift-add操作,BCD碼重建同樣可以進行shift-add操作,只不過BCD碼有自己的規則,在shift-add的時候要進行一點修正罷了。在任意周期,重建出來的二進制碼和BCD碼表示的值都是一樣的。所以最終重建出來的BCD碼是正確的。
示例:1011
重建到101時,+3,變為1000。繼續重建,得到10001,可知1011對應十進制數位11。
8位示例請看這篇帖子:https://blog.csdn.net/li200503028/article/details/19507061
