在计算机系统中,有大量的寄存器,用来保存运行过程中的数据。如果要交换两个寄存器的内容,则通常会使用第三个寄存器为临时寄存器的方法。比如,假设要交换寄存器R1,R2的内容,可以先将R2的内容传递到第三个寄存器R3,然后将R1的内容传到R2,最后将R3的内从传递到R1。
计算机系统的存储器通常是通过下图所示的内部网络互联的。除了与网络互联的信号线,每个寄存器还有两个控制信号,Rkout和Rkin。Rkout使得寄存器Rk的内容传输至互联网络,Rkin信号使得互联网络上的数据传输至寄存器Rk。Rkout和Rkin通过有限状态机控制电路产生。在下图电路中,我们设计当w=1时候,交换寄存器R1和R2的内容,数据交换完成时候输出Done信号。Clock是时钟信号。
数据转换过程如下步骤:控制信号R2out=1,R3in=1, R2的内容传到到R3,然后R1out=1,R2in=1,R1的内容传输到R2,最后,R3out=1,R1in=1,R3的内容传输到R1,完成两个寄存器内容交换,交换完成后,设置信号Done=1。假设交换的初始条件是产生一个时钟周期的脉冲信号,则时序电路状态图如下。
初始状态A中,没有信号传输,所有的输出信号为0,电路一直保持该状态,直到w变为1产生交换请求。在状态B中,执行R2的内容传输到R3中的请求信号生效,数据在下一个时钟有效沿传送至R3。不管w为0或者1,在这个时钟沿也使得状态进入C。在状态C中,执行R1的内容传输到R2中的请求信号生效,数据在下一个时钟有效沿传送至R2。不管w为0或者1,在这个时钟沿也使得状态进入D。在状态D中,执行R3的内容传输到R1中的请求信号生效,数据在下一个时钟有效沿传送至R1。不管w为0或者1,在这个时钟沿也使得状态进入A。
由于有4个状态,所以需要2个状态变量y1,y2,最直接的分配是将状态A,B,C,D分别分配为y2y1=00,01,10,11。下面的是该电路的状态表
现在状态 | 下一状态 | 输出 | |||||||
w=0 | w=1 | R1out | R1in | R2out | R2in | R3out | R3in | Done | |
A | A | B | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | C | C | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
C | D | D | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
D | A | A | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
现在状态 | 下一状态 | 输出 | ||||||||
w=0 | w=1 | |||||||||
y2y1 | Y2Y1 | Y2Y1 | R1out | R1in | R2out | R2in | R3out | R3in | Done | |
A | 00 | 00 | 01 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 01 | 10 | 10 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
C | 10 | 11 | 11 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
D | 11 | 00 | 00 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
Y1 | Y1=w~y1+y2~y1 | |||
w/y2y1 | 00 | 01 | 11 | 10 |
0 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
Y2 | Y2=~y2y1+y2~y1 | |||
w/y2y1 | 00 | 01 | 11 | 10 |
0 | 0 | 1 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
根据这些状态表,我们可以得到如下的输出表达式:
Y1=w~y1+y2~y1
Y2=~y2y1+y2~y1
R2out=R3in=~y2y1
R1out=R2in=y2~y1
R1in=R3out=Done=y2y1