【问题标题】:How a multiplier circuit could be implemented in JavaScript如何在 JavaScript 中实现乘法器电路
【发布时间】:2019-03-03 12:04:35
【问题描述】:

TBH 我很难理解逻辑门图,因为我还没有完全理解低级电子设备及其工作原理。

我在学习基本逻辑门方面有一点经验,在观看了一些视频并思考了很多之后,我可以理解它几分钟,然后它就会溜走。

但后来我看到了一些在软件中“实现”的“逻辑门”示例,这让我更明白发生了什么。例如,here

然后我什至能够更进一步了解 full adder 的工作原理,就像在 here 中一样:

function fullAdder(a,b,c){
  return {
    c:or(and(xor(a,b),c), and(a,b)), // C is the carry
    s:xor(xor(a,b),c) // S is the sum
  };
}

与逻辑图相比,这是非常基本的。

现在我想了解multiplicationdivision 是如何在逻辑门中实现的,例如x86 的MUL 运算符。

function MUL(a,b){
  return {
    ...
  };
}

我真的不知道从哪里开始,除了花一些时间来理解乘法器电路并尝试使用上面的示例将其转换为可能的 NAND 门实现。想知道知道这一点的人是否可以在 JavaScript 中演示实现。

【问题讨论】:

  • 也许这会有所帮助? en.wikipedia.org/wiki/Binary_multiplier
  • 替代进位逻辑:c:or(and(a, b), and(a, c), and(b, c)) / c:nand(nand(a, b), nand(a, c), nand(b, c))
  • I would like to understand how [division is] implemented in logic gates 祝你好运。

标签: javascript logic multiplication circuit


【解决方案1】:

乘法依赖于数字以二进制编码的方式。 如果 A 是无符号的并由位 a_n-1、a_n-2、...、a_1、a_0 编码,则其值为
A=a_n-1*2^n-1+a_n-2*2^n-2+...+a_1*2^1+a_0

所以要乘以 A×B,你必须这样做
A×B=A×(b_n-1*2^n-1+b_n-2*2^n-2+...+b_1*2^1+b_0)
= A×b_n-1*2^n-1+A×b_n-2*2^n-2+...+A×b_1*2^1+A×b_0
乘法只是一个很大的加法,其中每个项 A×b_i*2^i 如果 b_i==1 为 A×2^i,如果 b_i==0 则为 0

这是C语言的实现


int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++,mask<<=1){
    if(B&mask)
      res += (A << i);
  }
  return res;
}

b_i 上的测试可以用“与”门代替。

int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++,mask<<=1){
     res += (A&~(((B&mask)>>i) -1))<<i;
  }
  return res;
}

这个花哨的表达式提取 B 的第 i 位 (B&amp;mask),将其置于 LSB (&gt;&gt;i),减去 1,所以我们有一个 1-1=0,它的位是 1,而 -1=0xffffffff除此以外。我们只需要对 A 进行补充和“与”运算即可根据第 i 位得到 A 或 0。幸运的是,硬件方面的事情更容易。复制 B 的位 b_i 并与 A 的每一位做一个“与”就足够了。

为了简化硬件,A&lt;&lt;i 的变量移位可以在每一步被 A 的 1 位左移 (A=A&lt;&lt;1) 替换。并且可以对 b_i 提取进行类似的修改,使我们始终考虑 B 的 LSB。

int mult(unsigned short A, unsigned short B){
  int res=0;
  int mask=0x1;
  for(int i=0; i<16;i++){
     res += A&~((B&mask) -1);
     A <<= 1;
     B >>= 1;
  }
  return res;
}

这或多或少是一个简单的乘法器在硬件中的样子,一旦展开循环。 您可以在 js 中实现它并用门完成的加法器替换 + 并使用模拟的“和”门。

实际上,硬件乘法器要复杂一些。

  • 他们使用不带进位传播的特殊加法器来减少加法时间(进位保存加法)。这需要在计算结束时进行额外的添加

  • 他们经常使用 base 4 来减少添加步骤的数量(修改后的 Booth 算法)。

  • 它们被流水线化以提高吞吐量

顺便说一句,您可能对这个online simulator 的不同计算机算术算法感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多