计算机基础系列 —— 从 Nand 门到 ALU(1)

26 阅读1分钟

本文来自课程《From Nand to Tetris

文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。

基础逻辑门

基础逻辑门满足一些定律,都可以用真值表证明。

Nand Not And Or Xor

我们可以用 HDL(硬件描述语言)定义硬件<忽略物理实现,所有元件的抽象都是相同的>,Not,And,Or 都可以从一个 Nand 门构建。

更复杂的逻辑门 Xor,也可以通过 Not,And,Or 构建,所以 Xor 也可以用 Nand 门构建。

/**
 * 16-bit multiplexor: 
 * for i = 0..15 out[i] = a[i] if sel == 0 
 *                        b[i] if sel == 1
 */

/**
 * 4-way 16-bit multiplexor:
 * out = a if sel == 00
 *       b if sel == 01
 *       c if sel == 10
 *       d if sel == 11
 */

/**
 * 8-way 16-bit multiplexor:
 * out = a if sel == 000
 *       b if sel == 001
 *       etc.
 *       h if sel == 111
 */

多路选择器(multiplexer)Mux

/**
 * 16-bit multiplexor: 
 * for i = 0..15 out[i] = a[i] if sel == 0 
 *                        b[i] if sel == 1
 */

/**
 * 4-way 16-bit multiplexor:
 * out = a if sel == 00
 *       b if sel == 01
 *       c if sel == 10
 *       d if sel == 11
 */

/**
 * 8-way 16-bit multiplexor:
 * out = a if sel == 000
 *       b if sel == 001
 *       etc.
 *       h if sel == 111
 */

多路分配器(Demultiplexor)DMux

/**
 * 8-way Or: 
 * out = (in[0] or in[1] or ... or in[7])
 */

/**
 * 16-bit Not:
 * for i=0..15: out[i] = not in[i]
 */

/**
 * 16-bit bitwise And:
 * for i = 0..15: out[i] = (a[i] and b[i])
 */

/**
 * 16-bit bitwise Or:
 * for i = 0..15 out[i] = (a[i] or b[i])
 */

到这里,我们实现了上述的组合逻辑单元,接下来我们会利用这些单元实现 ALU。