Created
January 26, 2019 23:13
-
-
Save leesharma/d5987848b04a5577619ad15af7c358b4 to your computer and use it in GitHub Desktop.
Nand2Tetris Project 3: Memory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/a/Bit.hdl | |
/** | |
* 1-bit register: | |
* If load[t] == 1 then out[t+1] = in[t] | |
* else out does not change (out[t+1] = out[t]) | |
*/ | |
CHIP Bit { | |
IN in, load; | |
OUT out; | |
PARTS: | |
Mux(a=outloop, b=in, sel=load, out=out1); | |
DFF(in=out1, out=outloop, out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/a/PC.hdl | |
/** | |
* A 16-bit counter with load and reset control bits. | |
* if (reset[t] == 1) out[t+1] = 0 | |
* else if (load[t] == 1) out[t+1] = in[t] | |
* else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition) | |
* else out[t+1] = out[t] | |
*/ | |
CHIP PC { | |
IN in[16],load,inc,reset; | |
OUT out[16]; | |
PARTS: | |
// prefix logic: inc -> load -> reset | |
Add16(a=outloop, b[0]=true, b[1..15]=false, out=outloopInc); | |
Mux16(a=outloop, b=outloopInc, sel=inc, out=t0); | |
Mux16(a=t0, b=in, sel=load, out=t1); | |
Mux16(a=t1, b=false, sel=reset, out=t2); | |
// loading logic | |
Or(a=load, b=inc, out=loadOrInc); | |
Or(a=loadOrInc, b=reset, out=loadRAM); | |
// timestep | |
RAM8(in=t2, load=loadRAM, out=outloop, out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/b/RAM16K.hdl | |
/** | |
* Memory of 16K registers, each 16 bit-wide. Out holds the value | |
* stored at the memory location specified by address. If load==1, then | |
* the in value is loaded into the memory location specified by address | |
* (the loaded value will be emitted to out from the next time step onward). | |
*/ | |
CHIP RAM16K { | |
IN in[16], load, address[14]; | |
OUT out[16]; | |
PARTS: | |
DMux4Way(in=load, sel=address[12..13], | |
a=load0, b=load1, c=load2, d=load3); | |
// RAM array | |
RAM4K(in=in, load=load0, address=address[0..11], out=out0); | |
RAM4K(in=in, load=load1, address=address[0..11], out=out1); | |
RAM4K(in=in, load=load2, address=address[0..11], out=out2); | |
RAM4K(in=in, load=load3, address=address[0..11], out=out3); | |
// output logic | |
Mux4Way16(a=out0, b=out1, c=out2, d=out3, | |
sel=address[12..13], out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/b/RAM4K.hdl | |
/** | |
* Memory of 4K registers, each 16 bit-wide. Out holds the value | |
* stored at the memory location specified by address. If load==1, then | |
* the in value is loaded into the memory location specified by address | |
* (the loaded value will be emitted to out from the next time step onward). | |
*/ | |
CHIP RAM4K { | |
IN in[16], load, address[12]; | |
OUT out[16]; | |
PARTS: | |
DMux8Way(in=load, sel=address[9..11], | |
a=load0, b=load1, c=load2, d=load3, | |
e=load4, f=load5, g=load6, h=load7); | |
// RAM array | |
RAM512(in=in, load=load0, address=address[0..8], out=out0); | |
RAM512(in=in, load=load1, address=address[0..8], out=out1); | |
RAM512(in=in, load=load2, address=address[0..8], out=out2); | |
RAM512(in=in, load=load3, address=address[0..8], out=out3); | |
RAM512(in=in, load=load4, address=address[0..8], out=out4); | |
RAM512(in=in, load=load5, address=address[0..8], out=out5); | |
RAM512(in=in, load=load6, address=address[0..8], out=out6); | |
RAM512(in=in, load=load7, address=address[0..8], out=out7); | |
// output logic | |
Mux8Way16(a=out0, b=out1, c=out2, d=out3, | |
e=out4, f=out5, g=out6, h=out7, | |
sel=address[9..11], out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This file is part of the materials accompanying the book | |
// "The Elements of Computing Systems" by Nisan and Schocken, | |
// MIT Press. Book site: www.idc.ac.il/tecs | |
// File name: projects/03/b/RAM512.hdl | |
/** | |
* Memory of 512 registers, each 16 bit-wide. Out holds the value | |
* stored at the memory location specified by address. If load==1, then | |
* the in value is loaded into the memory location specified by address | |
* (the loaded value will be emitted to out from the next time step onward). | |
*/ | |
CHIP RAM512 { | |
IN in[16], load, address[9]; | |
OUT out[16]; | |
PARTS: | |
DMux8Way(in=load, sel=address[6..8], | |
a=load0, b=load1, c=load2, d=load3, | |
e=load4, f=load5, g=load6, h=load7); | |
// RAM array | |
RAM64(in=in, load=load0, address=address[0..5], out=out0); | |
RAM64(in=in, load=load1, address=address[0..5], out=out1); | |
RAM64(in=in, load=load2, address=address[0..5], out=out2); | |
RAM64(in=in, load=load3, address=address[0..5], out=out3); | |
RAM64(in=in, load=load4, address=address[0..5], out=out4); | |
RAM64(in=in, load=load5, address=address[0..5], out=out5); | |
RAM64(in=in, load=load6, address=address[0..5], out=out6); | |
RAM64(in=in, load=load7, address=address[0..5], out=out7); | |
// output logic | |
Mux8Way16(a=out0, b=out1, c=out2, d=out3, | |
e=out4, f=out5, g=out6, h=out7, | |
sel=address[6..8], out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/a/RAM64.hdl | |
/** | |
* Memory of 64 registers, each 16 bit-wide. Out holds the value | |
* stored at the memory location specified by address. If load==1, then | |
* the in value is loaded into the memory location specified by address | |
* (the loaded value will be emitted to out from the next time step onward). | |
*/ | |
CHIP RAM64 { | |
IN in[16], load, address[6]; | |
OUT out[16]; | |
PARTS: | |
// access logic | |
DMux8Way(in=load, sel=address[3..5], | |
a=load0, b=load1, c=load2, d=load3, | |
e=load4, f=load5, g=load6, h=load7); | |
// RAM array | |
RAM8(in=in, load=load0, address=address[0..2], out=out0); | |
RAM8(in=in, load=load1, address=address[0..2], out=out1); | |
RAM8(in=in, load=load2, address=address[0..2], out=out2); | |
RAM8(in=in, load=load3, address=address[0..2], out=out3); | |
RAM8(in=in, load=load4, address=address[0..2], out=out4); | |
RAM8(in=in, load=load5, address=address[0..2], out=out5); | |
RAM8(in=in, load=load6, address=address[0..2], out=out6); | |
RAM8(in=in, load=load7, address=address[0..2], out=out7); | |
// output logic | |
Mux8Way16(a=out0, b=out1, c=out2, d=out3, | |
e=out4, f=out5, g=out6, h=out7, | |
sel=address[3..5], out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/a/RAM8.hdl | |
/** | |
* Memory of 8 registers, each 16 bit-wide. Out holds the value | |
* stored at the memory location specified by address. If load==1, then | |
* the in value is loaded into the memory location specified by address | |
* (the loaded value will be emitted to out from the next time step onward). | |
*/ | |
CHIP RAM8 { | |
IN in[16], load, address[3]; | |
OUT out[16]; | |
PARTS: | |
// access logic | |
DMux8Way(in=load, sel=address, | |
a=load0, b=load1, c=load2, d=load3, | |
e=load4, f=load5, g=load6, h=load7); | |
// register array | |
Register(in=in, load=load0, out=out0); | |
Register(in=in, load=load1, out=out1); | |
Register(in=in, load=load2, out=out2); | |
Register(in=in, load=load3, out=out3); | |
Register(in=in, load=load4, out=out4); | |
Register(in=in, load=load5, out=out5); | |
Register(in=in, load=load6, out=out6); | |
Register(in=in, load=load7, out=out7); | |
// output logic | |
Mux8Way16(a=out0, b=out1, c=out2, d=out3, | |
e=out4, f=out5, g=out6, h=out7, | |
sel=address, out=out); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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/03/a/Register.hdl | |
/** | |
* 16-bit register: | |
* If load[t] == 1 then out[t+1] = in[t] | |
* else out does not change | |
*/ | |
CHIP Register { | |
IN in[16], load; | |
OUT out[16]; | |
PARTS: | |
Bit(in=in[0], load=load, out=out[0]); | |
Bit(in=in[1], load=load, out=out[1]); | |
Bit(in=in[2], load=load, out=out[2]); | |
Bit(in=in[3], load=load, out=out[3]); | |
Bit(in=in[4], load=load, out=out[4]); | |
Bit(in=in[5], load=load, out=out[5]); | |
Bit(in=in[6], load=load, out=out[6]); | |
Bit(in=in[7], load=load, out=out[7]); | |
Bit(in=in[8], load=load, out=out[8]); | |
Bit(in=in[9], load=load, out=out[9]); | |
Bit(in=in[10], load=load, out=out[10]); | |
Bit(in=in[11], load=load, out=out[11]); | |
Bit(in=in[12], load=load, out=out[12]); | |
Bit(in=in[13], load=load, out=out[13]); | |
Bit(in=in[14], load=load, out=out[14]); | |
Bit(in=in[15], load=load, out=out[15]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment