摘要:介紹了用超高速集成電路硬件描述語言(VHDL),設(shè)計(jì)數(shù)字集成系統(tǒng)中快速查表電路的方案,這種查表算法具有并行運(yùn)行的特點(diǎn),并能夠同時(shí)查找多種參數(shù)。該查表電路用FPGA予以實(shí)現(xiàn)。
關(guān)鍵詞:VHDL語;查表算法;并行運(yùn)行;可編程邏輯陣列
1 引言
某大型醫(yī)用電子設(shè)備的檢測(cè)部分是由32個(gè)子系統(tǒng)組成。每個(gè)子系統(tǒng)又含有8個(gè)block電路,每個(gè)block要處理4個(gè)光電倍增管產(chǎn)生的位置、能量和時(shí)間信息。均勻分布在空間圓周上的256個(gè)block對(duì)接收的同位素輻射信號(hào)進(jìn)行處理后,給出每個(gè)信號(hào)的相應(yīng)參數(shù)信息送給成像系統(tǒng)作進(jìn)一步處理。我們將每個(gè)子系統(tǒng)的8個(gè)block電路集成到一片F(xiàn)PGA芯片中,并用單片機(jī)予以控制。本文將著重介紹block電路中快速查表電路的設(shè)計(jì)。
2設(shè)計(jì)方案
2.1查表算法
每個(gè)block電路的前端檢測(cè)部分有64塊晶體條,它們排列成8×8陣列。每塊晶體條設(shè)有左邊界值X1、右邊界值X2、下邊界值Y1、上邊界值Y2,以及能量下邊界值E1、能量上邊界值E2、時(shí)間修正值T和晶條號(hào)N,這些參數(shù)被存放在FPGA的內(nèi)部存儲(chǔ)器中。在系統(tǒng)運(yùn)行時(shí),根據(jù)同位素輻射信號(hào)的位置值a、 b,可以通過查表電路確定是哪一塊晶體條接受到該信號(hào),并且可同時(shí)確定信號(hào)的能量狀態(tài)和校正信號(hào)的時(shí)間信息。
軸的坐標(biāo)編碼。每一塊晶體條與X、Y有著一一對(duì)應(yīng)的關(guān)系。例如X=110B,Y=000B時(shí),對(duì)應(yīng)的是6號(hào)晶體條。若將此表格的信息存放在存儲(chǔ)器中,并設(shè) X為地址編碼的低3位,Y為高3位,則地址編碼范圍為000000B~111111B,對(duì)應(yīng)的晶體條的編號(hào)為0~63。
查表時(shí),首先從X=100B,Y=100B(即36號(hào)晶體條)開始,將進(jìn)入本區(qū)域同位素輻射信號(hào)的位置值a、b同時(shí)與36號(hào)晶體條的邊界值X1、X2、 Y1、Y2進(jìn)行比較。若a<X1,則X減1;a>X2,X加1;X1<a<X2,X保持不變。同理,若b<Y1,則Y減1;b>Y2,Y加1;Y1<b <Y2,Y保持不變。首次比較結(jié)束后,若X或Y的坐標(biāo)編碼發(fā)生了變化,則地址指針便指向新的晶體條號(hào)。再將同一信號(hào)的位置值a、b與新的晶體條邊界值進(jìn)行比較,如此循環(huán)往復(fù),直到X和Y均停止變化。這時(shí),表明同位素輻射信號(hào)的位置值落入某一晶體條的邊界之內(nèi),即該晶體條接收到此輻射信號(hào)。由于X或Y以 100B為起點(diǎn),它們的最大變化范圍為100B~000B,因此,這種查表算法可在五步之內(nèi)從64塊晶體條中查找出接收到信號(hào)的晶體條。
2.2 信息存儲(chǔ)
FPGA內(nèi)部存儲(chǔ)器存放信息的示意圖如圖2所示。與各塊晶體條有關(guān)的參數(shù)分別存放在8個(gè)存儲(chǔ)區(qū)內(nèi),每個(gè)存儲(chǔ)區(qū)含有64個(gè)字節(jié)。其中,X2、X1組成一個(gè) 16位的字節(jié),占據(jù)RAM A 地址為00H~3FH的存儲(chǔ)單元;E2、E1組成一個(gè)16位的字節(jié),占據(jù)RAM A地址為40H~7FH的存儲(chǔ)單元。同理,Y2、Y1組成一個(gè)16位的字節(jié),占據(jù)RAM B地址為80H~BFH的存儲(chǔ)單元;N、T組成一個(gè)16位的字節(jié),占據(jù)RAM B地址為C0H~FFH的存儲(chǔ)單元。其中X1、X2、Y1、Y2的6~0位地址碼相同,E1、E2、N、T的6~0位地址碼相同。存儲(chǔ)器地址的5~3位對(duì)應(yīng)于Y坐標(biāo)編碼,2~0位對(duì)應(yīng)于X坐標(biāo)編碼,第6位對(duì)應(yīng)于奇偶控制碼G。因此,地址碼的6~0位可表示為address<=G& Y&X。顯然,圖2中8個(gè)參數(shù)的5~0位的地址碼相同。我們把與同一塊晶體條相關(guān)的參數(shù)存放在5~0位地址碼相同的存儲(chǔ)單元中。這樣,只要我們根據(jù)晶體條的邊界值X1、X2、Y1和Y2,查找到接收信號(hào)的晶體條,僅需改變地址碼的第6位G,就可以找到與該晶體條相關(guān)的參數(shù)E1、E2、N和T。在這種情況下,RAM A的地址碼可表示為ADDR_A<='0' &G&Y&X,RAM B的地址碼為ADDR_B<='1' &G&Y&X。

信息存儲(chǔ)的另一種方式是把X2、X1組成的16位字節(jié)存放在RAM A的偶地址存儲(chǔ)單元,而把E2、E1組成的16位字節(jié)存放在RAM A的奇地址存儲(chǔ)單元;同理,把Y2、Y1組成的16位字節(jié)存放在RAM B的偶地址存儲(chǔ)單元,N、T組成的16位字節(jié)存放在RAM B的奇地址存儲(chǔ)單元。在這種存儲(chǔ)方式下,RAM A和RAM B的地址碼應(yīng)分別表示為ADDR_A<='0' &Y&X&G與ADDR_B<='1' &Y&X&G。本設(shè)計(jì)采用的是后一種信息存儲(chǔ)方式。
2.3 查表電路設(shè)計(jì)
快速查表電路的方框圖如圖3所示。在系統(tǒng)設(shè)置狀態(tài),X計(jì)數(shù)器與Y計(jì)數(shù)器串行工作,地址發(fā)生器產(chǎn)生順序變化的地址信號(hào)。在單片機(jī)的控制下,存儲(chǔ)器可與數(shù)據(jù)總線交換需要存儲(chǔ)的信息。在查表狀態(tài),奇偶控制碼G=0,存儲(chǔ)器中的晶體條的邊界值X1、X2、Y1、Y2被同時(shí)送入比較器,與同位素輻射信號(hào)的位置值a、 b進(jìn)行比較,并產(chǎn)生相應(yīng)的加/減控制信號(hào)。此時(shí),X計(jì)數(shù)器與Y計(jì)數(shù)器并行工作,并分別以100B為計(jì)數(shù)起點(diǎn),根據(jù)加/減控制信號(hào)進(jìn)行可逆計(jì)數(shù)。這時(shí)地址發(fā)生器產(chǎn)生躍變的地址信號(hào)。在經(jīng)過5個(gè)基本時(shí)鐘后,查表結(jié)束,地址指針停止變化,表明已找到待查的晶體條。在數(shù)據(jù)處理期間,奇偶控制碼G=1,這時(shí),地址指針指向與該晶體條相關(guān)的各種參數(shù)E1、E2、N和T。這些參數(shù)被送到后續(xù)電路作進(jìn)一步處理。
3 設(shè)計(jì)與實(shí)現(xiàn)
3.1 RAM的設(shè)計(jì)
本系統(tǒng)采用VHDL語言進(jìn)行設(shè)計(jì)。對(duì)于RAM的設(shè)計(jì)而言,若采用一般的程序設(shè)計(jì)方法來設(shè)計(jì),將會(huì)占用大量的FPGA資源。由于本系統(tǒng)所需的RAM很多,因此,會(huì)造成系統(tǒng)資源不夠的狀況。若選擇外設(shè)RAM,又會(huì)大大降低查表速度,同時(shí)也降低了系統(tǒng)的集成度。最終我們選擇應(yīng)用FPGA內(nèi)部的塊RAM作為存儲(chǔ)器,則很好地解決了上述問題。下面介紹塊RAM的設(shè)計(jì)方法。
FPGA中有專門的雙口讀/寫同步片內(nèi)塊RAM,每個(gè)塊RAM有4096個(gè)存儲(chǔ)單元,塊RAM的每個(gè)存儲(chǔ)口可以配置成讀/寫口,一個(gè)讀口,一個(gè)寫口,也可以配置成規(guī)定的數(shù)據(jù)寬度。
下面給出將塊RAM配置成寬度為16,深度為256的單口存儲(chǔ)器設(shè)計(jì)實(shí)例。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ram is
port(we:in std_logic; --讀/寫信號(hào)
en:in std_logic; --使能信號(hào)
rst:in std_logic; --復(fù)位信號(hào)
clk:in std_logic; --時(shí)鐘信號(hào)
addr:in std_logic_vector(7 downto 0); --地址總線
din:in std_logic_vector(15 downto 0); --輸入數(shù)據(jù)總線
dout:out std_logic_vector(15 downto 0)); --輸出數(shù)據(jù)總線
end ram;
architecture ram_arch of ram is
component RAMB4_S16
--synopsys translat_off
generic(INIT_00,INIT_01,INIT_02,INIT_03,INIT_04,INIT_05,INIT_06,INIT_07,INIT_08,INIT_09,
INIT_0a,INIT_0b,INIT_0c,INIT_0d,INIT_0e,INIT_0f:
bit_vector(255 downto 0)
:=X"0000000000000000000000000000000000000000000000000000000000000000");
--synopsys translate_on
port(we,en,rst,clk:in std_logic;
addr:in std_logic_vector(7 downto 0);
di:in std_logic_vector(15 downto 0);
do:out std_logic_vector(15 downto 0));
end component;
--synopsys dc_script_begin
--set_attribute ram0 INIT_00
--"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
--type string
--synopsys dc_script_end
begin
ram0:RAMB4_S16
--synopsys translate_off
generic map(
INIT_00=>
X"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF")
--synopsys translate_on
port map(we,en,rst,clk,addr,din,dout);
end ram_arch;
本設(shè)計(jì)將塊RAM配置成寬度為16,深度為256的雙口存儲(chǔ)器,每個(gè)塊RAM內(nèi)部又分成兩個(gè)存儲(chǔ)區(qū)RAM A和RAM B,它們的寬度為16,深度為128,其存儲(chǔ)容量可表示為128×16×2,地址碼分別為ADDR_A 和RAM_ B。因此,完全可以滿足信息存儲(chǔ)的要求。
3.2 地址計(jì)數(shù)器的設(shè)計(jì)
地址計(jì)數(shù)器完成對(duì)地址碼中X和Y的控制。在系統(tǒng)設(shè)置狀態(tài),X計(jì)數(shù)器與Y計(jì)數(shù)器串行工作,計(jì)數(shù)器只進(jìn)行加計(jì)數(shù);而在查表狀態(tài),兩個(gè)計(jì)數(shù)器并行工作,同時(shí)進(jìn)行加/減計(jì)數(shù)。下面給出地址計(jì)數(shù)器的設(shè)計(jì)程序。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity counter is
port ( up: in std_logic; --加計(jì)數(shù)控制
dn: in std_logic; --減計(jì)數(shù)控制
ld: in std_logic; --預(yù)置數(shù)控制
clr: in std_logic; --清零
clk: in std_logic; --基本時(shí)鐘
ce: in std_logic; --計(jì)數(shù)器使能
p: in std_logic; --計(jì)數(shù)方式控制(串行或并行)
cry: out std_logic; --計(jì)數(shù)器進(jìn)位標(biāo)志
q: buffer std_logic_vector (2 downto 0) ); --計(jì)數(shù)值輸出
end counter;
architecture counter_arch of counter is
begin
process(ld,up,dn,ce,p,clr,clk,q)
begin
if clr='1' then
q<="000";
elsif (clk='0') and (clk'event) then
if (ld='1') then
q<="011";
elsif ce='1' and p='1' then
if (up='1') and (dn='0') then
q<=q+1;
elsif (up='0') and (dn='1') then
q<=q-1;
else
null;
end if;
else
null;
end if;
end if;
if (q="111") then
cry <= '1';
else
cry<='0';
end if;
end process;
end counter_arch;
以上快速查表電路的設(shè)計(jì),經(jīng)實(shí)際調(diào)試驗(yàn)證,達(dá)到了系統(tǒng)設(shè)計(jì)要求。
4 結(jié)束語
VHDL是一種并行計(jì)算機(jī)語言,用它設(shè)計(jì)的查表電路具有并行運(yùn)行的特點(diǎn)。這種并行工作方式是任何一種基于CPU的軟件程序語言所無法描述和實(shí)現(xiàn)的。該查表電路充分利用了FPGA內(nèi)部的存儲(chǔ)器資源,實(shí)現(xiàn)了快速查表的功能。





