Files
nand2tetris/projects/02/ALU.hdl.org
2023-03-22 19:51:12 +01:00

2.0 KiB
Raw Permalink Blame History

/ This file is part of www.nand2tetris.org / and the book "The Elements of Computing Systems" / by Nisan and Schocken, MIT Press. / File name: projects/02/ALU.hdl

/**

  • The ALU (Arithmetic Logic Unit).
  • Computes one of the following functions:
  • x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y,
  • x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs,
  • according to 6 input bits denoted zx,nx,zy,ny,f,no.
  • In addition, the ALU computes two 1-bit outputs:
  • if the ALU output == 0, zr is set to 1; otherwise zr is set to 0;
  • if the ALU output < 0, ng is set to 1; otherwise ng is set to 0.

*/

/ Implementation: the ALU logic manipulates the x and y inputs / and operates on the resulting values, as follows: / if (zx == 1) set x = 0 / 16-bit constant / if (nx == 1) set x = !x / bitwise not / if (zy == 1) set y = 0 / 16-bit constant / if (ny == 1) set y = !y / bitwise not / if (f == 1) set out = x + y / integer 2's complement addition / if (f == 0) set out = x & y / bitwise and / if (no == 1) set out = !out / bitwise not / if (out == 0) set zr = 1 / if (out < 0) set ng = 1

CHIP ALU { IN x[16], y[16], / 16-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[16], / 16-bit output zr, / 1 if (out == 0), 0 otherwise ng; // 1 if (out < 0), 0 otherwise

PARTS: // 1. when zx = 1 > x = 0 Mux16(a=x, b=false, sel=zx, out=mux_x); // 2. when nx = 1 negate x Not16(in=mux_x, out=not_x); Mux16(a=mux_x, b=not_x, sel=nx, out=x_1);

// 3. when zy = 1 > y = 0 Mux16(a=y, b=false, sel=zy, out=mux_y); // 4. when ny = 1 then negate y Not16(in=mux_y, out=not_y); Mux16(a=mux_y, b=not_y, sel=ny, out=y_1);

}