提问人:Sean Pilan 提问时间:10/25/2023 更新时间:10/25/2023 访问量:29
如何构建 8 位宽的 hdl ALU
How to build a 8 bit wide hdl ALU
问:
这是我迄今为止尝试的 8 位宽 ALU 芯片的 hdl 代码,但我不确定如何执行其余操作。
CHIP ALU {
IN
x[8], y[8], // 8-bit inputs
zx, // zero the x input?
nx, // negate the x input?
zy, // zero the y input?
ny, // negate the y input?
f, // compute out = x + y (if 1) or x & y (if 0)
no; // negate the out output?
OUT
out[8], // 8-bit output
zr, // 1 if (out == 0), 0 otherwise
ng; // 1 if (out < 0), 0 otherwise
PARTS:
// process the x input
Mux8(a=x, b=false, sel=zx, out=xOrZero);
Not8(in=xOrZero, out=xInverted);
Mux8(a=xOrZero, b=xInverted, sel=nx, out=xOperandToUse);
// process the y input
Mux8(a=y, b=false, sel=zy, out=yOrZero);
Not8(in=yOrZero, out=yInverted);
Mux8(a=yOrZero, b=yInverted, sel=ny, out=yOperandToUse);
// something for And
// something for Add
// something to choose between them
// something to negate the output if needed
// set the zero flag
Or8Way(in=/* outputValue */, out=resultNonZero);
Not(in=resultNonZero, out=zr);
// remember to set the negative flag too....
}
任何帮助将不胜感激。提前非常感谢你
答:
1赞
MadOverlord
10/25/2023
#1
你已经有了良好的开端。对于 X 和 Y 输入,从上到下都有一个很好的数据流,并且逻辑是正确的(就目前而言)。
你只需要继续构建它,记住事情是并行发生的。因此,就像生成 xOperandToUse 和 yOperandToUse 的块并行发生一样,对 And 和 Add 结果执行相同的操作;构建组件生成它们,然后在它们之间进行选择(基于 F),并将输出传递给下一个决策(在本例中否定输出)。
或者换句话说,在编程语言中,你做“if-else”,在芯片中你做“both-pick one”。
我唯一的其他建议是你把你的标签做短一点。根据我的经验,对于这样的事情,它使代码更容易阅读,因为在你的脑海中,每个符号的标记更少。在实现 16 位 ALU 时,我做到了:
Mux16(a=x,b=false,sel=zx,out=x0); // x0 = x or 0, depending on zx
Not16(in=x0,out=notx); // notx = !x0 (which is either 0 or a)
Mux16(a=x0,b=notx,sel=nx,out=xin); // xin = x0 or notx, depending on nx
对于像这样的低级代码(或程序集),我还发现在每一行都注释代码应该做什么的更高层次的解释是有帮助的——这在以后查看代码时很有帮助。
评论