Posts 从零开始构建计算机chapter3_时序逻辑
Post
Cancel

从零开始构建计算机chapter3_时序逻辑

触发器 DFF

DFF简单的将前一个时间周期的输入值作为当前周期的输出。

1bit寄存器

p1 p2 加一个输入脚,由load门控制。

1
2
    Mux(a=preOut, b=in, sel=load, out=o1);
    DFF(in=o1, out=preOut, out=out);

16bit寄存器 Register

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    PARTS:
    // Put your code here:
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[1], load=load, out=out[1]);
    Bit(in=in[2], load=load, out=out[2]);
    Bit(in=in[3], load=load, out=out[3]);
    Bit(in=in[4], load=load, out=out[4]);
    Bit(in=in[5], load=load, out=out[5]);
    Bit(in=in[6], load=load, out=out[6]);
    Bit(in=in[7], load=load, out=out[7]);
    Bit(in=in[8], load=load, out=out[8]);
    Bit(in=in[9], load=load, out=out[9]);
    Bit(in=in[10], load=load, out=out[10]);
    Bit(in=in[11], load=load, out=out[11]);
    Bit(in=in[12], load=load, out=out[12]);
    Bit(in=in[13], load=load, out=out[13]);
    Bit(in=in[14], load=load, out=out[14]);
    Bit(in=in[15], load=load, out=out[15]);

8-RAM

p3 RAM 由n个宽度为w的寄存器组成。

  • 读取 读取编号为m的寄存器,将m置于address输入管脚。

  • 写入 数值d写入编号为m的寄存器。m置于address中,d置于in输入管脚。load位为1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CHIP RAM8 {
    IN in[16], load, address[3];
    OUT out[16];

    PARTS:
    // Put your code here:
    DMux8Way(in=load, sel=address, a=a1, b=a2, c=a3, d=a4, e=a5, f=a6, g=a7, h=a8);

    Register(in=in, load=a1, out=o1);
    Register(in=in, load=a2, out=o2);
    Register(in=in, load=a3, out=o3);
    Register(in=in, load=a4, out=o4);
    Register(in=in, load=a5, out=o5);
    Register(in=in, load=a6, out=o6);
    Register(in=in, load=a7, out=o7);
    Register(in=in, load=a8, out=o8);

    Mux8Way16(a=o1, b=o2, c=o3, d=o4, e=o5, f=o6, g=o7, h=o8, sel=address, out=out);
}

多路RAM

  1. RAM8 address[3] , 8个1bit寄存器。

  2. RAM64 address[6], 64个1bit寄存器。

  3. RAM512 address[9] , 512 个1bit寄存器。

  4. RAM4K address[12] , 4096 个1bit寄存器。

  5. RAM16K address[14] 1638 个1bit寄存器。

计数器

计数器芯片有两个附加的控制位reset和inc。当inc=1时,计数器在每个时钟周期自加,输出值out(t)=out(t-1)+1。如果想要将计数器重置为0,就将reset位置为1;如果想要将其初始化为某个计数值d,就将d置于in输入管脚然后将1oad位置1。

计数器的这段代码有空多看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CHIP PC {
    IN in[16],load,inc,reset;
    OUT out[16];

    PARTS:
    // inc=1 ++ 
    Mux16(a=preOut, b=addOut, sel=inc, out=o1);
    // load=1 b=in
    Mux16(a=o1, b=in, sel=load, out=o2);
    //reset=1 置零
    Mux16(a=o2, b=false, sel=reset, out=o3);

    //寄存器的每个时钟周期都在更改,load直接设置位true
    Register(in=o3, load=true, out=out,out=preOut);
    Inc16(in=preOut, out=addOut);
}
This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags