廖超平
摘? 要:該文以16位二進(jìn)制數(shù)為例,分析了N位二進(jìn)制-BCD轉(zhuǎn)換算法,并以此算法為根據(jù),應(yīng)用VHDL語(yǔ)言設(shè)計(jì)了一種實(shí)現(xiàn)N位二進(jìn)制-BCD轉(zhuǎn)換的電路。該設(shè)計(jì)的基本循環(huán)是將二進(jìn)制碼表示中各個(gè)數(shù)碼往左邊移動(dòng)一位,最高一位二進(jìn)制位的數(shù)碼移出二進(jìn)制表示進(jìn)入最低一位十進(jìn)制位的8421表示中,而每個(gè)十進(jìn)制位的8421表示中權(quán)為8的位的數(shù)碼都移到高1位十進(jìn)制位的8421表示中重新組合成新的8421表示。
關(guān)鍵詞:二進(jìn)制-BCD轉(zhuǎn)換? VHDL? 移位
中圖分類號(hào):TP303 ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2020)06(a)-0065-03
在非常多的數(shù)字系統(tǒng)的設(shè)計(jì)中,存在數(shù)據(jù)輸入,用戶習(xí)慣使用十進(jìn)制(BCD)碼形式,而數(shù)字系統(tǒng)內(nèi)部則使用二進(jìn)制。所以,在使用VHDL設(shè)計(jì)數(shù)字系統(tǒng)時(shí)多位二進(jìn)制-BCD轉(zhuǎn)換電路是經(jīng)常使用的。多位二進(jìn)制-BCD轉(zhuǎn)換電路在各種智能儀表、電子秤和數(shù)控機(jī)床等數(shù)字系統(tǒng)的設(shè)計(jì)中廣泛使用。
1? N位二進(jìn)制-BCD轉(zhuǎn)換算法分析
下面以十六位二進(jìn)制數(shù)字的二進(jìn)制- BCD 轉(zhuǎn)換為例分析多位二進(jìn)制- BCD轉(zhuǎn)換算法。十六位二進(jìn)制數(shù)字的二進(jìn)制碼表示的一般表達(dá)式如下:
下面算式中,最右邊的2的冪每降一次表示移動(dòng)一次數(shù)字。
上面分兩種情況,原因是為了保證下一次移位后,符合十進(jìn)制數(shù)進(jìn)位和十進(jìn)制數(shù)的表達(dá)形式,即:每位十進(jìn)制數(shù)碼應(yīng)該只能是0~9這10個(gè)數(shù)碼。
在X03=0時(shí),(A03,A02,A01,A00)是(0,0,0,0)~(0,1,0,0)這幾個(gè)值,向左邊移動(dòng)一位后,沒(méi)有對(duì)高一位的進(jìn)位,而且本位最大變成(1,0,0,A-4),符合十進(jìn)制的表達(dá)形式。
在X03=1時(shí),(A03,A02,A01,A00)是(0,1,0,1)~(1,0,0,1)向左邊移動(dòng)一位后,最少也是(1,0,1,A-4),存在對(duì)高一位的進(jìn)位,進(jìn)位是逢十進(jìn)一,所以要進(jìn)行修正。修正的方法就是A0加三變成X0后再移位。
以后每次移位都遵守同樣的規(guī)律,移動(dòng)16次后,即完成轉(zhuǎn)換過(guò)程。
2? N位二進(jìn)制-BCD轉(zhuǎn)換電路原理框圖
以16位二進(jìn)制數(shù)字為例,N位二進(jìn)制-BCD轉(zhuǎn)換電路原理框圖如圖1所示。
bit[15..0]是16位二進(jìn)制的bit輸入,clk1是移位時(shí)鐘,ret為復(fù)位,共有5個(gè)bit-BCD單元。每個(gè)單元負(fù)責(zé)一位BCD數(shù)碼的移位和加3或加0操作。轉(zhuǎn)換過(guò)程是先復(fù)位,并行輸入16位二進(jìn)制數(shù)的bit碼。然后,奇次時(shí)鐘到來(lái)時(shí)5個(gè)單元各自進(jìn)行加3或加0,偶次時(shí)鐘到來(lái)時(shí)移位。經(jīng)過(guò)了32個(gè)時(shí)鐘、16次移位完成整個(gè)轉(zhuǎn)換過(guò)程。
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? 仿真結(jié)果
該設(shè)計(jì)用Quartus II仿真,功能正確。典型仿真結(jié)果見(jiàn)圖2~圖4。
在圖2中,00010001101000/00轉(zhuǎn)換成4512。
在圖3中,0001111010101100轉(zhuǎn)換成7852。
在圖4中,0010001111000001轉(zhuǎn)換成9513。
參考文獻(xiàn)
[1] 王迎春,吉利久.一種基于簡(jiǎn)單移位的二—十進(jìn)制相互轉(zhuǎn)換算法[J].電子學(xué)報(bào),2003(2):221-224.
[2] 潘吳,鐘珞,陳杰.單片機(jī)十六進(jìn)制數(shù)與BCD碼轉(zhuǎn)換新探討[J].微機(jī)發(fā)展,1997(6):35-36.
[3] 高皚瓊.基于EDA技術(shù)的數(shù)字頻率計(jì)[J].計(jì)算機(jī)產(chǎn)品與流通,2018(8):58.