The Element Of Computer System 笔记(第一周)

第一周

门的简介

门(gate)是用来实现布尔函数的物理设备。如果布尔函数f有n个输入变量,返回m个二进制的结果(在我们前面所举的所有例子里面,m=1),那么用来实现这个函数f的门将会有n个输入管脚(input pins)和m个输出管脚(output pins)。当我们把一些值v1...vn从这些门的输入管脚输入,它的内部结构即门的逻辑会计算然后输出f(v1...vn)的值。好比复杂的布尔函数能够通过相对简单的函数来表达一样,复杂的门电路也是由很多基本的门组成的。最简单的门是由微小的开关设备(称为晶体管,transistors)构成的,这些微小开关设备按照设计的拓扑结构进行连接,来实现整个门的功能。

project1

用HDL实现15个芯片
一开始只构建了Nand(与非门),其他的门电路和芯片都能够通过它构建。

Nand(与非)门

以下是Nand(与非)门的布尔函数
在这里插入图片描述

芯片名: Nand
输入: a,b
输出: out
功能: if a=b=1 then out=0 else out=1
说明: 此门是最基本的单元,不需要实现。
Not(非)门

Not 单输入变量的Not门,也被称为“反相器(converter)”,将0反相为1输出或者将1反相为0输出。

以下是Not(非)门的布尔函数
在这里插入图片描述

/**
 * Not gate:
 * out = not in
 */

CHIP Not {
    IN in;
    OUT out;

    PARTS:
    // Put your code here:
    Nand(a=in,b=true,out=out);
}
Or(或)门

Or 只要输入变量中有1,Or函数就输出1,否则输出0。

以下是Or(或)门的布尔函数
在这里插入图片描述

/**
 * Or gate:
 * out = 1 if (a == 1 or b == 1)
 *       0 otherwise
 */

CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    // Put your code here:
    Not(in=a,out=a1);
    Not(in=b,out=b1);
    Nand(a=a1,b=b1,out=out);
}
And(与)门

And 只有输入都是1时,And函数输出1,否则就输出0。

以下是And(与)门的布尔函数
在这里插入图片描述

/**
 * And gate: 
 * out = 1 if (a == 1 and b == 1)
 *       0 otherwise
 */

CHIP And {
    IN a,b;
    OUT out;

    PARTS:
    // Put your code here:
    Nand(a=a,b=b,out=tmp);
    Not(in=tmp,out=out);
}
Xor(异或)门

Xor 又称为“异或”,当两个输入值相反的时候,Xor函数输出1,其他情况返回0。

以下是Xor(异或)门的布尔函数
在这里插入图片描述

/**
 * Exclusive-or gate:
 * out = not (a == b)
 */

CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    // Put your code here:
    Not(in=a,out=a1);
    Not(in=b,out=b1);
    And(a=a,b=b1,out=tmp1);
    And(a=a1,b=b,out=tmp2);
    Or(a=tmp1,b=tmp2,out=out);
}
Mux(选择器,选择输入)门

Multiplexor Multiplexor是三输入变量的门电路,其中一个输入作为“选择位”(selection-bit),选择另外两个输入变量(称为数据位,data bits)中的一个作为输出,另外两个输入称为“数据位”。因此,这个门电路还有另一个比较好的名字:“选择器”。Multiplexor意思是将多个相同设备的输出信号通过单一输出信号线串行地输出。

以下是mux(选择器,选择输入)门的布尔函数
在这里插入图片描述

/** 
 * Multiplexor:
 * out = a if sel == 0
 *       b otherwise
 */

CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    // Put your code here:
    Not(in=sel,out=nsel);
    And(a=a,b=nsel,out=tmp1);
    And(a=b,b=sel,out=tmp2);
    Or(a=tmp1,b=tmp2,out=out);
}
Dmux(与mux相反,选择输出)门

Demultiplexor Demultiplexor执行与multiplexor相反的功能:它只有一个输入变量,然后根据一个选择位来决定到底从哪一个通道输出。

以下是Dmux(选择器)门的布尔函数
在这里插入图片描述

/**
 * Demultiplexor:
 * {a, b} = {in, 0} if sel == 0
 *          {0, in} if sel == 1
 */

CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    // Put your code here:
    Not(in=sel,out=nsel);
    And(a=in,b=nsel,out=a);
    And(a=in,b=sel,out=b);
}

多位基本门

通用计算机的设计要求其能够在多位数据线(又称为“总线”,bus)上运行。比如,32位计算机的基本要求是能够在2个给定的32位总线上按位(bit-wise)进行And函数的计算,我们可以构建一个32位And门阵列,每个And门能够独立地处理一对输入变量的And运算。为了把所有的逻辑封装到同一个包里面,我们把这些门阵列压缩在一个单一的芯片接口里,包含两个32位的输入总线和一个32位的输出总线。

And16(多位与)门

多位And n位的And门所执行的布尔操作是:对两个n位输出总线上对应的每一对输入变量进行“与操作”,然后输出。

And16门的布尔函数与And相同,只是在16位总线上按位进行And函数计算

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

CHIP And16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
    // Put your code here:
    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]);
}
Not16(多位)门

多位Not n位的Not门所执行的布尔操作是:对它的n位输入总线上的每一位取反,然后输出。

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

CHIP Not16 {
    IN in[16];
    OUT out[16];

    PARTS:
    // Put your code here:
    Nand(a=in[0],b=true,out=out[0]);
    Nand(a=in[1],b=true,out=out[1]);
    Nand(a=in[2],b=true,out=out[2]);
    Nand(a=in[3],b=true,out=out[3]);
    Nand(a=in[4],b=true,out=out[4]);
    Nand(a=in[5],b=true,out=out[5]);
    Nand(a=in[6],b=true,out=out[6]);
    Nand(a=in[7],b=true,out=out[7]);
    Nand(a=in[8],b=true,out=out[8]);
    Nand(a=in[9],b=true,out=out[9]);
    Nand(a=in[10],b=true,out=out[10]);
    Nand(a=in[11],b=true,out=out[11]);
    Nand(a=in[12],b=true,out=out[12]);
    Nand(a=in[13],b=true,out=out[13]);
    Nand(a=in[14],b=true,out=out[14]);
    Nand(a=in[15],b=true,out=out[15]);
}
Or16(多位)门

多位Or n位的Or门所执行的布尔操作是:对两个n位输入总线上对应的每一对输入变量进行“或操作”,然后输出。

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

CHIP Or16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
    // Put your code here:
    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]);
}
Mux16(多位)门

多位Multiplexor n位multiplexor的结构跟二进制multiplexor几乎完全一样,只是原来两个1bit位的输入变量都变成了两个n位的输入变量;选择位仍然是1位。

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

CHIP Mux16 {
    IN a[16], b[16], sel;
    OUT out[16];

    PARTS:
    // Put your code here:
    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]);
}

多通道逻辑门

很多2位(即接收两个输入)的逻辑门能够推广到多位(即接收任意数量的输入)。

Or8Way门

多通道Or(Multi-Way Or)对于一个n位的Or门,当n位输入变量中任意一位或一位以上为1,输出就为1,否则就为0。

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

CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
    // Put your code here:
    Or(a=in[0],b=in[1],out=c1);
    Or(a=c1,b=in[2],out=c2);
    Or(a=c2,b=in[3],out=c3);
    Or(a=c3,b=in[4],out=c4);
    Or(a=c4,b=in[5],out=c5);
    Or(a=c5,b=in[6],out=c6);
    Or(a=c6,b=in[7],out=out);
}

Mux4Way16(多位选择输出)门

多通道/多位Multiplexor(Multi-Way/Multi-Bit Multiplexor) 一个拥有m个通道、每个通道数据宽度为n位的multiplexor选择器,将m个n位输入变量中选择一个并从其单一的n位输出总线上输出。我们用k个控制位来指定这个选择,这里K=log2m。

下面是两个API的例子:一个4通道16位的mutiplexor和一个8通道16位的multiplexor
在这里插入图片描述

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

CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];

    PARTS:
    // Put your code here:
    Mux16(a=a,b=b,sel=sel[0],out=tp1);
    Mux16(a=c,b=d,sel=sel[0],out=tp2);
    Mux16(a=tp1,b=tp2,sel=sel[1],out=out);
}
Mux8Way16(多位选择输出)门

在这里插入图片描述

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

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:
    // Put your code here:
    Mux16(a=a,b=b,sel=sel[0],out=tmp1);
    Mux16(a=c,b=d,sel=sel[0],out=tmp2);
    Mux16(a=e,b=f,sel=sel[0],out=tmp3);
    Mux16(a=g,b=h,sel=sel[0],out=tmp4);
    Mux16(a=tmp1,b=tmp2,sel=sel[1],out=out1);
    Mux16(a=tmp3,b=tmp4,sel=sel[1],out=out2);
    Mux16(a=out1,b=out2,sel=sel[2],out=out);
}
DMux4Way

多通道/多位Demultiplexor(Multi-Way/Multi-Bit Demultiplexor) m通道、n位的demultiplexor从m个可能的n位输出通道中选择输出一个n位的输入变量。我们用k个控制位来指定这个选择,这里k=log2m。

下面给出了两个API的例子:一个4通道1位的demultiplexor和一个8通道1位的demultiplexor。
在这里插入图片描述

/**
 * 4-way demultiplexor:
 * {a, b, c, d} = {in, 0, 0, 0} if sel == 00
 *                {0, in, 0, 0} if sel == 01
 *                {0, 0, in, 0} if sel == 10
 *                {0, 0, 0, in} if sel == 11
 */

CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
    // Put your code here:
    DMux(in=in,sel=sel[1],a=left1,b=right1);
    DMux(in=in,sel=sel[1],a=left2,b=right2);
    DMux(in=left1,sel=sel[0],a=a,b=b);
    DMux(in=right1,sel=sel[0],a=c,b=d);
}
DMux8Way

在这里插入图片描述

/**
 * 8-way demultiplexor:
 * {a, b, c, d, e, f, g, h} = {in, 0, 0, 0, 0, 0, 0, 0} if sel == 000
 *                            {0, in, 0, 0, 0, 0, 0, 0} if sel == 001
 *                            etc.
 *                            {0, 0, 0, 0, 0, 0, 0, in} if sel == 111
 */

CHIP DMux8Way {
    IN in, sel[3];
    OUT a, b, c, d, e, f, g, h;

    PARTS:
    // Put your code here:
    DMux(in=in,sel=sel[2],a=left1,b=right1);
    DMux4Way(in=left1,sel[1]=sel[1],sel[0]=sel[0],a=a,b=b,c=c,d=d);
    DMux4Way(in=right1,sel[1]=sel[1],sel[0]=sel[0],a=e,b=f,c=g,d=h);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值