<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

hash算法在FPGA中的實現(1)

CHANBAEK ? 來源: FPGA的現今未 ? 作者: FPGA的現今未 ? 2023-09-07 17:01 ? 次閱讀

FPGA的設計中,尤其是在通信領域,經常會遇到hash算法的實現。hash算法在FPGA的設計中,它主要包括2個部分,第一個就是如何選擇一個好的hash函數,減少碰撞;第二個就是如何管理hash表。本文不討論hash算法本身,僅說明hash表的管理。

原理

先對齊本文中要說明的幾個概況,如下圖所示,hash函數的輸入稱為key,hash函數的輸出,稱為hash值,或者index。以上稱呼可能不標準,但是不影響對方案的理解即可。

圖片

hash算法的實現可以用一個很簡單的圖來表示,如下圖所示,對輸入的key做hash運算后,得到index,以index作為地址,把key值存入到其index對應的hash表中。同理,在查詢的時候,也是先對key計算hash值,然后查hash表,如果hash表無效,說明沒有命中,如果有效,則判斷hash表中的key和輸入的key是否相等,相等則為命中。

圖片

舉2個例子簡單說明下,假定key5,計算出index = 0,但是add0為空,所以key5沒有命中,或者說,hash表中沒有key5這個元素。假定key6,計算hash后得到index = 3,hash表addr3中有數據,但是存放在addr3中的數據為key4,不等于key6,所以key6也沒有命中。

hash表構建

上圖hash表的示意圖其實已經說明了一個簡單的hash表的構建,在FPGA內部,常用BRAM來存放一個hash表,上圖所示hash表的深度為N,每個hash表中存放一個key。假如key的位寬為50個bit,hash后的index位寬為9bit。那么hash表就需要一個64bit*512表項,消耗1個M36K(以xilinx的資源為例)。

但是事情肯定沒有這么簡單,因為只要有hash的地方就有沖突。那么下一步就是要解決hash沖突的問題。

解決hash沖突最常見的方案就是hash鏈表,如下圖所示,key1、key5、key7具有相同的hash值,可以通過一個鏈表的形式將他們串聯在一起。這種方案在軟件是可能是非常好實現的,但是在FPGA里實現可能就比較難了,比如鏈表的最大深度為多少呢?每個hash桶的鏈表是單獨存放還是所有的存放在一起呢?

圖片

我們知道一個好的hash函數,應該是要盡可能地減少沖突的。如果從算法上我們證明了,我們的沖突最多不超過4次,那就有更加簡單的方案來實現這個hash表了。

我們把hash表做一個改進,如下圖所示,我們每個hash桶中,不再是存放一個key,而是最多存放4個key,也就是不用鏈表來解決hash沖突問題。

圖片

這樣做的好處有2個,一個是沒有了對鏈表的處理,比較簡單,第二個就是處理速度快,一次讀操作就把具有相同hash值的所有key值全部讀出來進行比較。那這種方案在FPGA的ram中如何實現呢?還是以key的寬度為50bit,index的位寬為9bit為例。

一個桶的內部結果如下圖所示,每個key還需要1bit指示是否有效,那么4個key需要514 = 204bit,用一個216bit512的BRAM即可,消耗2.5個M36K。

圖片

如果key的位寬非常大,比如是五元組,一共104bit,如果用上述的方案,那就是105*4 = 420bit,那就需要6個M36K來存放??梢?,key的位寬越大,消耗的資源就越多。

hash表的優化

如果我的設計,要的就是速度,對資源的消耗不是很關系,那用上述的結構即可,如果我的設計可以犧牲一點點性能,但是需要減少資源的消耗,怎么辦呢?

我們可以把hash桶的內部結構修改下,由拼位寬改成拼深度,如下圖所示:

圖片

分別以50bit和104bit的key為例,對于50bit的key,需要的存儲為64bit5124,需要4個M36K。對于104bit的key,需要的存儲為108bit5124,需要6塊??此菩枰木彺娌]有減少,有的情況下甚至增加了。

如果hash值是8bit了,那情況就不一樣了。因為hash值為8bit和9bit的時候,BRAM的深度的增加,并沒有帶來額外的資源消耗,但是表項的寬度卻只有原來的一半,資源也就可以減少一半。比如原來hash表位 288bit256,需要消耗4個M36K,采用上述的優化方案后,表項變成144512,只需要消耗2個M36K。

除了上述的對hash桶的改進外,有時候可以同時拼寬度和深度,如下圖所示:

圖片

總結

hash表的設計,需要兼顧資源和性能問題。主要的考慮點就是充分利用BRAM 的特性來實現資源和性能的平衡。

圖片

當然,hash表也可以不放在BRAM中,存放在DDR里,那就演變成另外一個話題,如何高效地讀寫DDR中的hash表了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1608

    文章

    21355

    瀏覽量

    594333
  • 通信
    +關注

    關注

    18

    文章

    5729

    瀏覽量

    134608
  • 函數
    +關注

    關注

    3

    文章

    4107

    瀏覽量

    61423
  • Hash算法
    +關注

    關注

    0

    文章

    43

    瀏覽量

    7366
收藏 人收藏

    評論

    相關推薦

    FPGA實現什么樣的算法?

    FPGA功能如此強大,請問用FPGA實現或者比較適合實現什么樣的算法?
    發表于 05-26 20:18

    怎么用FPGA算法 如何在FPGA實現最大公約數算法

    FPGA算法的優點在于它們可以提供高度的定制化和靈活性,使得算法可以根據實際需求進行優化和調整。此外,FPGA還可以實現硬件加速,提供比傳統
    的頭像 發表于 01-15 16:03 ?755次閱讀

    浮點LMS算法FPGA實現

    運算的運算步驟遠比定點運算繁瑣,運算速度慢且所需硬件資源大大增加,因此基于浮點運算的LMS算法的硬件實現一直以來是學者們研究的難點和熱點。 本文正是基于這種高效結構的多輸入FPA,在FPGA上成功
    的頭像 發表于 12-21 16:40 ?382次閱讀

    redis hash底層實現原理

    Redis是一個開源的內存數據庫,使用鍵值對存儲數據。其中,Redis中的數據結構之一就是哈希(Hash),它提供了一種將多個字段(Field)存儲在一個鍵(Key)中的方法。那么Redis的哈希
    的頭像 發表于 12-04 16:27 ?299次閱讀

    基于FPGA的窄帶干擾抑制算法實現方案

    電子發燒友網站提供《基于FPGA的窄帶干擾抑制算法實現方案.pdf》資料免費下載
    發表于 11-07 09:29 ?0次下載
    基于<b class='flag-5'>FPGA</b>的窄帶干擾抑制<b class='flag-5'>算法</b>的<b class='flag-5'>實現</b>方案

    HASH算法加密芯片的工作原理及其在STM32 MCU上的應用

    本文主要研究了HASH算法加密芯片的工作原理及其在STM32 MCU上的應用,實現了外部加密芯片對STM32 MCU的程序保護,目前的技術手段無法對其進行破解,其安全性優于其它加密方式。
    的頭像 發表于 10-24 15:01 ?2099次閱讀
    <b class='flag-5'>HASH</b><b class='flag-5'>算法</b>加密芯片的工作原理及其在STM32 MCU上的應用

    基于Rust語言Hash特征的基礎用法和進階用法

    是一種通用的哈希算法,用于將任意類型的數據轉換為固定長度的哈希值。下面是一個簡單的示例,演示如何使用Hash trait計
    的頭像 發表于 09-19 16:02 ?828次閱讀

    數字信號處理的FPGA實現

    FPGA正在掀起一場數字信號處理的變革。本書旨在講解前端數字信號處理算法的高效實現。首先概述了當前的FPGA技術、器件以及用于設計最先進DSP系統的工具。第
    發表于 09-19 06:38

    請問如何將C語言算法移植到FPGA上?

    確定算法:首先,你需要確保要移植的C語言算法是合適的。FPGA適合并行計算和高度可定制的應用。因此,你需要選擇一個適合FPGA實現
    發表于 09-12 17:20 ?1130次閱讀

    FPGA算法映射要點

    將圖像處理的算法轉換為FPGA系統設計的過程稱為算法映射,CPU并行算法實現FPGA并行
    的頭像 發表于 09-11 10:45 ?356次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>算法</b>映射要點

    hash算法FPGA中的實現(4)

    在前面的文章中主要介紹了hash表及其鏈表的結構,以及key值的插入方法,既然有key值的插入,那就有key值的刪除,一種刪除是CPU通過重新刷新鏈表來刪除,另外一種就是FPGA刪除了,這里主要討論FPGA如何刪除鏈表。
    的頭像 發表于 09-07 17:03 ?423次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>實現</b>(4)

    hash算法FPGA中的實現(3)

    在前面的文章中主要介紹了hash表及其鏈表的結構,同時說明了如何讀取表項。那表項是如何寫入的了?前期的文章中有少量的提及,這里單獨寫一篇,介紹兩種常見的方案。
    的頭像 發表于 09-07 17:02 ?449次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>實現</b>(3)

    hash算法FPGA中的實現(2)

    在前面的文章中:hash算法FPGA中的實現(一)——hash表的組建,記錄了關于hash表的
    的頭像 發表于 09-07 17:02 ?436次閱讀
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>實現</b>(2)

    怎么用FPGA算法 如何在FPGA實現最大公約數算法

    FPGA算法是指在FPGA(現場可編程門陣列)上實現算法。FPGA是一種可重構的硬件設備,可以
    的頭像 發表于 08-16 14:31 ?1984次閱讀
    怎么用<b class='flag-5'>FPGA</b>做<b class='flag-5'>算法</b> 如何在<b class='flag-5'>FPGA</b>上<b class='flag-5'>實現</b>最大公約數<b class='flag-5'>算法</b>

    求一種FPGA實現圖像去霧的實現設計方案

    本文詳細描述了FPGA實現圖像去霧的實現設計方案,采用暗通道先驗算法實現,并利用verilog并行執行的特點對
    發表于 06-05 17:01 ?930次閱讀
    求一種<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>圖像去霧的<b class='flag-5'>實現</b>設計方案
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>