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 adc、dram 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[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代码实现呢?
还是自己搭电路比较好?
西门子贴片机操作时的相关注意事项都有哪些
适用于智能汽车并发实时仿真的高效率传感器功能模型
shijidianli电缆绝缘电阻多少合格
如何使用Arduino和Arduino控制步进电机
云测试自动化中的Python
浅析二分法查找在实际电路中的应用
学生最需要的一款数码产品,性价比蓝牙耳机!
GD32VF103:采用RISC-V内核设计的MCU
工信部:5年内将中国打造成全球机器人中心
【服务器数据恢复】IBM存储AIX系统下的raid5数据恢复案例
今日新闻:小米Play自带流量 荣耀V20即将发布
可测毫安级别的小电流探头都有哪些?
中华映管现已采用涂覆iXsenic金属氧化物的半导体涂层
DDR、DDR2、DDR3、DDR4、LPDDR的区别
戴尔PCIe 5.0来了,企业用户需要知道什么?
发布《5G核心技术开源开放白皮书》
红外热成像技术由于疫情有什么改变的
Firefox添加了价格明智的测试试验实验
微控制器STM32L系列(ST)
连接器行业是一个高度专业化且竞争较为充分的市场