LUT专治花里胡哨

LUT专治花里胡哨

  • LUT介绍
  • coding技巧
    • 全0全1比较
    • 加1比较
    • 判断是否为one-hot

LUT介绍

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

coding技巧

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

全0全1比较

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

加1比较

LUT专治花里胡哨_第3张图片
LUT专治花里胡哨_第4张图片
做实验之前没想到上面那个算法(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

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

你可能感兴趣的:(FPGA,coding)