Austin Liu (劉立行)

When I started learning how to code, I was amazed at what it could do. However, I was also unsatisfied because the computer seems like a black box to me. I always have such urge to explore the underlying principles of a system.

Uses a bottom-up approach to introduce how to design computer architecture, programming language, and operating system, and it was very enlightening to me at the time.

參考資料:

  1. 陳鍾誠教授 計算機結構(Computer Organization)
  2. Computation Structures (MIT 6.004)
  3. Nand2Tetris
  4. Jserv Computer Architecture (NCKU)
  5. Great Ideas in Computer Architecture (UC Berkeley 61C)
  6. Computer Architecture and Engineering (UC Berkeley 152)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1a21252a-616c-4a9e-a8c6-560a38370d46/Untitled.png

Q: Why do we use NAND and NOR Gate for implementing any logic design?

A: CMOS technology is the most widely used.

  1. As we know CMOS NAND/NOR require 4 MOSFETs and 1 layer of transistors.

  2. Where as AND/OR use 6 MOSFETs with 2 layers, thus increasing the delay and reducing packing density of the chip.

So in layman terms by using NAND and NOR gates we save space and reduce the gate delay.

Also NAND gate can already be used as a NOT gate so why would you buy a stencil for NOT? 😂

Image from CMOS Gate Circuitry:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/63bb382d-2cb6-4aab-ac33-bf34504efbf2/Untitled.png

One of the techniques used to convert logic implemented using Basic Gates to NOR and NAND is Bubble Pushing.

1. not -- not(x) = nand(x,x)
2. and -- and(x,y) = not(nand(x,y))
3. or -- or(x,y) = not(not x and not y)
4. xor -- xor(x, y) = and(x, not y) or and(not x, y)
5. mux -- out = mux(a, b, sel) 二選一多工器,可按標準k-map分析法設計
6. dmux -- (a,b) = dmux(in, sel) 一對二解多工器
7. not16 -- out i = not(in i)    i = 0..15
8. and16 -- out i = and(xi, yi)  i= 0..15
9. or16 -- out i = or(xi, yi)    i=0..15
10. mux16 -- out i = mux(xi, yi) i=0..15
11. or8way -- out = or(in[0..7])
12. Mux4Way16 -- out = mux16(mux16(a,b), mux16(c,d))
13. Mux8Way16 -- out = mux16(mux4way16(a,b), mux4way16(c,d))
14. DMux4Way -- out = dmux(in, sel, a,b,c,d)
15. DMux8Way -- out = dmux(in, sel, a,b,c,d,e,f,g,h)