模拟模拟乘法,混合 CPU 的一部分(为了好玩)

电器工程 模拟 中央处理器 乘数
2022-01-07 04:31:27

简短版:如何制作一个采用两个模拟直流输入的模拟乘法器?

长版:


我发表了一条评论,推荐 Ben Eaters 视频作为另一个问题,同时我最终自己(再次)观看了一些视频并自言自语“嗯……我想知道将某些部分制作成纯粹的模拟会不会更容易”。

总线可能只是一根线,不同的电压电平稍后将通过 ADC 转换为位。

只是弄乱了一点,我走了这么远,理论上可以计算斐波那契数:

在此处输入图像描述
图 1,混合计算机计算第一个斐波那契数的小演示

链接到模拟器。

在上面的 gif 中,我超出了电压范围,因此很容易看到斐波那契数,实际上我只使用 250 mV = 二进制 1(“设定值”处的 LSB),然后让它通过每个电容器容纳 4 位的 DRAM。

在 gif 中要查看的重要部分是“a+b”文本右侧的运算放大器的输出,它显示了斐波那契数。

在每次操作之间,我会使用 ADC 和 DAC 来量化答案。因此,如果我读取 1.1V,那么 DAC 会将其转换为 1.0V,然后将其存储在 DRAM 中。然后每个 X 时钟一次,整个 DRAM 必须通过量化器以确保电容器不会飘走

ALU 只能做 +、- 和平均。我正在考虑进行乘法运算并停了下来。我以前制作并看到过基于二极管的乘法器,但我不想使用它们,因为二极管必须匹配。我宁愿使用可以用电位器微调的电阻器。Anywhoo,我想出了一个混合乘法器,半模拟,半数字。

所以我做了第一个,到处都是相同的电阻。

在此处输入图像描述
图 2,数字数字和模拟值之间的简单乘数。数字值偏移 1。

然后我用二进制权重变成了这个:

在此处输入图像描述
图 3,二进制加权数字和模拟值之间的简单乘数。数字值偏移 1。

这让我想起了 R2/R 梯形图,但我无法让它们与运算放大器一起工作。

但是,我想到了 R2/R 梯形图的工作原理,我记得它们的输出乘以它们的电压源。所以我终于想出了这个设计:

在此处输入图像描述
图 4,基于 R2/R 的二进制加权数字和模拟值之间的乘数

我确实喜欢它,但唯一的问题是总线是模拟的,只有一根线。因此,如果我被迫使用上面图 4 中的解决方案,那么我将不得不在混合 CPU 的乘法区域使用另一个 ADC。我不能在量化器区域重用那个。

提问时间:

我应该如何制作一个需要两个模拟输入的乘法器?

  • 想要基于3 个二极管和 4 个运算放大器的解决方案,因为您无法修剪二极管。我的信念是,如果它们不匹配,那么它们会给出一个偏差超过 250 mV 的答案。我没有在现实世界中尝试过。
  • 我已经在链接中尝试了基于 MOS 的乘数,实际上比这个词高一英寸,但我不知道我是否愚蠢。我无法让它在模拟器中工作。有关 MOS 实施失败的信息,请参见下面的 gif。或单击此链接进行模拟。
  • 不想在这个问题上扔一个微控制器。
  • 不想使用旋转的电机并使用一些恶作剧。
  • 我正在考虑在低通结构中使用 RC 滤波器来获取 \$e^{\frac{-t}{RC}}\$,充电和放电并使用斜坡 + 测量所需的时间电容达到一定的值。这与二极管的想法相同,只是速度要慢得多,我并不真正关心。虽然我可以使用电阻器来调整 RC 常数。我宁愿不使用这个解决方案,因为它感觉......就像我以错误的方式解决它。
  • 精度不一定是完美的,现在每个电容器只有 4 位,如果 VDD 为 4 V,这将给出每个级别 \$\frac{4}{2^4}=0.25\$ V。虽然在未来,每个电容器存储 8 位会很有趣。
  • 乘法完成后,它将被带到量化器以确保该值尽可能接近二进制值。所以小错误是可以的。

这是显示我尝试制作基于 MOS 的失败的 gif:

在此处输入图像描述
图 5,我从上面的 wiki 链接复制了原理图,但它在模拟器中不起作用。

如果它会起作用,那么当我将参考电压从 5 V 更改为 -5 V 时,我应该在某处看到值 1 V。

4个回答

如果您想构建一个有点与众不同的模拟乘法器,那么请考虑当您通过模拟开关馈送模拟信号但使用高频 PWM 控制模拟开关时会发生什么(显着高于奈奎斯特以使生活更轻松)。

如果 PWM 为 50% 标记空间,则基带模拟信号衰减一半。显然,您需要使用恢复过滤器来删除切换伪影。但是使用这种技术,您可以通过改变 PWM 占空比来对模拟信号进行幅度调制:-

在此处输入图像描述

你也可以把它变成一个四象限乘法器。一个模拟输入控制脉冲宽度调制器。另一个模拟输入被切换。

只是一个想法,以防你有兴趣。

更多细节在这里

这些东西是存在的——模拟设备(曾经?)有一些你可以(可以?)购买的乘法器 IC。他们也有这个出色的应用笔记,我绝对建议您阅读。

模拟设计中的经典构建模块之一是以 Barrie Gilbert 命名的Gilbert Cell 。它可以满足您的要求(至少,如果我正确理解了您的问题)。由于这种倍增能力,它经常被用作可变增益放大器的构建块。想想看,如果你有一个构建块,它的输入输出关系为 \$ V_{OUT}(t) = V_{IN, 1}(t) \cdot V_{IN, 2}(t) \ $ 并且您将 \$V_{IN, 1}\$ 设置为要放大的信号,您只需更改 \$V_{IN,2}\$ 即可控制增益。出于同样的原因,它也被用作混合器。

我只是把它放在这里作为未来读者的可行答案。


在阅读了 Joren 的回答后,我意识到许多模拟乘法器依赖于匹配组件。所以我在想,为什么不直接重用组件,以便在任何地方都使用相同的组件呢?这样我会自动匹配所有内容。

因此,我查看了典型的基于二极管的乘法器,发现所有二极管的阳极始终连接到运算放大器的 (-) 输入。1 kΩ 电阻器的一个引脚也是如此。

在此处输入图像描述

链接到模拟。

在上图中,计算乘以 2.25 × 3,得到 6.75。在下面的……怪物中也进行了相同的乘法运算。

“一个的值”是一个的电压参考。因此,如果它是 0.1 V 且 V1 = V2 = 1 伏特。那么答案将是 10 V,如果 0.1 V 为 1,则转换为数字 100。

所以我决定将阴极和 1 kΩ 电阻器的另一个引脚复用,瞧,有一个很好的对数和指数函数是匹配的。你可以在下面的 gif 中看到。

在此处输入图像描述

链接到模拟。

gif 有点颗粒感,这是故意将 8 MB 缩小到 2 MB。gif 也加快了 2 倍,28 秒而不是 55 秒。

我知道它说“以 y 为基数的 log(x)”和“pow(y,x)”这是不正确的。我对电压参考感到困惑。它只是带有一些随机基数的 log 和 pow。聪明的数学家会知道,底是什么并不重要,您可以将任何对数转换为任何其他对数。

数字 6.7 显示在右下运算放大器的输出端。在没有任何鼠标悬停的情况下显示数字时,CircuitJS 将 6.75 截断为 6.7。将鼠标置于上方显示 6.69 V,因此 60 mV 误差小于 250 mV,因此可以接受。根据..不是最好的模拟器。


阅读安迪阿卡的答案后,我不确定另一个答案是否能打败它。如果没有其他答案能胜过它,我会在几天内接受他的。我不相信我的回答能胜过安迪的。

我最近在 1968 年的模拟计算机中遇到了“抛物线乘法器”电路。要将 A 和 B 相乘,您需要从两个运算放大器开始计算 A+B 和 AB。接下来,您需要一个产生 X^2(即抛物线)的函数发生器。使用两个函数生成器,您可以计算 (A+B)^2 和 (AB)^2。用运算放大器减去这两个结果,得到 4×A×B,在缩放后得到所需的 A×B。

你如何获得 X^2 函数?任意凸函数(例如 X^2)可以用电阻二极管网络来近似。这个想法是每个二极管将在特定的输入电压下开启(由上电阻控制),并为输出提供电流(由下电阻控制)。结果是分段线性函数。(下面的组件值是任意的;我没有计算出 X^2 的值。)一个真正的函数发生器可能有十几个二极管以获得更高的精度。函数发生器可以是硬连线的,也可以有电位器,因此用户可以将其设置为任何所需的函数。

示意图

模拟此电路- 使用CircuitLab创建的原理图

抛物线乘法器被认为是一种执行模拟乘法的高精度方法。Dornier 240 模拟计算机手册中有一个简短的提及(在德语中,请参阅第 9 节中的 Der Parabel-Multiplizier。)