0

我正在尝试制作一个 10 位加法器/减法器。现在,逻辑按预期工作。但是,如果存在溢出,我正在尝试将所有位设置为 0。为此,我需要通过 10 位 Mux 传递输出 (tempOut),但这样做会出错。

这是芯片:

/**
 * Adds or Subtracts two 10-bit values.
 * Both inputs a and b are in SIGNED 2s complement format
 * when sub == 0, the chip performs add i.e. out=a+b
 * when sub == 1, the chip performs subtract i.e. out=a-b
 * carry reflects the overflow calculated for 10-bit add/subtract in 2s complement
 */

CHIP AddSub10 {
    IN a[10], b[10], sub;
    OUT out[10],carry;

    PARTS:
    // If sub == 1, subtraction, else addition
    // First RCA4
    Not4(in=b[0..3], out=notB03);
    Mux4(a=b[0..3], b=notB03, sel=sub, out=MuxOneOut);
    RCA4(a=a[0..3], b=MuxOneOut, cin=sub, sum=tempOut[0..3], cout=cout03);

    // Second RCA4
    Not4(in=b[4..7], out=notB47);
    Mux4(a=b[4..7], b=notB47, sel=sub, out=MuxTwoOut);
    RCA4(a=a[4..7], b=MuxTwoOut, cin=cout03, sum=tempOut[4..7], cout=cout47);

    // Third RCA4
    Not4(in[0..1]=b[8..9], out=notB89);
    Mux4(a[0..1]=b[8..9], b=notB89, sel=sub, out=MuxThreeOut);
    RCA4(a[0..1]=a[8..9], b=MuxThreeOut, cin=cout47, sum[0..1]=tempOut[8..9], sum[0]=tempA, sum[1]=tempB, sum[2]=carry);

    // FIXME, intended to solve overflow/underflow
    Xor(a=tempA, b=tempB, out=overflow);
    Mux10(a=tempOut, b=false, sel=overflow, out=out); 

}
4

1 回答 1

0

在不知道编译器抱怨哪一行的情况下,很难诊断出问题。然而,我最好的猜测是你不能使用像 tempOut 这样的任意内部总线,因为编译器不知道它第一次遇到它时有多大。

编译器知道 IN 和 OUT 元素的大小,它知道组件的输入和输出的大小。但是如果不解析所有内容,它无法判断 tempOut 会有多大,这可能超出了编译器设计的范围。

我建议您进行重构,使每个 RCA4 都有一个离散的输出总线(即:sum1、sum2、sum3)。然后,您可以根据需要在 Xor 和 Mux10 中使用它们及其各个位。

于 2022-02-14T19:43:06.573 回答