在微控制器裡面,如:顯示個溫度值,這時,要取乙個數的個位、十位、百位,可以用/和 %(求商和求餘)來解決。
但是,在fpga裡面用求商和求餘將會非常消耗資源,這樣就必須用到二進位制轉bcd碼了,這裡介紹一種簡單的加3移位演算法。
注:b代表二進位制,d代表十進位制,0x代表十六進製制,bcd
為bcd
碼,下同。
1、加3
移位法
以二進位制數(0000_101 xn
)b=(10+xn)d
為例,序列輸入三位後,(0101)b=5(d)
左移一位後:(000
0_101xn)b=
(10+xn)d
如果(000
0_101xn)
b直接輸出顯示為:
當xn=0
時,000
0_1010=0x0a。此為錯誤的bcd碼。
採用加3
移位法,修正移位結果:
序列輸入三位後,結果大於4
(0101)b
=5(d
) 加3:(0101)b+
(0011)b
=(1000)b
--十進位制表示:
5+3=
8再左移一位後:
(1000xn)
b= (
0001_000xn)
bcd
對應十進位制顯示:1 xn
每四位bcd
碼對應一位十進位制數,即:(
10+xn)d
,轉換成功
注:xn
為下一位序列輸入的二進位制數。
2、設計思路
這裡一共需要四個模組:計數器、移位器、加法器、暫存器輸出。
分別設計好之後,用狀態機控制它們,就完成了。
3、**結果
注:圖中clk
為時鐘,en
為高電平使能,
rst為高電平復位,
data_in
為輸入的
12位二進位製碼,以十進位制的形式顯示在時序圖;
qout
為輸出的16位
bcd碼,以十六進製制的形式顯示在時序圖,
17個時鐘上公升沿可完成轉換任務。
4、綜合結果
5、難點分析
要搞懂這個加3移位演算法,必須要按照
8位二進位制(
11101011
)轉bcd
過程圖,自己手動推導一下,才容易理解。
此演算法的難點在於,需要把輸入的二進位制數,按照每四個bit來劃分為乙個單元(所以輸入的二進位制數,位寬必須是4的倍數),然後,每個單元都要同時判斷是否大於4,大於就要加3,否則不加.
理解了這個演算法之後,那麼bcd轉二進位制就非常容易了,減3移位即可,減3可以用補碼來解決。
加3移位法只能把整數的二進位製碼轉成整數的bcd碼,小數則不行,要算小數的話,可以先乘以10的n次方,再轉bcd碼。 6、
參考文獻
基於cpld的二進位製碼轉換為二.十進位制(bcd)碼的電路――薑田華
32位二進位制數轉BCD碼
32位二進位制數轉bcd碼 基本思想是逢十進1 module bin bcd 4 clk,a,bww,bqw,baw,bsw,bw,bq,bb,bs,bg input clk input 31 0 a 二進位制輸入資料 output 3 0 bww,bqw,baw,bsw,bw,bq,bb,bs,b...
c 轉bcd碼 BCD碼 十六進製制與十進位制互轉
在做嵌入式軟體的設計中,經常會遇到十六進製制 bcd碼與十進位制之間的轉換,最近做m1卡的應用中,涉及了大量的十六進製制 bcd碼與十進位制之間的轉換。筆者通過對bcd碼 十六進製制 權的理解,輕鬆的實現了他們之間的互換。include include 功能 二進位製取反 輸入 const unsi...
Gray碼 格雷碼 二進位制
以下內容是看了matrix67的關於二進位制的blog link 的一點總結與摘錄。gray碼,中文 格雷碼 是一種特殊的編碼,相鄰兩個格雷碼的二進位制表示中有且僅有一位不同,且 n 階 gray 碼是 0 2 n 1 的乙個排列。n 階 gray 碼可以由 n 1 階 gray 碼映象翻轉之後最前...