1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      基于VHDL語言的快速查表電路

      更新時間: 2007-10-05 21:25:01來源: 粵嵌教育瀏覽量:1482

        摘要:介紹了用超高速集成電路硬件描述語言(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內部的存儲器資源,實現了快速查表的功能。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 在线点播日韩欧美精品 | 日本最新一区二区三区免费看 | 天天综合亚洲日韩在线 | 羞羞影院午夜男女爽爽在线观看 | 中文字幕日韩亚洲 | 午夜福利久久性色 |