唐龍
摘要:計(jì)算機(jī)中十進(jìn)制和二進(jìn)制數(shù)據(jù)的轉(zhuǎn)換,一般是通過軟件來實(shí)現(xiàn)。但是基于馮·諾依曼結(jié)構(gòu)的計(jì)算機(jī),其指令是順序執(zhí)行的;而FPGA是并行執(zhí)行方式,適合真正意義上的并行任務(wù)處理。因此基于VHDL編程實(shí)現(xiàn)從整數(shù)中提取個(gè)十百位,其執(zhí)行速度要比采用軟件語言編程快得多。
關(guān)鍵詞:VHDL;進(jìn)制轉(zhuǎn)換;算法;效率
0.引言
歷史上第一臺(tái)電子數(shù)字計(jì)算機(jī)ENIAC是一臺(tái)十進(jìn)制機(jī)器,其數(shù)字以十進(jìn)制表示,并以十進(jìn)制形式運(yùn)算。而自然界具有兩種穩(wěn)定狀態(tài)的組件普遍存在,如開關(guān)的開和關(guān),電路的通和斷,電壓的高和低等,非常適合表示計(jì)算機(jī)中的數(shù)。因此,現(xiàn)在改為二進(jìn)制計(jì)算機(jī)。但由于二進(jìn)制數(shù)不直觀,人們在操作計(jì)算機(jī)時(shí),輸入、輸出的數(shù)據(jù)一般使用十進(jìn)制,因此需要通過軟件將十進(jìn)制轉(zhuǎn)換為二進(jìn)制。但是基于馮·諾依曼結(jié)構(gòu)的計(jì)算機(jī)在運(yùn)行程序時(shí),均為先取出指令然后執(zhí)行,并且指令是順序執(zhí)行的,其運(yùn)算效率較低;而FPGA(包括CPLD)是并行執(zhí)行方式,即當(dāng)時(shí)鐘沿到來時(shí),所有的觸發(fā)器都會(huì)動(dòng)作,其執(zhí)行效率較高。以下給出了兩種基于VHDL編程的從整數(shù)中提取個(gè)十百位的算法。
1.算法一
求余->除->再求余->再除……
例如:
…… --此處省略庫和實(shí)體描述
architecture bhv of conv is
begin process(clk,in8) --in8為輸入的8位二進(jìn)制數(shù)
variable tmp,q1,q2:integer range 0 to 255; --定義3個(gè)變量
begin tmp:=conv_integer(in8); --將二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)
q1:=tmp/10; q2:=q1/10; --除以10
if clk'event and clk='1' then
out1<=conv_std_logic_vector(tmp rem 10,4); --除10取余后轉(zhuǎn)換為4位二進(jìn)制數(shù)
out2<=conv_std_logic_vector(q1 rem 10,4);
out3<=conv_std_logic_vector(q2 rem 10,4);
end if; end process; end bhv;
程序執(zhí)行后,out1,out2,out3分別是個(gè)位,十位,百位。
2.算法二
在FPGA內(nèi)部定義3個(gè)寄存器,分別表示個(gè)位、十位、百位,讓其實(shí)現(xiàn)0—999的千進(jìn)制計(jì)數(shù),當(dāng)計(jì)數(shù)值等于輸入的整數(shù)值時(shí),計(jì)數(shù)停止,然后按順序提取個(gè)十百位。
例如:
…… --此處省略庫和實(shí)體描述
architecture a of conv is
signal da,db,dc:std_logic_vector(3 downto 0);
--定義3個(gè)信號(hào),分別代表個(gè)十百位
begin process(clk,in8) --in8為輸入的8位二進(jìn)制數(shù)
variable tmp: integer range 0 to 999 :=0; --定義1個(gè)變量,初始值為0
beginif(clk'event and clk='1') then
if(tmp if(da=9 and db=9 and dc=9) then --以下為千進(jìn)制計(jì)數(shù) 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 --當(dāng)計(jì)數(shù)值等于輸入的整數(shù)值時(shí),計(jì)數(shù)停止,然后按順序提取個(gè)十百位。 tmp:=0; da<="0000"; db<="0000"; dc<="0000";a0<=da; a1<=db; a2<=dc; end if; end if; end process; end a; 程序執(zhí)行后,a0,a1,a2分別是個(gè)位,十位,百位。 3.結(jié)束語 在數(shù)據(jù)處理中經(jīng)常會(huì)遇到二進(jìn)制與十進(jìn)制的轉(zhuǎn)換,但由于MCU、CPU、DSP等的內(nèi)部結(jié)構(gòu)都是設(shè)計(jì)好的,所以只能通過軟件編程來進(jìn)行順序處理,速度相對較慢,F(xiàn)PGA則可以并行處理,完全可以將一個(gè)二進(jìn)制數(shù)據(jù)作為輸入,然后直接在內(nèi)存中輸出對應(yīng)的ASCII碼,這個(gè)速度是非常快的,只受限于內(nèi)存讀取速度。 參考文獻(xiàn) [1] 潘松,黃繼業(yè).EDA技術(shù)實(shí)用教程—VHDL版[M].北京:科學(xué)出版社,2010. [2] 何小海,嚴(yán)華.微機(jī)原理與接口技術(shù)[M].北京:科學(xué)出版社,2006.