廖超平
摘 要:本文以四位十进制数为例,分析了N位BCD-二进制转换算法,并以此算法为根据,应用VHDL语言设计了一种实现N位BCD-二進制转换的电路。本设计的基本循环是将BCD码表示中各个数码往右边移动一位,每个十进制位的8421表示中权为1的位的数码都移到低1位十进制位的8421表示中重新组合成新的8421表示,而最低一位十进制位的8421表示中权为1的位的数码则移出8421表示成为二进制表示。
关键词:BCD-二进制转换 VHDL 移位
中图分类号:TP303 文献标识码:A 文章编号:1672-3791(2018)05(a)-0003-03
相当大一类的数字系统的人机交互存在数据输入,使用者习惯数据表达为十进制(BCD)码形式,而数字系统内部则以二进制为方便。所以,在使用VHDL设计数字系统时多位BCD-二进制转换电路是必需的。多位BCD-二进制转换电路在各种有人工数据输入的系统,比如:智能仪表、电子秤和数控机床等数字系统的设计中广泛使用。
1 N位BCD-二进制转换算法分析
下面以四位十进制数字的BCD-二进制转换为例分析多位BCD-二进制转换算法。四位十进制数字M的BCD码表示的一般表达式如下:
M:A33A32 A31A30 A23A22 A21A20 A13A12 A11A10 A03A02 A01A00
(其中Aij=0或1,i=0,1,2,3;j=0,1,2,3)
它表示数字大小为:
M=(A33·23+A32·22+A31·21+A30)·103+(A23·23+A22·22+A21·21+A20)·102+(A13·23+A12·22+A11·21+A10)·101+(A03·23+A02·22+A01·21+A00)
先讨论后面两项之间的变换:
(A13·23+A12·22+A11·21+A10)·101+(A03·23+A02·22+A01·21+A00)
=(A13·23 +A12·22 + A11·21)·101+(A10·101+ A03·23 +A02·22 + A01·21) + A00
=(A13·22 +A12·21 + A11)·101·2 +(A10·23 + A03·22 +A02·21 + A01- A10·3)·2 + A00
以上变换是把十进制个位的BCD码8421表示中的权为1的这位右移出十进制个位的BCD码8421表示,而将十进制十位的BCD码8421表示中的权为1的这位右移出十进制十位的BCD码8421表示,进入个位的BCD码8421表示中重新组成新的个位的BCD码8421表示:
(B03·23+B02·22+B01·21+B00)=(A10·23+A03·22+A02·21+A01-A10·3)
其中项-A10·3表示:在A10=1时需要减去3(用二进制表示是11),在A10=0时则需要减去0,并且这种运算只在个位的BCD码8421表示内部进行。
对更高位做同样的变换得到表达式如下:
M=[(B33·23+B32·22+B31·21+B30)·103+(B23·23+B22·22+B21·21+B20)·102+(B13·23+B12·22+B11·21+B10)·101+(B03·23+B02·22+B01·21+B00)+B-1·2-1]·2
这里:B-1= A00,
B03·23+B02·22+B01·21+B00=A10·23+A03·22+A02·21+ A01-A10·3
B13·23+B12·22+B11·21+B10=A20·23+A13·22 + A12·21+A11-A20·3
B23·23+B22·22+B21·21+B20=A30·23+A23·22+A22·21+ A21-A30·3
B33·23+B32·22+B31·21+B30=0·23+A33·22+A32·21+ A31-0·3
其中B33=0。这样一轮变换表示M的BCD码表示中各个数码往右边移动一位,每个十进制位的8421表示中权为1的位的数码都移到低1位十进制位的8421表示中重新组合成新的8421表示,新的一轮8421表示与原来一轮8421表示的关系如上。
如果右移1位数码表示除以2的话,B-1= A00成为M的最低的1位二进制表示数码。
重复一次以上一轮变换得到M的最低2位二进制表示数码:C-1= B00,C-2=B-1= A00。
这样重复16轮变换,依次用Aij,Bij,B-k,Cij,C-k,…,Gij,G-k(i,j=0,1,2,3)来表示各轮变换的二进制数码,就得到M的二进制表示所有的数码。因Gij=0(i,j=0,1,2,3),所以,
M=[G-1·2-1+ G-2·2-2+ G-3·2-3+…+ G-16·2-16] ·216
= G-1·215+ G-2·214+ G-3·213+…+ G-16。
G-16= A00,G-15= B00,…,G-1= F00。
2 N位BCD-二进制转换电路原理框图
以四位十进制数字为例,N位BCD-二进制转换电路原理框图如图1所示。
A[15..0]是四位十进制数的BCD输入,ck是移位时钟,ret为复位,共有四个BCD-bit单元。每个单元负责一位BCD数码的移位和减3或减0操作。转换过程是先并行输入四位十进制数的BCD码,然后复位。奇次时钟到来时移位,偶次时钟到来时4个单元各自进行减3或减0。每移位一次有一位二进制数码进入移位寄存器bit-shift单元,经过了32个时钟,16次移位完成整个转换过程。
3 BCD-bit单元VHDL代码
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY bcd_bit IS
PORT ( ck : IN STD_LOGIC;
a : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
b : IN STD_LOGIC;
ret : IN STD_LOGIC;
c : OUT STD_LOGIC;
c3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END bcd_bit;
ARCHITECTURE one OF bcd_bit IS
signal t : std_logic;
signal q ,c1,c2: std_logic_vector(3 downto 0);
BEGIN
c <= c1(0); c3 <= 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,a ) --移位
BEGIN
if ret = '0' then
c1 <= a;
elsif ck'event and ck = '1' then
if t='0' then
c1(3)<=b;c1(2)<=c1(3);c1(1)<=c1(2);c1(0)<=c1(1);
else c1<=c2;
end if;
end if;
END PROCESS ;
PROCESS( c1 ) --減3或0
BEGIN
CASE c1 IS
WHEN "0000" => c2 <= "0000" ;
WHEN "0001" => c2 <= "0001" ;
WHEN "0010" => c2 <= "0010" ;
WHEN "0011" => c2 <= "0011" ;
WHEN "0100" => c2 <= "0100" ;
WHEN "0101" => c2 <= "0101" ;
WHEN "0110" => c2 <= "0110" ;
WHEN "0111" => c2 <= "0111" ;
WHEN "1000" => c2 <= "0101" ;
WHEN "1001" => c2 <= "0110" ;
WHEN "1010" => c2 <= "0111" ;
WHEN "1011" => c2 <= "1000" ;
WHEN "1100" => c2 <= "1001" ;
WHEN "1101" => c2 <= "1010" ;
WHEN "1110" => c2 <= "1011" ;
WHEN "1111" => c2 <= "1100" ;
WHEN OTHERS => c2 <= "0000" ;
END CASE ;
END PROCESS ;
END ;
4 仿真结果
本设计用Quartus II仿真,功能正确。典型仿真结果如图2~图4所示。
在图2中,复位后,经过了32个时钟,16次移位完成整个转换过程。
在图3中,7896转换成0001111011011000。
在图4中,6797转换成0001101010001101。
在图5中,7657转换成0001110111101001。
参考文献
[1] 王迎春.一种基于简单移位的二-十进制相互转换算法[J].电子学报,2003(2):221-224.
[2] 潘昊,钟珞,陈杰.单片机十六进制数与BCD码转换新探讨[J].微机发展,1997(6):35-36.
[3] 潘松.EDA技术与VHDL[M].北京:清华大学出版社,2005.