一種散列表的FPGA設計與實(shí)現
摘要:文章在簡(jiǎn)要介紹散列表工作原理的基礎上,提出了一種分離鏈接散列表的FPGA實(shí)現方案,并對方案涉及的各功能模塊實(shí)現進(jìn)行了詳細闡述。
關(guān)鍵詞:散列表;FPGA;Wishbone總線(xiàn);SRAM
0 引言
在軟硬件開(kāi)發(fā)過(guò)程中,經(jīng)常需要通過(guò)關(guān)鍵字對數據信息進(jìn)行存儲、查找、刪除等操作,從而實(shí)現數據信息的管理。散列表能夠以常數平均時(shí)間實(shí)現插入、刪除和查找,因此在實(shí)現過(guò)程中得到廣泛應用。本文基于FPGA設計并實(shí)現了一種分離鏈接法解決散列表,利用快速查找緩沖區提高查詢(xún)效率,采用空閑存儲區管理模塊實(shí)現存儲空間的高效分配及釋放。
1 工作原理
散列表根據設定的散列函數Hash(Key)和處理沖突的方法將一組關(guān)鍵字映像到一個(gè)有限的連續的地址區間上,并以關(guān)鍵字在地址集中的“像”作為記錄在表中的存儲位置。散列表的實(shí)現主要研究?jì)蓚€(gè)問(wèn)題:散列函數的選取和沖突解決的辦法。
1.1 散列函數選取
一個(gè)好的散列函數可以使關(guān)鍵字盡量隨機均勻地分布在散列表中,降低沖突發(fā)生的概率,提高散列表查找的效率。理想的散列函數對于關(guān)鍵字集合中的任一個(gè)關(guān)鍵字,經(jīng)散列后映象到地址集合中任何一個(gè)地址的概率是相等的??紤]到FPGA實(shí)現的效率及復雜度,本文采用了CRC算法作為散列函數,實(shí)現關(guān)鍵字到散列表地址的映射。
1.2 沖突解決方法
散列表解決沖突的方法主要有開(kāi)放地址法和分離鏈接法。在開(kāi)放定址散列算法系統中,如果有沖突發(fā)生,那么就要嘗試選擇另外的單元,直到找出空的單元位置。在分離鏈接散列算法系統,通過(guò)給新單元分配地址空間,建立鏈表來(lái)解決沖突。因為所有的數據都要置于表內,所以開(kāi)放定址散列法所需要的表要比分離鏈接散列用表大。一般說(shuō)來(lái),對開(kāi)放定址散列算法來(lái)說(shuō),裝填因子應低于0.5。
本文采用分離鏈接法解決散列表存在的沖突,建立如圖1所示散列表存儲結構,每個(gè)鏈表首地址存放在FPGA內部的連續RAM中,表元存放在SRAM芯片中。每個(gè)表元主要包含關(guān)鍵字(Key)、數據(Data)和下一表元地址(Next),由于關(guān)鍵字和下一表元地址字段訪(fǎng)問(wèn)頻繁,在FPGA實(shí)現過(guò)程中把這兩個(gè)字段置于每個(gè)表元的頭部,盡量在一次SRAM的Brust讀/寫(xiě)操作內完成。
2 FPGA實(shí)現
如圖2所示,分離鏈接散列表采用Wishbone總線(xiàn)標準接口與外部組件交互,采用接口控制器實(shí)現Wishbone總線(xiàn)管理,采用主控制器生成表元查找、表元添加、表元刪除等模塊的控制信號,采用存儲訪(fǎng)問(wèn)仲裁器實(shí)現各模塊SRAM訪(fǎng)問(wèn)的分時(shí)復用,采用基于內部CAM的快速查找緩沖模塊實(shí)現表元地址的快速查找。
2.1 接口控制器
接口控制器作為本模塊與FPGA內部其它功能模塊之間交互的橋梁通道,采用Wishbone總線(xiàn)接口標準。Wishbone總線(xiàn)是由Silicore公司開(kāi)發(fā)的完全免費的片上總線(xiàn)規范,具有靈活、“輕量級”的優(yōu)點(diǎn)。Wishone采用主/從設備架構,本模塊工作于從設備模式,支持“單次讀/寫(xiě)”和“塊讀/寫(xiě)”操作。接口控制器實(shí)現以下功能:
(1)根據地址信息的不同,調用不同的功能邏輯處理輸入數據,并返回應答;
(2)把關(guān)鍵字(Key)送到Hash運算模塊進(jìn)行運算;
(3)把命令類(lèi)型、Hash值、關(guān)鍵字按格式送入命令輸入緩沖區;
(4)把待寫(xiě)入SRAM的數據送入數據輸入緩沖區;
(5)處理狀態(tài)讀取命令,返回模塊當前狀態(tài);
(6)處理數據讀取命令,從緩沖區輸出數據、讀取數據并輸出。
2.2 主控制器
主控制器是散列表FPGA實(shí)現的核心模塊,循環(huán)讀取命令輸入緩沖區中的命令數據,并根據命令類(lèi)型生成表元查找、表元添加、表元刪除、空閑表元申請、空閑表元釋放及輸入/輸出等請求信號。
(1)主控制器在復位信號失效后,給空閑存儲區管理模塊發(fā)送初始化請求,在初始化完成后進(jìn)入空閑狀態(tài),等待命令輸入緩沖區送入的命令數據;
(2)主控制器在收到查找命令后,給表元查找模塊發(fā)送請求,匹配成功則根據命令內容給數據輸入/輸出模塊發(fā)送請求,完成數據讀取和寫(xiě)入,否則完成本次操作返回應答;
(3)主控制器在收到添加命令后,首先查找是否存在關(guān)鍵字匹配表元,匹配失敗則向緩沖區管理模塊發(fā)送請求獲取空閑表元,成功后根據命令內容給數據輸入/輸出模塊發(fā)送請求,完成數據讀取和寫(xiě)入。
(4)主控制器在收到刪除命令后,首先查找是否存在關(guān)鍵字匹配表元,匹配成功則向表元刪除模塊發(fā)送請求,并在刪除成功后釋放緩沖區到空閑緩沖區池。
評論