摘要:介紹了用超高速集成電路硬件描述語言(VHDL),設計數字集成系統中快速查表電路的方案,這種查表算法具有并行運行的特點,并能夠同時查找多種參數。該查表電路用FPGA予以實現。
關鍵詞:VHDL語;查表算法;并行運行;可編程邏輯陣列
1 引言
某大型醫用電子設備的檢測部分是由32個子系統組成。每個子系統又含有8個block電路,每個block要處理4個光電倍增管產生的位置、能量和時間信息。均勻分布在空間圓周上的256個block對接收的同位素輻射信號進行處理后,給出每個信號的相應參數信息送給成像系統作進一步處理。我們將每個子系統的8個block電路集成到一片FPGA芯片中,并用單片機予以控制。本文將著重介紹block電路中快速查表電路的設計。
2設計方案
2.1查表算法
每個block電路的前端檢測部分有64塊晶體條,它們排列成8×8陣列。每塊晶體條設有左邊界值X1、右邊界值X2、下邊界值Y1、上邊界值Y2,以及能量下邊界值E1、能量上邊界值E2、時間修正值T和晶條號N,這些參數被存放在FPGA的內部存儲器中。在系統運行時,根據同位素輻射信號的位置值a、 b,可以通過查表電路確定是哪一塊晶體條接受到該信號,并且可同時確定信號的能量狀態和校正信號的時間信息。
軸的坐標編碼。每一塊晶體條與X、Y有著一一對應的關系。例如X=110B,Y=000B時,對應的是6號晶體條。若將此表格的信息存放在存儲器中,并設 X為地址編碼的低3位,Y為高3位,則地址編碼范圍為000000B~111111B,對應的晶體條的編號為0~63。
查表時,首先從X=100B,Y=100B(即36號晶體條)開始,將進入本區域同位素輻射信號的位置值a、b同時與36號晶體條的邊界值X1、X2、 Y1、Y2進行比較。若a<X1,則X減1;a>X2,X加1;X1<a<X2,X保持不變。同理,若b<Y1,則Y減1;b>Y2,Y加1;Y1<b <Y2,Y保持不變。比較結束后,若X或Y的坐標編碼發生了變化,則地址指針便指向新的晶體條號。再將同一信號的位置值a、b與新的晶體條邊界值進行比較,如此循環往復,直到X和Y均停止變化。這時,表明同位素輻射信號的位置值落入某一晶體條的邊界之內,即該晶體條接收到此輻射信號。由于X或Y以 100B為起點,它們的變化范圍為100B~000B,因此,這種查表算法可在五步之內從64塊晶體條中查找出接收到信號的晶體條。
2.2 信息存儲
FPGA內部存儲器存放信息的示意圖如圖1所示。與各塊晶體條有關的參數分別存放在8個存儲區內,每個存儲區含有64個字節。其中,X2、X1組成一個 16位的字節,占據RAM A 地址為00H~3FH的存儲單元;E2、E1組成一個16位的字節,占據RAM A地址為40H~7FH的存儲單元。同理,Y2、Y1組成一個16位的字節,占據RAM B地址為80H~BFH的存儲單元;N、T組成一個16位的字節,占據RAM B地址為C0H~FFH的存儲單元。其中X1、X2、Y1、Y2的6~0位地址碼相同,E1、E2、N、T的6~0位地址碼相同。存儲器地址的5~3位對應于Y坐標編碼,2~0位對應于X坐標編碼,第6位對應于奇偶控制碼G。因此,地址碼的6~0位可表示為address<=G& Y&X。顯然,圖1中8個參數的5~0位的地址碼相同。我們把與同一塊晶體條相關的參數存放在5~0位地址碼相同的存儲單元中。這樣,只要我們根據晶體條的邊界值X1、X2、Y1和Y2,查找到接收信號的晶體條,僅需改變地址碼的第6位G,就可以找到與該晶體條相關的參數E1、E2、N和T。在這種情況下,RAM A的地址碼可表示為ADDR_A<='0' &G&Y&X,RAM B的地址碼為ADDR_B<='1' &G&Y&X。
圖1
信息存儲的另一種方式是把X2、X1組成的16位字節存放在RAM A的偶地址存儲單元,而把E2、E1組成的16位字節存放在RAM A的奇地址存儲單元;同理,把Y2、Y1組成的16位字節存放在RAM B的偶地址存儲單元,N、T組成的16位字節存放在RAM B的奇地址存儲單元。在這種存儲方式下,RAM A和RAM B的地址碼應分別表示為ADDR_A<='0' &Y&X&G與ADDR_B<='1' &Y&X&G。本設計采用的是后一種信息存儲方式。
2.3 查表電路設計
快速查表電路的方框圖如圖2所示。在系統設置狀態,X計數器與Y計數器串行工作,地址發生器產生順序變化的地址信號。在單片機的控制下,存儲器可與數據總線交換需要存儲的信息。在查表狀態,奇偶控制碼G=0,存儲器中的晶體條的邊界值X1、X2、Y1、Y2被同時送入比較器,與同位素輻射信號的位置值a、 b進行比較,并產生相應的加/減控制信號。此時,X計數器與Y計數器并行工作,并分別以100B為計數起點,根據加/減控制信號進行可逆計數。這時地址發生器產生躍變的地址信號。在經過5個基本時鐘后,查表結束,地址指針停止變化,表明已找到待查的晶體條。在數據處理期間,奇偶控制碼G=1,這時,地址指針指向與該晶體條相關的各種參數E1、E2、N和T。這些參數被送到后續電路作進一步處理。
圖2
3 設計與實現
3.1 RAM的設計
本系統采用VHDL語言進行設計。對于RAM的設計而言,若采用一般的程序設計方法來設計,將會占用大量的FPGA資源。由于本系統所需的RAM很多,因此,會造成系統資源不夠的狀況。若選擇外設RAM,又會大大降低查表速度,同時也降低了系統的集成度。終我們選擇應用FPGA內部的塊RAM作為存儲器,則很好地解決了上述問題。下面介紹塊RAM的設計方法。
FPGA中有專門的雙口讀/寫同步片內塊RAM,每個塊RAM有4096個存儲單元,塊RAM的每個存儲口可以配置成讀/寫口,一個讀口,一個寫口,也可以配置成規定的數據寬度。
下面給出將塊RAM配置成寬度為16,深度為256的單口存儲器設計實例。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ram is
port(we:in std_logic; --讀/寫信號
en:in std_logic; --使能信號
rst:in std_logic; --復位信號
clk:in std_logic; --時鐘信號
addr:in std_logic_vector(7 downto 0); --地址總線
din:in std_logic_vector(15 downto 0); --輸入數據總線
dout:out std_logic_vector(15 downto 0)); --輸出數據總線
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;
本設計將塊RAM配置成寬度為16,深度為256的雙口存儲器,每個塊RAM內部又分成兩個存儲區RAM A和RAM B,它們的寬度為16,深度為128,其存儲容量可表示為128×16×2,地址碼分別為ADDR_A 和RAM_ B。因此,完全可以滿足信息存儲的要求。
3.2 地址計數器的設計
地址計數器完成對地址碼中X和Y的控制。在系統設置狀態,X計數器與Y計數器串行工作,計數器只進行加計數;而在查表狀態,兩個計數器并行工作,同時進行加/減計數。下面給出地址計數器的設計程序。
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; --加計數控制
dn: in std_logic; --減計數控制
ld: in std_logic; --預置數控制
clr: in std_logic; --清零
clk: in std_logic; --基本時鐘
ce: in std_logic; --計數器使能
p: in std_logic; --計數方式控制(串行或并行)
cry: out std_logic; --計數器進位標志
q: buffer std_logic_vector (2 downto 0) ); --計數值輸出
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;
以上快速查表電路的設計,經實際調試驗證,達到了系統設計要求。
4 結束語
VHDL是一種并行計算機語言,用它設計的查表電路具有并行運行的特點。這種并行工作方式是任何一種基于CPU的軟件程序語言所無法描述和實現的。該查表電路充分利用了FPGA內部的存儲器資源,實現了快速查表的功能。