数字计算小技巧——verilog中如何判断一个数是否在某个范围之内

本文转载自: FPGA的现今未微信公众号

在数学中,假如要判断一个数x是否在[a,b]内还是一件比较简单的事情,只要x满足a <= x <= b就行,如果在verilog语言中如何判断呢?

背景

最近的项目中,就遇到了这个问题。需要对数据进行过滤,只有x在[a,b]之内的时候,x才可以通过。其中x、a、b这3个数都不是固定的,假定它们都是8bit数据。能否直接用a <= x <= b这个公式了,显然是不可以的,因为这3个数都有可能翻转。比如:

我们可以看到上述的三种情况下,虽然都都不满足公式a <= x <= b,但是却都在[a,b]范围之内。那究竟如何判断呢?后来和同事讨论,找到了一些简易方法。

方案1

我们知道,当a和b没有翻转的时候,这个判断是很简单的。所以这个问题要分2步,第一是判断a和b之间是否出现翻转,第二步再判断x是否在a和b之间。

判断a和b是否翻转方法很多,最简单的就是判断b是否大于a,如果大于,说明没有翻转,否则就翻转了。如果没有翻转,就看是否满足公式a <= x <= b,如果翻转了,就需要采用特殊的比较了。

在翻转的场景下,可以把a和b从0这个点分开,只要大于a或者小于b的都在这个范围内,所以这个公司就变成 a<=x || x <= b。

方案2

我们知道,在数轴上,2个点之间的距离就是绝对值,那么在一个圆上也可以采用类似的方案。如果x在a和b之间的话,那么a到x点的距离和到x点到b点的距离,都应该小于a到b之间的距离。

在计算距离的时候,到底谁减谁,这里定一个规则,在用Verilog描述时,比如a到b的距离,不用考虑溢出,直接用b-a,因为a到x的距离=x-a,x到b的距离=b-x,a到b的距离=b-a。

基于上述的规则,我们就可以很容易地判断x是否在a和b之间了。这里举2个例子,判断0是否在[251,2]之间。

1,先计算a到x的距离,0 - 251 = 5;

2、计算x到b的距离,即2 - 0 = 2;

3、计算a到b的距离,即2 - 251 = 7

4、判断,5 < 7 & 2 < 7,所以0在[251,2]之间。

再举一个例子,判断3是否在[251,2]之间。

1,先计算a到x的距离,3 - 251 = 8;

2、计算x到b的距离,即2 - 3 = 255,这也说明了从3到2需要“跑一圈”;

3、计算a到b的距离,即2 - 251 = 7

4、判断,8 > 7 & 255 < 7,所以3不在[251,2]之间。

方案3

方案2中,我们要做3次计算和2次判断,我们换一个思路:x要在a和b之间的话,那么a到x的距离一定是小于或者等于a到b的距离。还是以上面的3个例子为例,判断0是否在[251,2]之间?

1,先计算b到a的距离,2 - 251 = 7;

2、计算x到a的距离,即0 - 251 = 5;

3、判断2个距离的大小,5 < 7,所以0在[251,2]之间。

这个方法,只需要2次计算和一次比较,方案3相比方案2来说,计算更加简单。

是否还有其他的计算方案呢?欢迎留言讨论。

最新文章

最新文章