/3/1/RAM8.hdl

http://github.com/happy4crazy/elements_of_computing_systems · Unknown · 56 lines · 49 code · 7 blank · 0 comment · 0 complexity · ada908ff086e844353380e70873abc43 MD5 · raw file

  1. // This file is part of the materials accompanying the book
  2. // "The Elements of Computing Systems" by Nisan and Schocken,
  3. // MIT Press. Book site: www.idc.ac.il/tecs
  4. // File name: projects/03/1/RAM8.hdl
  5. /**
  6. * Memory of 8 registers, each 16-bit wide.
  7. * The chip facilitates read and write operations, as follows:
  8. * Read: out(t) = RAM8[address(t)](t)
  9. * Write: If load(t-1) then RAM8[address(t-1)](t) = in(t-1)
  10. * In words: the chip always outputs the value stored at the memory
  11. * location specified by address. If load=1, the in value is loaded
  12. * into the memory location specified by address. This value becomes
  13. * available through the out output starting from the next time step.
  14. */
  15. CHIP RAM8 {
  16. IN in[16], load, address[3];
  17. OUT out[16];
  18. PARTS:
  19. // first, demux the load bit out to each of the registers
  20. // the idea is that if load=0, then every register sees load=0
  21. // but if load=1, only the address register sees load=1
  22. DMux8Way(in=load, sel=address,
  23. a=load0,
  24. b=load1,
  25. c=load2,
  26. d=load3,
  27. e=load4,
  28. f=load5,
  29. g=load6,
  30. h=load7);
  31. Register(in=in, load=load0, out=out0);
  32. Register(in=in, load=load1, out=out1);
  33. Register(in=in, load=load2, out=out2);
  34. Register(in=in, load=load3, out=out3);
  35. Register(in=in, load=load4, out=out4);
  36. Register(in=in, load=load5, out=out5);
  37. Register(in=in, load=load6, out=out6);
  38. Register(in=in, load=load7, out=out7);
  39. // Now we just need to mux the register outputs according to address
  40. Mux8Way16(a=out0,
  41. b=out1,
  42. c=out2,
  43. d=out3,
  44. e=out4,
  45. f=out5,
  46. g=out6,
  47. h=out7,
  48. sel=address, out=out);
  49. }