唐龙
摘要:计算机中十进制和二进制数据的转换,一般是通过软件来实现。但是基于冯·诺依曼结构的计算机,其指令是顺序执行的;而FPGA是并行执行方式,适合真正意义上的并行任务处理。因此基于VHDL编程实现从整数中提取个十百位,其执行速度要比采用软件语言编程快得多。
关键词:VHDL;进制转换;算法;效率
0.引言
历史上第一台电子数字计算机ENIAC是一台十进制机器,其数字以十进制表示,并以十进制形式运算。而自然界具有两种稳定状态的组件普遍存在,如开关的开和关,电路的通和断,电压的高和低等,非常适合表示计算机中的数。因此,现在改为二进制计算机。但由于二进制数不直观,人们在操作计算机时,输入、输出的数据一般使用十进制,因此需要通过软件将十进制转换为二进制。但是基于冯·诺依曼结构的计算机在运行程序时,均为先取出指令然后执行,并且指令是顺序执行的,其运算效率较低;而FPGA(包括CPLD)是并行执行方式,即当时钟沿到来时,所有的触发器都会动作,其执行效率较高。以下给出了两种基于VHDL编程的从整数中提取个十百位的算法。
1.算法一
求余->除->再求余->再除……
例如:
…… --此处省略库和实体描述
architecture bhv of conv is
begin process(clk,in8) --in8为输入的8位二进制数
variable tmp,q1,q2:integer range 0 to 255; --定义3个变量
begin tmp:=conv_integer(in8); --将二进制数转换为十进制数
q1:=tmp/10; q2:=q1/10; --除以10
if clk'event and clk='1' then
out1<=conv_std_logic_vector(tmp rem 10,4); --除10取余后转换为4位二进制数
out2<=conv_std_logic_vector(q1 rem 10,4);
out3<=conv_std_logic_vector(q2 rem 10,4);
end if; end process; end bhv;
程序执行后,out1,out2,out3分别是个位,十位,百位。
2.算法二
在FPGA内部定义3个寄存器,分别表示个位、十位、百位,让其实现0—999的千进制计数,当计数值等于输入的整数值时,计数停止,然后按顺序提取个十百位。
例如:
…… --此处省略库和实体描述
architecture a of conv is
signal da,db,dc:std_logic_vector(3 downto 0);
--定义3个信号,分别代表个十百位
begin process(clk,in8) --in8为输入的8位二进制数
variable tmp: integer range 0 to 999 :=0; --定义1个变量,初始值为0
beginif(clk'event and clk='1') then
if(tmp if(da=9 and db=9 and dc=9) then --以下为千进制计数 da<="0000"; db<="0000"; dc<="0000"; elsif(da=9 and db=9) then da<="0000"; db<="0000"; dc<=dc+1; tmp:=tmp+1; elsif(da=9)then da<="0000"; db<=db+1; tmp:=tmp+1; else da<=da+1; tmp:=tmp+1; end if; else --当计数值等于输入的整数值时,计数停止,然后按顺序提取个十百位。 tmp:=0; da<="0000"; db<="0000"; dc<="0000";a0<=da; a1<=db; a2<=dc; end if; end if; end process; end a; 程序执行后,a0,a1,a2分别是个位,十位,百位。 3.结束语 在数据处理中经常会遇到二进制与十进制的转换,但由于MCU、CPU、DSP等的内部结构都是设计好的,所以只能通过软件编程来进行顺序处理,速度相对较慢,FPGA则可以并行处理,完全可以将一个二进制数据作为输入,然后直接在内存中输出对应的ASCII码,这个速度是非常快的,只受限于内存读取速度。 参考文献 [1] 潘松,黄继业.EDA技术实用教程—VHDL版[M].北京:科学出版社,2010. [2] 何小海,严华.微机原理与接口技术[M].北京:科学出版社,2006.