把二進位(8』hFF)轉換為BCD(12』h255)步驟列表(一張表說透徹)
什麼是二進位轉BCD?有什麼用?
4位二進位是16進位數,而生活中常用的數制是10進位數。
怎麼樣用計算機來理解、表達生活中的10進位數?這就需要進行16進位數與10進位數的相互轉換了。
而BCD碼(Binary-Coded Decimal)正是計算機常用的一種表達方式。
它是一種以二進位表示的十進位數碼。
比如說,至芯科技ZX-1開發板上的六位數碼管顯示數字可以是16進位的000000~FFFFFF,但是更為方便的方法是000000~999999。
六位數碼管顯示六位數字用十六進位,比如說是0F423F,誰也不知道是多少,但是它對應的十進位數999999,大家肯定很熟悉。
很多場合,我們和機器之間溝通用10進位更方便,但計算機是用01編碼的。需要進行人機之間的溝通和轉換。
解決的方法就是用二進位的方式來存儲、計算數值,但是用10進位的方式來顯示這些數值,BCD碼就起到了橋梁的作用。
注意,16進位屬於二進位的一種形式,希望大家理解這點,包括8進位也是。
當然,道理容易明白。但究竟機器又是怎樣實現二進位和BCD碼的轉換的呢?
注意,轉換是雙向的,既可以把二進位轉換成BCD碼,也可以把BCD碼轉換成二進位數。
可以想像BCD碼轉成二進位相對比較簡單。
舉個例子吧,比如說BCD碼255,要轉換成二進位。
計算機裡面存的BCD碼是12'h255(對應二進位為12'b0010_0101_0101),肯定不能直接進行運算,必須要轉換成機器識別的二進位數值12'h0FF(對應二進位為12'b0000_1111_1111)。
先算前兩位,直接2*10+5,得到結果25,然後再將結果*10+下一位,即25*10+5,最終結果為255,完了。
就這麼簡單。當然這裡255隻有三位BCD位,如果更多的話,以此類推。
將前一步結果*10+下一位,得到當前結果。
當然實現起來還有一些小的技巧,x*10要佔用乘法器資源,如果乘法器資源足夠那無所謂,但在資源有限的情況下通常用(x<<3)+(x<<1)(對應x*8+x*2)來實現。
即用移位和加法來代替乘法操作。
當然也可以把BCD數字的每一位直接變成各種左移數值的組合,比如x*100 = x*64 + x*32 * x*4 = (x<<6) +( x<<5) + (x<<2)。
上面就是BCD碼轉成二進位的實現原理,這個比較簡單,我們這裡略微帶過。
本課重點講解的是反過來怎麼實現,即怎麼把二進位轉換成BCD碼?
比如說,二進位數12'h0FF,要轉換成BCD碼255。
這個有點難,常見的做法是使用上圖中提到的大四加三算法。
當然你可以用查表法,比如說256以內的數值,直接用查表的方式,一一對應,就像我們FPGA採用LUT表實現真值表那樣,或者說用ROM表來根據不同輸入得到不同輸出。
這樣當然也是可以的,不過,它的範圍往往比較有限,不適於數量比較大的情況。
歡迎關注FPGA設計論壇,實時獲取更多FPGA相關資訊