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
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593265
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134412
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7362
收藏 人收藏

    评论

    相关推荐

    怎么用FPGA算法 如何在FPGA实现最大公约数算法

    FPGA算法的优点在于它们可以提供高度的定制化和灵活性,使得算法可以根据实际需求进行优化和调整。此外,FPGA还可以实现硬件加速,提供比传统
    的头像 发表于 01-15 16:03 622次阅读

    浮点LMS算法FPGA实现

    运算的运算步骤远比定点运算繁琐,运算速度慢且所需硬件资源大大增加,因此基于浮点运算的LMS算法的硬件实现一直以来是学者们研究的难点和热点。 本文正是基于这种高效结构的多输入FPA,在FPGA上成功
    的头像 发表于 12-21 16:40 308次阅读

    redis hash底层实现原理

    Redis是一个开源的内存数据库,使用键值对存储数据。其中,Redis中的数据结构之一就是哈希(Hash),它提供了一种将多个字段(Field)存储在一个键(Key)中的方法。那么Redis的哈希
    的头像 发表于 12-04 16:27 256次阅读

    基于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 1745次阅读
    <b class='flag-5'>HASH</b><b class='flag-5'>算法</b>加密芯片的工作原理及其在STM32 MCU上的应用

    基于Rust语言Hash特征的基础用法和进阶用法

    是一种通用的哈希算法,用于将任意类型的数据转换为固定长度的哈希值。下面是一个简单的示例,演示如何使用Hash trait计
    的头像 发表于 09-19 16:02 741次阅读

    请问如何将C语言算法移植到FPGA上?

    确定算法:首先,你需要确保要移植的C语言算法是合适的。FPGA适合并行计算和高度可定制的应用。因此,你需要选择一个适合FPGA实现
    发表于 09-12 17:20 1043次阅读

    FPGA算法映射要点

    将图像处理的算法转换为FPGA系统设计的过程称为算法映射,CPU并行算法实现FPGA并行
    的头像 发表于 09-11 10:45 316次阅读
    <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 404次阅读
    <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 400次阅读
    <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 413次阅读
    <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 1835次阅读
    怎么用<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 902次阅读
    求一种<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>图像去雾的<b class='flag-5'>实现</b>设计方案

    FPGA实现PID控制算法

    相信大家对于PID控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及FOC中的闭环控制中也是用的它,它不仅简单,而且易于理解。那么本篇文章将简要介绍一下算法的原理,然后带大家使用
    的头像 发表于 05-19 16:40 1238次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>PID控制<b class='flag-5'>算法</b>

    采用FPGA实现FFT算法示例

     目前,硬件实现FFT算法的方案主要有:通用数字信号处理器(DSP)、FFT专用器件和现场可编程门阵列(FPGA)。DSP具有纯软件实现的灵活性,适用于流程复杂的
    的头像 发表于 05-11 15:31 1931次阅读
    采用<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>FFT<b class='flag-5'>算法</b>示例