======Memory======
//Week 3 notes//
----
====Sequential Logic====
该逻辑指的是,在具有多个任务时,计算机是如何安排并处理这些任务的。相较于之前的内容,该处理过程中会带来一些新的问题:
* 时间管理
* 不同任务带来不同的输入
* 某个任务可能需要基于之前任务的结果
===时间管理===
==重复使用硬件==
使用相同的硬件来处理相同的计算。
==State==
计算过程中需要存储一些状态,比如之前计算的结果,计数器等等。
==Clock & Delay==
普通列表项目计算机通过 Clock 的方式来配合序列逻辑。通常的来说,是使用一个周期性的振荡器,将**连续**的物理时间转化为**离散**的时间序列。
计算机以序列单元(周期)为单位进行输入和输出的生成,该单元的数量是整数。这样就方便计算机可以一步一步的来处理自己的任务序列。
\\ \\
但问题在于,序列单元中的逻辑门运算,在真正的物理世界里,是有延迟(//Delay//)的,也就是信号输入,计算,到信号输出稳定的
这一段时间。如果我们的单元长度不够,那么这个单元中的逻辑门计算就无法完成。因此,我们的目标是,设计合理的 clock 单位长度,
来保证每个长度周期结束前逻辑门能够成功的完成计算,从而实现“忽略”延迟的效果。这也模拟了离散情况下的瞬时逻辑的概念(
如果以 clock 单元为单位,那么逻辑门的计算就是瞬时完成的)
所谓的灰色区域指的是电路中最长路径传播的 delay (//Critical Path//)。clock 的周期需要稍微长于该区域,是因为 delay 在现实电路中
会受到很多因素的影响从而导致变化(比如温度,电压)等等。因此我们需要设计出一定量的冗余来保证逻辑计算有足够的时间来达到稳定状态。
==Sequential Logic 的优势==
* 逻辑门计算中,如果输入与输出发生在同一个 clock 单元,那么我们称这种逻辑为 //Combinatorial//,即 ''out[t] = function(in[t])''
* 如果输出发生在输入周期的**下一个** clock 周期单元,那么我们称这种逻辑为 //Sequential//,即 ''out[t] = function(in[t-1])''
使用序列逻辑可以实现迭代的效果:也就是上一个 clock 的计算结果可以直接在当前周期使用,比如:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:seq_logic.jpg?400 |}}
====Filp Flops====
* 为了使 ''t'' 时刻可以使用 ''t-1'' 时刻的信息,在 ''t-1'' 结束的那一刻,必须有一个状态位记录 ''t-1'' 的状态
* 该状态可以是 ''0'' 或 ''1'' ,因此该状态位需要在 ''0-1'' 之间翻转,因此被称为 //Filp-Flops//。
这一章实际就是在讲硬件上计算机是如何保存和更新状态的。
===Clock Data Flip Flop===
Clock Data Flip Flop 是一种简单的 Flip Flop。它的 out 返回上一个 Clock 中 input 的值:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:clock_data_flipflop.jpg?400 |}}
\\
下方的三角形表示该芯片是基于时间的(也就是结果基于 state 和 in) //sequential chip//(与之前的 combinatorial chips 不同,之前的芯片的输出只取决于输入)。
====D Flip Flop 的应用====
* 尽管实现上,sequential logic 可以由 combinatorial logic 实现,比如 D Flip-Flop 就可以由 Nand 实现。但理论上来讲,这两者应该严格的区分开来。
* 实现上,我们通过多个 D Flip-Flop 来组成不同的特定状态存储器(比如寄存器,指令计数器等等)
===1-bit register===
== 1-bit register:原理==
寄存器用于长时间记住某一位的状态,直到某刻通过外部请求更新:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:register_bitchip.jpg?300 |}}
\\
* ''load'' 位为 ''0'' 时,//Bit// 将永久存储**之前**最近的,''load = 1'' 时记录的 ''t-1'' ''in'' 的状态
* 否则,使用**最新**的 ''t-1'' 状态对其更新
# 注意 bit 保存的永远是上一个 clock 的状态
# load 变为 1 时,意味着下一个 clock Bit 将存储当前 in 的值
load: 1->0->0->1->0
in: 1->0->0->0->0
out: 1->1->1->0->0
== 1-bit register:load 的具体实现==
实际实现中,1-bit register 通过一个以 //load// 信号源作为 ''sel'' 的 //MUX// 来控制是否保存之前的内容:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:1_bit_reg.svg?300 |}}
\\ \\
当 //load// 为 1 时,此时输入端为 ''in'',DFF 存储当前 clock ''in'' 的值,并输出给下一个 clock 使用:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:1_bit_reg_load_1.svg?300 |}}
\\ \\
当 // load // 为 0 时,此时输入端为 DFF。由于 DFF 的作用是保存上一个 bit 的内容,此时等于是 DFF 一直在用之前的内容作为输入,因此达到了永久保存状态的效果:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:1_bit_reg_load_0.svg?300 |}}
====Memory Units====
===Register===
Register(寄存器)实际上是一系列 1-bit register 的组合:
* 单元 resigter 的数量,也就是 register 的带宽,这里被称做 //word//(字长)
* 单元 resigter 中存储的,是 register 的 state
{{ :cs:comp_n_arch:courses:fnti_i:reg_16.jpg?250 |}}
==Read Logic==
* ''out'' 的输出就是 read 的结果
==Write Logic==
* 当前 clock 设置 //load// 为 1,此时寄存器存储 ''in'' 的输入值
* 下一个 clock 开始,寄存器会将所存储的 ''in'' 值直接通过 ''out'' 输出
===RAM unit===
==RAM abstraction==
* 由 $n$ 个寄存器组成的,可**寻址**(//addressable//)的序列
* 寻址范围为 $[0, n-1]$
* 指定的某个时间,**只有一个** RAM 中的寄存器会被选中
* RAM 是 sequential chip
{{ :cs:comp_n_arch:courses:fnti_i:ram_unit.jpg?150 |}}
==address 的带宽==
* ''k'': width of address input
* ''w'': word width
$$k=log_2n$$
比如 8 个寄存器需要 3 位带宽去表示:
\\ \\
{{ :cs:comp_n_arch:courses:fnti_i:ram_unit_implementaion.jpg?200 |}}
==RAM unit 的读取逻辑==
- 寻址:''set address = i''
- 输出当前地址寄存器的值:probe out
==RAM unit 的写入逻辑==
- 寻址:''set address = i''
- 设定输入值(需要写入的值):''set in = v''
- 修改 ''load'' 的状态为 ''1'' :''set load = 1''
下一个 clock 的 ''out'' 将会输出 ''v''。
====Counters====
计算机在执行一系列指令中,通常需要知道当前,以及下一步执行什么指令。//Counter//(计数器)用于解决该问题。计数器内部通过记录下一步指令的地址来达到该效果。
===常见的计数器操作===
* Reset:获取指令集中第一条指令 ''PC = 0''
* Next:获取指令集中下一条指令 ''PC++''
* Goto:获取指令集中第 ''n'' 条指令 ''PC = n''
===Counter Abstraction===
针对上述的操作,计数器的控制分为三个 Bits://load//,//inc// 和 //reset//:
* 如果 ''reset'' 位为 ''1'',则下个循环的计数器技术输出归零
* 否则,如果 ''load'' 位为 ''1'',则下个循环的计数器输出为指定值 ''n''
* 否则,如果 ''inc'' 位为 ''1'',则下个循环的计数器输出为当前值 ''+1''
* 如果上面三位 Bits 都为 ''0'',则什么都不做。
{{ :cs:comp_n_arch:courses:fnti_i:counter.jpg?200 |}}