廖超平



摘? 要:該文以16位二進制數為例,分析了N位二進制-BCD轉換算法,并以此算法為根據,應用VHDL語言設計了一種實現N位二進制-BCD轉換的電路。該設計的基本循環是將二進制碼表示中各個數碼往左邊移動一位,最高一位二進制位的數碼移出二進制表示進入最低一位十進制位的8421表示中,而每個十進制位的8421表示中權為8的位的數碼都移到高1位十進制位的8421表示中重新組合成新的8421表示。
關鍵詞:二進制-BCD轉換? VHDL? 移位
中圖分類號:TP303 ? ?文獻標識碼:A 文章編號:1672-3791(2020)06(a)-0065-03
在非常多的數字系統的設計中,存在數據輸入,用戶習慣使用十進制(BCD)碼形式,而數字系統內部則使用二進制。所以,在使用VHDL設計數字系統時多位二進制-BCD轉換電路是經常使用的。多位二進制-BCD轉換電路在各種智能儀表、電子秤和數控機床等數字系統的設計中廣泛使用。
1? N位二進制-BCD轉換算法分析
下面以十六位二進制數字的二進制- BCD 轉換為例分析多位二進制- BCD轉換算法。十六位二進制數字的二進制碼表示的一般表達式如下:
下面算式中,最右邊的2的冪每降一次表示移動一次數字。
上面分兩種情況,原因是為了保證下一次移位后,符合十進制數進位和十進制數的表達形式,即:每位十進制數碼應該只能是0~9這10個數碼。
在X03=0時,(A03,A02,A01,A00)是(0,0,0,0)~(0,1,0,0)這幾個值,向左邊移動一位后,沒有對高一位的進位,而且本位最大變成(1,0,0,A-4),符合十進制的表達形式。
在X03=1時,(A03,A02,A01,A00)是(0,1,0,1)~(1,0,0,1)向左邊移動一位后,最少也是(1,0,1,A-4),存在對高一位的進位,進位是逢十進一,所以要進行修正。修正的方法就是A0加三變成X0后再移位。
以后每次移位都遵守同樣的規律,移動16次后,即完成轉換過程。
2? N位二進制-BCD轉換電路原理框圖
以16位二進制數字為例,N位二進制-BCD轉換電路原理框圖如圖1所示。
bit[15..0]是16位二進制的bit輸入,clk1是移位時鐘,ret為復位,共有5個bit-BCD單元。每個單元負責一位BCD數碼的移位和加3或加0操作。轉換過程是先復位,并行輸入16位二進制數的bit碼。然后,奇次時鐘到來時5個單元各自進行加3或加0,偶次時鐘到來時移位。經過了32個時鐘、16次移位完成整個轉換過程。
3? bit-bcd單元VHDL代碼
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY bit_bcd IS
PORT ( ck : IN? STD_LOGIC;
ret? : IN? STD_LOGIC;
c? : IN STD_LOGIC;
a? : OUT? STD_LOGIC_VECTOR(3 DOWNTO 0);
b? : OUT? STD_LOGIC ) ;
END bit_bcd;
ARCHITECTURE one OF bit_bcd IS
signal t : std_logic;
signal q ,c1,c2: std_logic_vector(3 downto 0);
BEGIN
b <= c1(3); a <= c1;
PROCESS( ck,ret )
BEGIN
if ret = '0' then
t <= '0';
elsif ck'event and ck = '1' then
t <= not t;
end if;
END PROCESS ;
PROCESS( ck,ret,c )
BEGIN
if ret = '0' then
c1<= "0000";
elsif ck'event and ck = '1' then
if t='1' then
c1(0)<=c;c1(1)<=c1(0);c1(2)<=c1(1);c1(3)<=c1(2);
else c1<=c2;
end if;
end if;
END PROCESS ;
PROCESS( c1 )
BEGIN
CASE? c1? IS
WHEN"0000"=>? c2<="0000";--0011
WHEN"0001"=>? c2<="0001";--0100
WHEN"0010"=>? c2<="0010";--0101
WHEN"0011"=>? c2<="0011";--0110
WHEN "0100" =>? c2 <= "0100" ;--0111
WHEN "0101" =>? c2 <= "1000" ;--1000
WHEN "0110" =>? c2 <= "1001" ;--1001
WHEN "0111" =>? c2 <= "1010" ;--1010
WHEN "1000" =>? c2 <= "1011" ;--1011
WHEN "1001" =>? c2 <= "1100" ;--1100
WHEN OTHERS =>? c2 <= "0000" ;--0000
END CASE ;
END PROCESS ;
END ;
4? 仿真結果
該設計用Quartus II仿真,功能正確。典型仿真結果見圖2~圖4。
在圖2中,00010001101000/00轉換成4512。
在圖3中,0001111010101100轉換成7852。
在圖4中,0010001111000001轉換成9513。
參考文獻
[1] 王迎春,吉利久.一種基于簡單移位的二—十進制相互轉換算法[J].電子學報,2003(2):221-224.
[2] 潘吳,鐘珞,陳杰.單片機十六進制數與BCD碼轉換新探討[J].微機發展,1997(6):35-36.
[3] 高皚瓊.基于EDA技術的數字頻率計[J].計算機產品與流通,2018(8):58.