虽然我标记了这个作业,但它实际上是我自己免费完成的一门课程。无论如何,这门课程叫做“从 Nand 到俄罗斯方块”,我希望这里有人看过或上过这门课程,以便我能得到一些帮助。我正处于使用提供的 hdl 语言构建 ALU 的阶段。我的问题是我的芯片无法正确编译。当我尝试为 ALU 设置输出标志时出现错误。我相信问题是我不能下标任何中间变量,因为当我尝试根据一些随机变量(比如输入标志)将标志设置为真或假时,我没有得到错误。我知道问题不在于我尝试使用的芯片,因为我使用的是所有内置芯片。
到目前为止,这是我的 ALU 芯片:
/**
* The ALU. Computes a pre-defined set of functions out = f(x,y)
* where x and y are two 16-bit inputs. The function f is selected
* by a set of 6 control bits denoted zx, nx, zy, ny, f, no.
* The ALU operation can be described using the following pseudocode:
* if zx=1 set x = 0 // 16-bit zero constant
* if nx=1 set x = !x // Bit-wise negation
* if zy=1 set y = 0 // 16-bit zero constant
* if ny=1 set y = !y // Bit-wise negation
* if f=1 set out = x + y // Integer 2's complement addition
* else set out = x & y // Bit-wise And
* if no=1 set out = !out // Bit-wise negation
*
* In addition to computing out, the ALU computes two 1-bit outputs:
* if out=0 set zr = 1 else zr = 0 // 16-bit equality comparison
* if out<0 set ng = 1 else ng = 0 // 2's complement comparison
*/
CHIP ALU {
IN // 16-bit inputs:
x[16], y[16],
// Control bits:
zx, // Zero the x input
nx, // Negate the x input
zy, // Zero the y input
ny, // Negate the y input
f, // Function code: 1 for add, 0 for and
no; // Negate the out output
OUT // 16-bit output
out[16],
// ALU output flags
zr, // 1 if out=0, 0 otherwise
ng; // 1 if out<0, 0 otherwise
PARTS:
// Zero the x input
Mux16( a=x, b=false, sel=zx, out=x2 );
// Zero the y input
Mux16( a=y, b=false, sel=zy, out=y2 );
// Negate the x input
Not16( in=x, out=notx );
Mux16( a=x, b=notx, sel=nx, out=x3 );
// Negate the y input
Not16( in=y, out=noty );
Mux16( a=y, b=noty, sel=ny, out=y3 );
// Perform f
Add16( a=x3, b=y3, out=addout );
And16( a=x3, b=y3, out=andout );
Mux16( a=andout, b=addout, sel=f, out=preout );
// Negate the output
Not16( in=preout, out=notpreout );
Mux16( a=preout, b=notpreout, sel=no, out=out );
// zr flag
Or8way( in=out[0..7], out=zr1 ); // PROBLEM SHOWS UP HERE
Or8way( in=out[8..15], out=zr2 );
Or( a=zr1, b=zr2, out=zr );
// ng flag
Not( in=out[15], out=ng );
}
因此,当我尝试将“out”的下标版本发送到 Or8Way 芯片时,问题就出现了。我尝试使用与“out”不同的变量,但遇到了同样的问题。然后我读到你不能下标中间变量。我想也许如果我将中间变量发送到其他芯片,并且该芯片下标它,它会解决问题,但它有同样的错误。不幸的是,我只是想不出一种方法来设置 zr 和 ng 标志而不下标一些中间变量,所以我真的被卡住了!
请注意,如果我用以下内容替换有问题的行,它将编译(但不会给出正确的结果,因为我只是使用一些随机输入):
// zr flag
Not( in=zx, out=zr );
// ng flag
Not( in=zx, out=ng );
有人有想法么?
编辑:这是本书的附录,该附录指定了 hdl 的工作原理。具体看第 5 节,它讨论了总线并说:“内部引脚(如上面的 v)可能没有下标”。
编辑:这是我得到的确切错误:“第 68 行,无法将门的输出引脚连接到部件”。不过,错误消息有点令人困惑,因为这似乎不是真正的问题。如果我只是替换“Or8way(in=out[0..7], out=zr1);” 用“Or8way(in=false,out=zr1);” 它不会产生这个错误,这导致我在附录中查找并发现 out 变量,因为它是作为中间派生的,所以不能下标。