《计算机系统要素》阅读总结及实现第三章——时序逻辑

本系列为阅读《计算机系统要素》之后的总结,如有不准确或者错误的地方,欢迎指正。

个人建议,阅读完《Code–隐匿在计算机软硬件背后的语言》后,再阅读此书,效果更佳。

在第一、二章中,介绍了逻辑门的搭建和算术芯片的搭建,这些门和算术芯片根据输入变量,及时输出结果,但是它们仅输出结果,并不能保持自身的状态。计算机不仅需要计算能力,还需要配备记忆单元,这些记忆单元由时序芯片组成。
记忆单元的搭建用到了触发器这一基础模块,基础模块我们当做黑匣子处理,不研究内部结构,只利用它的特性来实现其它硬件。

1、时序元件介绍

1.1 触发器(Flip-Flops)

数据触发器(Data Flip-Flop,DFF/D触发器 ),接口包含一个比特位输入和一个比特位输出,还有一个时钟输入,根据时钟信号连续地交变。out (t)= in(t - 1),DFF将前一个时间周期的输入值作为当前周期的输出
在这里插入图片描述

图1 触发器

1.2 寄存器(Registers)

能够“存储”或者记忆某一时刻的值,out(t)= out(t- 1)
可以通过DFF实现该功能,在DFF前加上一个二选一选择器

  • 比如现在load为1,表示选择器输出的是in接口的数值,那么DFF输出的就一直是in端口的数值
  • 如果load是0,那么选择器输出的是DFF上次输出的数值,相当于数据一直被保持,直到新的指令到来。
    在这里插入图片描述
图2 1-bit 位寄存器

实现了1-bit寄存器就意味着实现了多位寄存器

在这里插入图片描述

图3 w-bit 位寄存器

1.3 内存(Memories)

寄存器堆叠形成RAM(Random Access Memory),不受限于访问数据,内存中的任何字都能以相等的速度被直接访问。
RAM中的每个内存单元分配一个唯一的地址,寻址逻辑门能够根据指定的地址寻找到对应的记忆单元。
RAM设备的接受包含:数据输入、地址输入和加载位(Load 为0时,输出被选中的记忆单元的数值;Load为1时,被选中的记忆单元被赋予新值)

在这里插入图片描述

图4 RAM芯片结构

1.4 计数器(Counter)

计数器每经过一个时钟周期就增加一个单位,out(t)= out(t -1) + c。
比如CPU包含一个程序计数器,它的输出是当前程序中下一步将要执行的指令地址。

综上,DFF门赋予了上述时序芯片维持状态或者对状态进行操作的能力。

2、时序元件的硬件语言描述

在文章中,DFF门作为原始构建模块

2.1 寄存器(Register)

在这里插入图片描述

图5 一位寄存器
一位寄存器:
CHIP Bit {
    IN in, load;
    OUT out;

    PARTS:
    Mux(a = preOut, b = in, sel = load, out = o1);
    DFF(in = o1, out = preOut, out = out);
}

在这里插入图片描述

图6 16位寄存器
16位寄存器:
CHIP Register {
    IN in[16], load;
    OUT out[16];

    PARTS:
    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]);
}

2.2 存储器(Memory)

图7为包含8个寄存器(16位寄存器)的存储器,采用DMux8Way,将3位地址分解成8路控制信号,对八个Register进行控制
Load为0时,表示要对存储器进行读操作,寄存器输出其内容;Load为1时,表示要对存储器进行写操作,寄存器从in引脚加载数值。
在这里插入图片描述

图7 存储器
RAM8
CHIP RAM8 {
    IN in[16], load, address[3];
    OUT out[16];

    PARTS:
    DMux8Way(in = load, sel = address, a = loadA, b = loadB, c = loadC, d = loadD, e = loadE, f = loadF, g = loadG, h = loadH);

    Register(in = in, load = loadA, out = o1);
    Register(in = in, load = loadB, out = o2);
    Register(in = in, load = loadC, out = o3);
    Register(in = in, load = loadD, out = o4);
    Register(in = in, load = loadE, out = o5);
    Register(in = in, load = loadF, out = o6);
    Register(in = in, load = loadG, out = o7);
    Register(in = in, load = loadH, out = o8);

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

2.3 程序计数器(Programmer Counter)

程序计数器的功能需求:指令地址计数器内容是计算机下一周期要读取和执行的指令地址,还要实现地址的跳转,清零

  • 跳转功能: 跳跃执行编号为n的指令,可以将指令设置成n,然后它继续执行计数行为n + 1,n + 2等等
  • 加1操作: 计算机获取下一条指令
  • 计数器清零: 让程序重新执行
    在这里插入图片描述
图8程序计数器

这里程序计数器中的选择器,选择引脚如果为1,就选择下面的那个作为输入

在这里插入图片描述

图9 程序计数器结构
CHIP PC {
    IN in[16],load,inc,reset;
    OUT out[16];

    PARTS:
    Mux16(a = preOut, b = addOut, sel = inc, out = o1);
    Mux16(a = o1, b = in, sel = load, out = o2);
    Mux16(a = o2, b = false, sel = reset, out = o3);
    Register(in = o3, load = true, out = preOut, out = out);
    Inc16(in = preOut, out = addOut);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值