V. Registers & Register Transfers

Registers

一个 nn 位的寄存器包含 nn 个触发器,还有若干组合电路来实现特定功能,如移位、计数等。

一般通过一个 LoadLoad 信号来控制寄存器,LoadLoad 信号一般通过更高阶的电路控制。可以把 LoadLoad 信号和 ClockClock 信号的 AND 来作为触发器的控制信号:

  • Load=1Load=1 表示 载入(load),新数据被写入寄存器。
  • Load=0Load=0 表示 储存(store),寄存器保持已经写入的数据。
时钟偏斜(clock skew)

如果给时钟信号加上一个非门,那么不同触发器的控制信号的时间存在一个非门的延时。

一种解决方案是时钟信号直接接到所有触发器的控制信号上,但触发器的输入信号接一个 2-to-1 MUX,根据控制信号选择是加载触发器的输出,还是从输入流中加载。

如果载入操作在同一个时钟脉冲中完成,我们称之是并行(parallel) 的。

Register Transfer Operations

寄存器传输操作(register transfer operation):处理存储在寄存器中的数据的操作。

微操作(microoperation):关于寄存器传输的初级操作,包括 load/count/shift/add/bitwise OR 等等。

Register Transfer Language

寄存器传输语言(register transfer language, RTL) 用来表述寄存器传输操作。

  • 字母和数字:表示寄存器
  • 小括号:表示位的范围(如 R(1)PC(7:0)
  • 箭头:表示数据的传输(如 R1 <- R2)
  • 逗号:用于分开多次操作
  • 方括号:(可通过寄存器)指定内存地址(如 R0 <- M[AR]
  • 条件传输(conditional transfer):如 K1: (R2 <- R1) 表示当 K1 寄存器的值为 1 时执行 R2 <- R1
关于寄存器传输操作的硬件描述语言的比较

如用 RTL 来描述一个加减法器的行为(X=0\text X=0 时加法,X=1\text X= 1 时减法):

X K1:R1R1+R2X K1:R1R1+R2+1\begin{aligned} \overline{\text{X}}\ \text{K1}&: \text{R1} \leftarrow \text{R1} + \text{R2}\\ \text{X}\ \text{K1} &: \text{R1} \leftarrow \text{R1} + \overline{\text{R2}} + 1 \end{aligned}

Register Transfer Structures

Multiplexer-Based Transfers

多个输入通过一个多路选择器进行选择,从而给到目标寄存器中。

Dedicated Multiplexer-Based Transfers

这里专有的(dedicated) 的 MUX 的意思是说,每个寄存器的输入都通过一个独立的 MUX 进行选择。

  • PROS:可以实现在一个时钟节拍中同时的数据传输。
  • CONS:门输入代价高。
    • GN 的计算:MUX 的反相器是可以共享的,每一个 MUX 里需要两个 2 输入与门和一个 2 输入或门,共 GN=3×6+3=21GN = 3 \times 6 + 3 = 21

Multiplexer Bus

总线(bus) 的主要思想在于让多个寄存器共享一个多路选择器和数据传输路径,把这个多路选择器称作是共享的(shared)

Three-State Bus

三台总线的实现需要用到三态门(tri-state gate),因为其可以输出高阻态,从而使得来自多个寄存器的输出可以直接连起来而不需要逻辑门或 MUX 的控制。

Shift Registers

一个普通的移位寄存器(shift register) 如下:

  • 串行输入(serial input)In\text{In}
  • 串行输出(serial output)Out\text{Out}
  • 并行输出(parallel output)A\text AB\text BC\text COut\text{Out}

Parallel-Load Shift Registers

通过给输入信号加一个 2-to-1 MUX 可以实现并行加载功能,这样在 SHIFT 为 0 时,移位寄存器 {A,B}\{A,B\} 会直接从 {DA,DB}\{D_A, D_B\} 加载数据,并且这一加载过程在同一时间发生(是并行的)。

如果需要支持保持(hold) 功能,可以换成 3-to-1 MUX,并接一路从自己这来的输出,功能表如下:

ShiftLoadOperation
00保持 no change
01加载 load
1x移位 shift down

注意,实现保持功能时,我们不能直接给时钟信号 CP 加一个与门,这样的话与门的延迟同样会导致上文提到过的时钟歪斜(clock skew) 问题。

Bidirectional Shift Registers

再换用 4-to-1 MUX 可以让我们的移位寄存器同时支持两个方向的移位操作,电路的一部分如下图所示。

其功能表如下(S1,S0S_1,S_0 为控制信号):

S1S_1S0S_0Operation
00保持 no change
01向下移位 shift down
10向上移位 shift up
11平行加载 parallel load

如果需要让移位寄存器支持更多功能,更换 MUX 并设计相应电路即可。

Counters

Ripple Counters

触发器 DAD_A 把时钟信号作为控制信号 CRC_R,其反转频率是时钟信号的一半;DBD_BDAD_A 的输出作为控制信号,其反转频率是 DAD_A 的一半,是时钟信号的四分之一。从而实现计数器的功能。

  • 最低有效位(LSB)
  • 最高有效位(MSB)

从最低有效位开始计数,低位触发器的输出作为更高一位触发器的控制信号。

时延计算:分析是上升沿还是下降沿,或者直接 tpdt_{pd}

Synchronous Counters

触发器只用来保存状态,计数的功能用组合电路(nn 位计数器只需要 nn 个半加器)实现。所有触发器同步改变。

  • 计数使能(count enable = CE):控制是否进行计数,当 CE=1\text{CE} = 1 且边沿到来时进行一次计数,当 CE=0\text{CE} = 0 时处于保持状态。
  • 进位输出(carry output = CO):给出最高的进位作为输出,可以指示计数器是否达到上界。

类似于加法器,我们也可以在并行计数器中实现提前进位:

Counters with Parallel Load

通过一个 2-to-1 MUX 控制是从 D\text D 中并行加载还是从组合逻辑中加载。

Modulo-N Counters

我们以设计模 10 的计数器(BCD 计数器为例),那么只有 0099有效的(valid),剩下的 6 个状态都是未使用的状态。

写出状态转移的激励方程,并通过卡诺图化简,可以得到我们需要的组合逻辑。

需要注意的是,虽然剩余 6 个状态是未使用状态,但是如果计数器因为意外处于未使用状态时,他的下一状态是确定的,画图可知我们设计的这一计数器在有限步后又会回到有效状态(称为自恢复能力;并非对于所有计数器都成立后,最好设计成这样的)。我们也可以设计一个 Error\text{Error} 输出,用于指示是否进入了未使用状态,同样可用卡诺图进行化简。

不推荐的设计(自杀式计数器):让模 nn 的计数器在输出变成 nn 时直接给所有寄存器异步清零。如果异步清零过程的时延不同,可能“卡在”中间的任意有效状态,非常不稳定。

Register Cell Design

Multiplexer-Based Design

  • 寄存器功能(register functions):可以通过寄存器传输语言 RTL 来描述。

  • 控制输入(control inputs):输入控制信号,控制信号的可以是编码的(encoded) 或未编码的。

  • 数据输入(date inputs):从寄存器中输入。

Example

Sequential-Circuit-Based Design

这里状态本身就是输出,所以一定是摩尔型电路。使用时序电路的相关方法进行设计,虽然结果更优但设计过程非常麻烦。

Example

Comments