Nandteris project1

本文是一篇关于计算机科学和技术的教程,指导读者在项目1中使用基本逻辑门,如Nand、Not、And、Or、Xor、Mux和DMux,来构建16位计算机的CPU和RAM芯片的底层组件。详细介绍了如何实现这些复合逻辑门以及它们在构建更复杂电路中的应用。
摘要由CSDN通过智能技术生成

Nandteris

Project 1

A typical computer architecture is based on a set of elementary logic gates like And, Or, Mux, etc.,

as well as their bitwise versions And16, Or16, Mux16, etc. (assuming a 16-bit machine). In this

project you will build a typical set of basic logic gates. These gates form the elementary building

blocks from which you will build the computer’s CPU and RAM chips in later projects.

Below we describe the tools, resources, and implementation tips needed for completing project 1.

Objective

Build the following logic gates:

Nand (given)

Not

And

Or

Xor

Mux

DMux

Not16

And16

Or16

Mux16

Or8Way

Mux4Way16

Mux8Way16

DMux4Way

DMux8Way

The only building blocks that you can use are primitive Nand gates and the composite gates that

you will gradually build on top of them. Since Nand is considered primitive, there is no need to

implement it.

实现

CHIP And {
    IN a, b;
    OUT out;
    
    PARTS:
    Nand(a = a, b = b, out = temp);
    Nand(a = temp, b = temp, out = out);
}
CHIP Not {
    IN in;
    OUT out;

    PARTS:
    Nand(a = in,b = true,out = out);
}
CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in = a, out = temp1);
    Not(in = b, out = temp2);
    Nand(a = temp1, b = temp2, out = out);
}
CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Not(in = a, out = tempa);
    Not(in = b, out = tempb);
    And(a = a , b = tempb, out = c);
    And(a = tempa, b = b, out = d);
    Or(a = c, b = d, out = out);
}
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
     Replace this comment with your code.
    Not(in = sel, out = nosel);
    And(a = a, b = nosel, out = tempa);
    And(a = sel, b = b, out = tempb);
    Or(a = tempa, b = tempb, out = out);
}
CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Not(in=sel,out=notsel);
    And(a=notsel,b=in,out=a);
    And(a=in,b=sel,out=b);
}
CHIP Not16 {
    IN in[16];
    OUT out[16];

    PARTS:
    Not(in = in[0], out = out[0]);
    Not(in = in[1], out = out[1]);
    Not(in = in[2], out = out[2]);
    Not(in = in[3],out = out[3]);
    Not(in = in[4], out = out[4]);
    Not(in = in[5], out = out[5]);
    Not(in = in[6], out = out[6]);
    Not(in = in[7], out = out[7]);
    Not(in = in[8], out = out[8]);
    Not(in = in[9],out = out[9]);
    Not(in = in[10], out = out[10]);
    Not(in = in[11], out = out[11]);
    Not(in = in[12], out = out[12]);
    Not(in = in[13], out = out[13]);
    Not(in = in[14], out = out[14]);
    Not(in = in[15], out = out[15]);
}
CHIP And16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
    And(a = a[0], b = b[0], out = out[0]);
    And(a = a[1], b = b[1], out = out[1]);
    And(a = a[2], b = b[2], out = out[2]);
    And(a = a[3], b = b[3], out = out[3]);
    And(a = a[4], b = b[4], out = out[4]);
    And(a = a[5], b = b[5], out = out[5]);
    And(a = a[6], b = b[6], out = out[6]);
    And(a = a[7], b = b[7], out = out[7]);
    And(a = a[8], b = b[8], out = out[8]);
    And(a = a[9], b = b[9], out = out[9]);
    And(a = a[10], b = b[10], out = out[10]);
    And(a = a[11], b = b[11], out = out[11]);
    And(a = a[12], b = b[12], out = out[12]);
    And(a = a[13], b = b[13], out = out[13]);
    And(a = a[14], b = b[14], out = out[14]);
    And(a = a[15], b = b[15], out = out[15]);
}
CHIP Or16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
    Or(a = a[0], b = b[0], out = out[0]);
    Or(a = a[1], b = b[1], out = out[1]);
    Or(a = a[2], b = b[2], out = out[2]);
    Or(a = a[3], b = b[3], out = out[3]);
    Or(a = a[4], b = b[4], out = out[4]);
    Or(a = a[5], b = b[5], out = out[5]);
    Or(a = a[6], b = b[6], out = out[6]);
    Or(a = a[7], b = b[7], out = out[7]);
    Or(a = a[8], b = b[8], out = out[8]);
    Or(a = a[9], b = b[9], out = out[9]);
    Or(a = a[10], b = b[10], out = out[10]);
    Or(a = a[11], b = b[11], out = out[11]);
    Or(a = a[12], b = b[12], out = out[12]);
    Or(a = a[13], b = b[13], out = out[13]);
    Or(a = a[14], b = b[14], out = out[14]);
    Or(a = a[15], b = b[15], out = out[15]);
}
CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
     Replace this comment with your code.
    Or(a=in[0], b=in[1], out=o1);
    Or(a=o1, b=in[2], out=o2);
    Or(a=o2, b=in[3], out=o3);
    Or(a=o3, b=in[4], out=o4);
    Or(a=o4, b=in[5], out=o5);
    Or(a=o5, b=in[6], out=o6);
    Or(a=o6, b=in[7], out=out);
}
CHIP Mux16 {
    IN a[16], b[16], sel;
    OUT out[16];

    PARTS:
    Mux(a = a[0], b = b[0], sel = sel, out = out[0]);
    Mux(a = a[1], b = b[1], sel = sel, out = out[1]);
    Mux(a = a[2], b = b[2], sel = sel, out = out[2]);
    Mux(a = a[3], b = b[3], sel = sel, out = out[3]);
    Mux(a = a[4], b = b[4], sel = sel, out = out[4]);
    Mux(a = a[5], b = b[5], sel = sel, out = out[5]);
    Mux(a = a[6], b = b[6], sel = sel, out = out[6]);
    Mux(a = a[7], b = b[7], sel = sel, out = out[7]);
    Mux(a = a[8], b = b[8], sel = sel, out = out[8]);
    Mux(a = a[9], b = b[9], sel = sel, out = out[9]);
    Mux(a = a[10], b = b[10], sel = sel, out = out[10]);
    Mux(a = a[11], b = b[11], sel = sel, out = out[11]);
    Mux(a = a[12], b = b[12], sel = sel, out = out[12]);
    Mux(a = a[13], b = b[13], sel = sel, out = out[13]);
    Mux(a = a[14], b = b[14], sel = sel, out = out[14]);
    Mux(a = a[15], b = b[15], sel = sel, out = out[15]);
}
CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];
    
    PARTS:
     Replace this comment with your code.
    Mux16(a = a, b = b, sel = sel[0], out = o1);
    Mux16(a = c, b = d, sel = sel[0], out = o2);
    Mux16(a = o1, b = o2, sel = sel[1], out = out);
}
CHIP Mux8Way16 {
    IN a[16], b[16], c[16], d[16],
       e[16], f[16], g[16], h[16],
       sel[3];
    OUT out[16];

    PARTS:
     Replace this comment with your code.
    Mux4Way16(a = a, b = b, c = c, d = d, sel = sel[0..1], out = o1);
    Mux4Way16(a = e, b = f, c = g, d = h, sel = sel[0..1], out = o2);
    Mux16(a = o1, b = o2, sel = sel[2], out = out);
}
CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
     Replace this comment with your code.
    DMux(in = in, sel = sel[1], a = ab, b = cd);
    DMux(in = ab, sel = sel[0], a = a, b = b);
    DMux(in = cd, sel = sel[0], a = c, b = d);
}
CHIP DMux8Way {
    IN in, sel[3];
    OUT a, b, c, d, e, f, g, h;

    PARTS:
     Replace this comment with your code.
    DMux(in = in, sel = sel[2], a = abcd, b = efgh);
    DMux4Way(in = abcd, sel = sel[0..1], a = a, b = b, c = c, d = d);
    DMux4Way(in = efgh, sel = sel[0..1], a = e, b = f, c = g, d = h);
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值