唐龍
摘要:計算機中十進制和二進制數據的轉換,一般是通過軟件來實現。但是基于馮·諾依曼結構的計算機,其指令是順序執行的;而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.