二進位轉BCD(大四加三算法1)

2021-03-01 FPGA設計論壇
Hi,大家好!我是至芯科技的李老師。
今天講課的題目比較有意思,它是一個小問題:把二進位變成BCD碼需要幾步?
請大家思考一下。有同學可能回答需要三步,為什麼啊?
因為啊,把大象放進冰箱裡需要三步,第一步,把冰箱門打開,第二步,把大象放進去,第三步,把冰箱門關上。
類似的,把二進位變成BCD碼,也需要三步。
blablablabla .
當然啦,這是開玩笑了。不過,歪打正著,答案確實是三步。
究竟是怎麼回事呢?我們下面細細說來,原理說透之後,我們演示一下具體的Verilog實現過程。

首先,看一下下面這張表格,把二進位(8』hFF)轉換為BCD(12』h255)的步驟列表。

把二進位(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相關資訊

相關焦點

  • 如何實現二進位轉十進位的設計
    設計背景: 二進位轉十進位在設計應用中十分的廣泛。尤其在AD轉化中是必須所用到的一個小知識點,學習二進位轉十進位的方法顯的非常的重要。今天就和筆者來學習二進位轉十進位的方法,通過簡單的學習來掌握這麼一門知識。
  • 8421bcd碼轉換二進位
    8421BCD碼 算機內毫無例外地都使用二進位數進行運算,但通常採用8進位和十六進位的形式讀寫。對於計算機技術專業人員,要理解這些數的含義是沒問題,但對非專業人員卻不那麼容易的。由於日常生活中,人們最熟悉的數制是十進位,因此專門規定了一種二進位的十進位碼,稱為BCD碼,它是一種以二進位表示的十進位數碼。 二進位 二進位是計算技術中廣泛採用的一種數制。二進位數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是「逢二進一」,借位規則是「借一當二」,由18世紀德國數理哲學大師萊布尼茲發現。
  • 十進位轉二進位的最新簡單算法
    上周末,給孩子輔導奧數的時候,發現居然有一道二進位題,題目是求兩個二進位的和。我的視頻課第一課中就介紹了二進位的特點「逢二進一,借一當二」,給孩子講了下,他還是順利的做了出來。然後,我又給孩子講了下十進位與二進位的轉換。
  • 二進位上的明文算法
    於是對於一個二進位字符串就可以表示成文本的二進位串了.但是這個算法也是有代價的。還是上面的例子, 對於二進位我們只需要11位元組的空間就可以儲存下對應的內容了。但是轉化為二進位明文後, 需要88位元組才能出儲存下轉換後的內容。三、常用的十進位對於十進位,我們在數字中經常使用。
  • 吳國平:除了十進位, 人類文明史上還有哪些進位算法?
    1、二進位算法這個最簡單,兩個數字便可表示所有數字,雖然在數學中已經失去地位,但卻在計算機領域大放光彩,這正是二進位的簡單所成。二進位是計算技術中廣泛採用的一種數制。二進位數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是「逢二進一」,借位規則是「借一當二」,由18世紀德國數理哲學大師萊布尼茲發現。
  • 十進位與二進位、八進位、十六進位互轉
    十進位與二進位互轉  首先理解十進位如何轉二進位:將十進位數據除以2直到商為0,然後將餘數從下往上排序連接,即可得到該數字的二進位數。如:整數1313/2=6餘16/2=3餘03/2=1餘11/2=0餘1取13餘數,倒序連接。
  • 二進位與十進位互轉,史上最牛X方法!
    十進位轉二進位相信學過計算機的同學一定對二進位不陌生,計算機底層的通訊就是二進位嘛!
  • 二進位或BCD的轉換電路
    需要對數據做算術運算的系統一般都是採用二進位形式。而要顯示這些結果,就必須將數據轉換為BCD格式。另一方面,來自數碼開關的地址選擇信息則必須轉換為二進位格式,才能用於存儲器尋址操作。本文引用地址:http://www.eepw.com.cn/article/177043.htm對於不需要快速轉換的應用, 用一個可完成兩種轉換的電路就足夠了。
  • 我的世界二進位轉換BCD碼的詳細教程
    這是很多高玩必須掌握的東西,可能很多童鞋對BCD碼並不熟悉,但大都數玩家都應該聽說過二進位,這之間的轉換在遊戲中是非常重要的。九遊小編帶來了二進位轉換BCD碼... 我的世界二進位轉換BCD碼的規則是什麼呢?
  • 基於RFID的二進位防碰撞算法的改進
    2 傳統二進位算法   2.1 傳統二進位算法的基本原理   在二進位搜索算法中,要能夠檢測出多張卡的存在,卡片的返回數據必須具有唯一性,且卡片在傳輸其UID(Ubiquitous Identifications,身份識別標籤)時必須準確、快速、同步,這是防碰撞檢測的關鍵。
  • 二進位、八進位、十進位與十六進位
    十、 二、八、十六進位的前20個數字對照表三、 二進位轉化成其他進位1. A 8)16訣竅:因為每四位二進位數對應一位十六進位數,所以,以小數點為界,整數位則將二進位數從右向左每4位一隔開,不足4位的在左邊用0填補即可;小數位則將二進位數從左向右每4位一隔開,不足4位的在右邊用0填補即可。
  • 二進位、八進位、十進位、十六進位相互轉化
    三、基數    基數是數制中所用的進位的數    十進位 基數是10    二進位 基數是2    八進位 基數是8    十六進位 基數是16四、位權    就是一個數字所在數位的大小    1000 十進位 ==> 4位上數字1所在的位置大小是10的4-1次方乘1
  • bcd碼和ascii碼的區別
    BCD碼   二進位編碼的十進位數,簡稱BCD碼(Binarycoded Decimal)。 這種方法是用4位二進位碼的組合代表十進位數的0,1,2,3,4,5,6 ,7,8,9 十個數符。4位二進位數碼有16種組合,原則上可任選其中的10種作為代碼,分別代表十進位中的0,1,2,3,4,5,6,7,8,9 這十個數符。
  • 經典算法題:懂二進位(小米筆試題)
    來自:2015小米暑期實習筆試題題目:世界上有10種人,一種懂二進位那麼你知道兩個int32整數m和n的二進位表達,有多少個位(bit)不同麼? 備註:1、不定期將從留言區選出認真答題的1名朋友,贈與書籍《算法詳解(卷1)》一本(兌獎方法跟獲獎者私下溝通)請留言,說出你的解題思路。不定期整理相關的問題答案分享。
  • 計算機基礎進位轉換(二進位、八進位、十進位、十六進位)
    1.十進位轉R進位1.1 十進位轉二進位十進位整數轉二進位十進位整數轉換成二進位採用「除2倒取餘」,十進位小數轉換成二進位小數採用
  • python進位轉換:十進位轉二進位的用法
    dec(十進位)—> bin(二進位)dec(十進位)—> oct(八進位)dec(十進位)—> hex(十六進位)二、十進位我們所熟知的十進位,其實是從 0 開始,數到 9 之後,就跳到
  • 51單片機整數二一十進位轉換的快速算法
    提出的快速算法思路是,首先求出整數中包含的1000的個數,方法是採用二進位整數的高6位作為其預估,再通過2次校正得到準確值。算法的關鍵是充分利用89C51單片機的兩條特殊指令――單字節乘和單字節除。其耗費時間不及使用sprintf()函數的1/10。
  • scratch+程小奔機器人實現「進位轉換」(十進位轉二進位)
    也就說滿十進一;而在計算機的世界裡,基礎電路只有「開/關(通/斷)」(即0/1)兩種情況,這與誕生幾千年的二進位不謀而合;例如:二進位數字110,表達的就是十進位中的6;二進位數字1111,表達的就是十進位中的15。
  • 03-1 算法推送--二進位
    unsigned 前綴的類型時,計算機儲存時會留出最高的二進位位用於儲存符號。(<<)、右移(>>)將二進位位向左/右平移若干位……值得注意的是,由於儲存是有限的,故我們還需要考慮溢出的問題,這時,我們定義:如,對於
  • 常用的二進位與八進位-十進位-十六進位之間的轉換
    1k1024k = 1M1024M = 1G1024G = 1Tb(bit) = 比特B(byte) = 字節KB = 千字節MB = 兆字節GB = 吉字節TB = 太字節內存中以二進位形式存儲數據,一個漢字一般為2位元組後面s只是因為數字不為1,