如何构建 8 位宽的 hdl ALU

How to build a 8 bit wide hdl ALU

提问人:Sean Pilan 提问时间:10/25/2023 更新时间:10/25/2023 访问量:29

问:

这是我迄今为止尝试的 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....

}

任何帮助将不胜感激。提前非常感谢你

HDL 南德方块2俄罗斯方块

评论


答:

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

对于像这样的低级代码(或程序集),我还发现在每一行都注释代码应该做什么的更高层次的解释是有帮助的——这在以后查看代码时很有帮助。