0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二分法查找在实际电路中的应用

8ECz_icstudy 来源:未知 作者:胡薇 2018-10-29 10:03 次阅读

1

首先问大家一个问题,如果有一堆有序的数据

1,2,3,4,5,6,7,8,9,10,11,...100

如果想要找出55,你要怎么实现呢?

最直观的是用线性查找,从头开始一个个的查找,需要55次才能找到目标数值。

如果大家学过C或者C++,应该有二分法查找的概念,先把这堆数分成2堆,把第一堆的最后一个数跟55比较,发现55比它大,所以55应该在第2堆。再重复这个过程,大概需要7次就可以确定55的位置。

二分法查找效率显而易见,它的时间复杂度T(n)=O(log(2)n),远远小于线性查找的T(n)=O(n)。

但二分法要求数据必须是有序排列的,这在实际电路世界里面往往是满足的。

利用二进制搜索(二分法查找)实现的逐次逼近算法,每次都是选取比较范围内的中间点来跟参考值进行比较,通过比较结果来继续缩小比较范围,一直迭代直至找到最接近比较值的解。

这个过程跟求方程(近似)解也非常类似。二进制搜索实现的逐次逼近常常用于需要校准的场景中,比如SAR ADCDRAM ZQ 校准、仪器校准算法等。因为我们的校准代码对应的值是线性增加或者减小的,符合二进制搜索法的条件。

2

下图是一个SAR ADC的基本架构:

电路的目标就是得到一个最接近Vin的VDAC,可以通过调整

SAR code配置DAC模块得到。

假设我们的SAR(逐次逼近寄存器)的位数是3位,初始状态设为SAR[2:0]=3'b100,也就是处于000-111的中间位置。

如果SAR的使能clock 开始toggle,比较过程就开始了:

如上图所示,X轴表示时间,Y轴表示DAC输出电压VDAC:

第1次比较: 设置SAR[2:0]=3'b100,VDAC=1/2 Vref < Vin , 所以SAR[2]保持1,SAR[2:0]=3'b100;

第2次比较: 设置SAR[2:0]=3'b110,VDAC=(1/2 Vref + 1/4 Vref)> Vin , 所以SAR[1]最终取0,SAR[2:0]=3'b100;

第3次比较: 设置SAR[2:0]=3'b101,VDAC=(1/2 Vref + 1/8 Vref)> Vin , 所以SAR[0]最终取0,SAR[2:0]=3'b100;

最终我们可以得到与输入电压Vin最接近的VDAC,可以看出SAR的位数越多,精度越高,但是比较周期数也会越来越多。

另外其第3次(最后一位)比较好像也没有必要,因为你比较完也无法得到一个相等值,可以把最后一位固定成1或者0,最大的误差就是最后一位代表的权重1/8 Vref。

2

前面是具体的SAR ADC的例子,我们可以进一步把二进制搜索SAR的过程画成流程图的形式,方便后续电路或者Verilog代码的实现:

初始化SAR的MSB=1, 其它bit为0 (比如4bit 4'b1000)

每次CLK go high ,走一步

如果INCR=1, 走图中实线箭头方向;

如果INCR=0, 走图中虚线箭头方向;

最低位LSB最终固定为1

4bit的SAR 一共需要走3步,也就是3个CLK周期后就可以得到最后的结果。

3

最后给出一个6位二进制搜索SAR logic电路的SPEC:

Input

INCR

RSTB reset信号,负沿有效

CLK

OUTPUT

PUCODE [5:0]

你觉得这个电路是用Verilog代码实现呢?

还是自己搭电路比较好?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路
    +关注

    关注

    172

    文章

    5905

    浏览量

    172158
  • 二进制
    +关注

    关注

    2

    文章

    795

    浏览量

    41645

原文标题:二进制搜索算法(二分法查找)在实际电路中的应用

文章出处:【微信号:icstudy,微信公众号:跟IC君一起学习集成电路】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用C语言实现高效查找二分法

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分
    的头像 发表于 06-04 08:04 1108次阅读
    如何用C语言实现高效<b class='flag-5'>查找</b>(<b class='flag-5'>二分法</b>)

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找
    发表于 10-19 19:33

    简单的查找算法

    ; } return 0;} 3. 有序数组表的查找:一般使用二分法查找。通过判断查找元素与中间元素(mid)的大小来决定下一次的查找
    发表于 12-27 22:33

    Labview实现二分法查找数值区间

    二分法是检索里经常用到的一种方法,可以实现对有序数组进行检索,本程序通过二分法实现对数据进行区间匹配,并输出最小匹配区间和匹配区间的索引值,尤其适合多段函数的数值计算。
    发表于 04-18 13:22

    浅析渐近表示二分法

    《算法图解》NOTE 1 算法的渐近表示以及二分法
    发表于 10-10 10:58

    C语言教程之二分查找

    C语言教程之二分查找,很好的C语言资料,快来学习吧。
    发表于 04-22 11:06 0次下载

    基于C语言二分查找排序源代码

    本文档内容介绍了C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序源代码,分享给大家供大家参考。
    发表于 01-04 11:24 1次下载

    基于二分法与移动Sink的无线传感器网络数据收集协议

    传感器节点能量的有限性,严重制约了无线传感器网络的推广与发展。因此,如何改善传感器节点能源的利用率、节约能耗以及提高整个网络的生存周期成为该领域研究者面临的挑战之一。 为延长网络生存周期,提出一种基于二分法与移动Sink的无线传感器网络数据收集协
    发表于 03-12 10:43 0次下载
    基于<b class='flag-5'>二分法</b>与移动Sink的无线传感器网络数据收集协议

    图像处理算法之二分查找

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
    的头像 发表于 03-17 11:29 4870次阅读

    如何利用verilog验证二分法查找的设计代码

    下面是产生输出文件的过程,这里我们设置输出结果的格式是fsdb,当然我们也可以设置成vcd的格式。fsdb的文件size比较小,而且利用verdi的波形工具nWave看起来也比较方便。实际项目
    的头像 发表于 11-26 14:39 5710次阅读

    详解C语言二分查找算法细节

    我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1。
    的头像 发表于 06-22 09:05 2807次阅读
    详解C语言<b class='flag-5'>二分</b><b class='flag-5'>查找</b>算法细节

    现代混合云服务对未来托管数据中心的意义

    与以前的版本不同,新的混合云框架更易于部署,并且消除了“云计算vs托管数据中心”的二分法
    的头像 发表于 08-21 11:00 1844次阅读

    筑基_C_5_对数组的二分查找

    C语言泛型编程,实现对数组某元素的二分查找
    发表于 12-06 10:21 9次下载
    筑基_C_5_对数组的<b class='flag-5'>二分</b><b class='flag-5'>查找</b>

    如何理解二分查找算法

    本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。 而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的
    的头像 发表于 04-19 11:10 618次阅读
    如何理解<b class='flag-5'>二分</b><b class='flag-5'>查找</b>算法

    FPGA设计中二分法查表算法的实现

    二分查找算法是软件中广泛应用的一种算法,那么FPGA的设计是否可以用这种算法呢?什么场景下会可能用到这种算法呢?
    的头像 发表于 09-06 18:26 1044次阅读
    FPGA设计中<b class='flag-5'>二分法</b>查表算法的实现