LUT专治花里胡哨

LUT介绍

LUT是xilinx FPGA最底层资源,各代FPGA都会使用的基础资源。
参见这篇文章:https://blog.csdn.net/times_poem/article/details/51351997

coding技巧

初学Verilog、VHDL这类硬件描述语言的时候,老师都让我们在写代码的时候有硬件思维,要在写代码的时候就将数字电路图给画出来。就是说写代码的时候要想到代码最终实现与非门、选择器等等。直到我做了以下几个实验,才发现当面向FPGA设计的时候,上面被奉为圭臬的准则就是有问题的了。因为FPGA的基础资源是LUT,而不是门逻辑。

全0全1比较

全0全1比较 rtl
全0全1比较 sch
由此处综合出来的原理图对比可以看出(a_i == 16’hffff)和(|a_i == 0)最终的结果是一样的逻辑。因为上面两个运算都是16输入到1输出。另外上面代码里面的全0和全1的四个输出所消耗的资源都是一样的,因为这四个运算都是16到1的lut过程。不管查找的运算多复杂,其消耗的资源都是一样的。

加1比较

sum cmp rtl
sum cmp sch
做实验之前没想到上面那个算法(a)耗这么多资源,也没有想到下面这个算法(b)就耗这么点资源。稍微分析一下确实是这样。
首先算法a要做加法,做加法就要消耗大量的lut和相应的carry资源。做完加法还要做一个8bit比较,其实就是8输入1输出的lut。
但是算法b,表面上看要做两次比较,但是实际上是一个9输入1输出的lut。
这是实验来源于tcp的校验checksum计算过程。使用算法b减少一次加法,可以很简单就能省掉资源。
此处有tcp checksum的介绍:https://blog.csdn.net/a_tu_/article/details/84840592

判断是否为one-hot

one-hot rtl
one-hot判断
这个实验里面写了三种判断一个8bit值是不是one-hot的情况。方法1是直接判断输入是不是等于8种one-hot的情况;第二种方法is_one_hot8是一个函数,方法是用case来判断是不是one-hot的情况;第三种方法是for循环将所有bit加起来,看看加起来的值是否等于1.
看起来三种方法实现是有挺大区别的,但是实际上都是8输入1输出的查找表,所以最终对应到lut上结果很相似,也不会说因为第三种方法有加法、有for循环会消耗很多资源。实际上只要最终lut查找表输入输出是一样的,代码怎么写,最终的实现区别并不大。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值