Public » Elements of Computing
Clone URL:  
Pushed to one repository · View In Graph Contained in tip

ALU

Changeset dfdc4d812bfe

Parent d7c07f5bca84

by Profile picture of Benjamin PollackBenjamin Pollack

Changes to one file · Browse files at dfdc4d812bfe Showing diff from parent d7c07f5bca84 Diff from another changeset...

Change 1 of 2 Show Entire File 02/​ALU.hdl Stacked
 
6
7
8
9
 
10
11
12
 
 
13
14
15
16
17
18
19
 
20
21
22
 
39
40
41
42
 
43
44
45
46
47
48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
6
7
8
 
9
10
 
 
11
12
13
14
15
16
17
18
 
19
20
21
22
 
39
40
41
 
42
43
44
45
46
47
 
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@@ -6,17 +6,17 @@
 /**   * The ALU. 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, + * 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. - * The bit-combinations that yield each function are - * documented in the book. In addition, the ALU + * The bit-combinations that yield each function are + * documented in the book. In addition, the ALU   * computes two 1-bit outputs: if the ALU output   * is 0, zr is set to 1; otherwise zr is set to 0;   * If out<0, ng is set to 1; otherwise ng is set to 0.   */    // Implementation: the ALU manipulates the x and y -// inputs and then operates on the resulting values, +// inputs and then operates on the resulting values,  // as follows:  // if (zx==1) set x = 0 // 16-bit constant  // if (nx==1) set x = ~x // bitwise "not" @@ -39,11 +39,32 @@
  f, // compute out = x + y (if 1) or out = x & y (if 0)   no; // negate the out output?   - OUT + OUT   out[16], // 16-bit output   zr, // 1 if (out==0), 0 otherwise   ng; // 1 if (out<0), 0 otherwise     PARTS: - // Put you code here: + Mux16(a=x, b[0..15]=false, sel=zx, out=maybex); + Mux16(a=y, b[0..15]=false, sel=zy, out=maybey); + + Not16(in=maybex, out=notmaybex); + Not16(in=maybey, out=notmaybey); + + Mux16(a=maybex, b=notmaybex, sel=nx, out=realx); + Mux16(a=maybey, b=notmaybey, sel=ny, out=realy); + + And16(a=realx, b=realy, out=andout); + Add16(a=realx, b=realy, out=addout); + Mux16(a=andout, b=addout, sel=f, out=maybeout); + + Not16(in=maybeout, out=notmaybeout); + Mux16(a=maybeout, b=notmaybeout, sel=no, out=realout); + + Or16Way(in=realout, out=notzr); + And16(a=realout, b[15]=true, b[0..14]=false, out=neg); + + Not(in=notzr, out=zr); + Or16Way(in=neg, out=ng); + Or16(a=realout, b=realout, out=out);  }