1、Abstract
在随机计算中,除了之前提到的那些利用组合电路设计目标函数的方法,也可以利用时序电路进行设计随机计算电路来实现目标函数,我们利用一种方法叫线性有限状态机**(Linear Finite State Machine-FSM)** 来设计一些较复杂的函数,例如:指数函数,双曲正切函数,并且这种方法是比组合电路的设计更加高效的。但是一般的基于FSM的SC电路的设计方法还没有被提出来。在这篇文章中,我们介绍了了三种线性FSM的性质以及展示了一种基于FSM的实现目标函数的SC电路的设计方法。最后实验的结果显示我们这种设计电路的方法比确定性实现方法(Deterministic Implementation即传统的数字电路中的实现方法)和利用前面所提到的基于伯恩斯坦多项式的组合电路的设计方法的容错能力更强,并且**电路面积延迟积(area-delay product)**也更小。
2、Introduction
未来的集成电路都将是超大规模集成电路,而这种设计对于噪声和变化会更加敏感。我们利用传统的逻辑门电路基于随机比特流的概念来设计一种一种实现计算功能的电路。它相比于传统的电路设计方法能够在低成本并且在维持相同性能的条件下,拥有很好的容错能力。
就像在前面几个博客中说到的,在SC中,利用一串比特序列中"1"的个数占比特流长度的比例表示比特流中每一位出现1的概率
P
(
X
=
1
)
=
x
∈
[
0
,
1
]
P(X=1)=x\in[0,1]
P(X=1)=x∈[0,1]。在SC计算中,有多种表示数值的方法,一种是单边形式(Unipolar Coding Format),就是上面的形式;另外有一种是双边形式**(Bipolar Coding Format),这种编码方式是
2
P
(
X
=
1
)
−
1
=
x
∈
[
−
1
,
1
]
2P(X=1)-1=x\in[-1,1]
2P(X=1)−1=x∈[−1,1]。值得注意的是这两种编码方式可以在同一个SC电路中共存。 SC中可以利用基本逻辑门器件描述基本的运算,比如利用AND**表示乘法运算,这里就不再赘述,在之前我的博客里都有描述。
但是利用基于组合逻辑设计的SC电路一个很大的问题是不能很好的应用在复杂目标函数上,比如:指数函数和双曲正切函数。。。
下面介绍两种基于FSM的SC电路。
第一种是:随机指数函数。状态转移图如下:
它所实现的函数是:
可以注意到,其中
x
x
x是属于双边编码方式,而
y
∈
[
0
,
1
]
y\in [0,1]
y∈[0,1]是单边编码方式。利用
N
=
16
,
G
=
2
N=16,\ G=2
N=16, G=2去近似这个函数的结果如下:
第二种是随机双曲正切函数
状态转移图如下:
它近似的函数表达式:
结果如下图(N=8):
这个SC电路中,
x
x
x和
y
y
y都是双边编码方式。
可以观察到上面两个例子的状态转移图是利用了通用线性状态转移图的变形,通用的线性状态转移图如下:
但是上面两个函数是通过经验来实现的。一个通用的利用FSM设计目标函数的方法还没有被提出。所以,在这篇文章中,为了充分利用FSM来设计电路,我们首先介绍线性FSM的基本性质并展示一个基于线性FSM来设计目标函数的基本方法。
3、线性FSM的性质
状态机的基础形式是一个由N个状态按一定顺序排列的集合,总共会有
N
=
2
k
N=2^{k}
N=2k个状态,其中
k
k
k是正整数。输入是
X
X
X,输出是
Y
Y
Y,并且输出只与当前时刻的状态有关。在这个系统中,认为输入
X
X
X是随机比特流,并且是一个伯努利序列。这个系统是具有遍历性的并且任意时刻只可能有一个稳定的活跃状态(hyper-state) 存在。
我们定义输出
Y
Y
Y为1的概率是
P
Y
P_{Y}
PY,输入
X
X
X为1的概率是
P
X
P_{X}
PX,每个当前状态是
S
i
(
0
≤
i
≤
N
−
1
)
S_{i}(0\le i\le N-1)
Si(0≤i≤N−1)的概率是
P
i
(
P
X
)
P_{i(P_{X})}
Pi(PX)。这些概率满足如下条件:
即:1、状态机中任意两个状态之间互相转变的概率是相等的;
2、状态机中所有状态的概率和是1;
3、
s
i
s_{i}
si控制输出是0
(
s
i
=
0
)
(s_{i}=0)
(si=0),还是1
(
s
i
=
1
)
(s_{i}=1)
(si=1),把所有状态输出为1的可能性加起来即为输出为1的概率。
基于上式,可以写出
P
Y
P_{Y}
PY和
P
X
P_{X}
PX之间的函数关系,如下:
基于上式,我们可以给出这个线性FSM的三个特性:
1、
P
i
(
P
X
)
P_{i(P_{X})}
Pi(PX)和
P
N
−
1
−
i
(
P
X
)
P_{N-1-i(P_{X})}
PN−1−i(PX)是关于
P
X
=
0.5
P_{X}=0.5
PX=0.5对称的,也就是说
P
i
(
P
x
)
=
P
N
−
1
−
i
(
P
X
)
P_{i(P_{x})}=P_{N-1-i(P_{X})}
Pi(Px)=PN−1−i(PX)
2、如果N足够大的话,例如
N
≤
8
N\le 8
N≤8,
a、当
P
X
∈
[
0
,
0.5
)
P_{X}\in[0,0.5)
PX∈[0,0.5),
P
Y
P_{Y}
PY将主要由从
S
0
S_{0}
S0到
S
N
2
−
1
S_{\frac{N}{2}-1}
S2N−1的状态决定;
可以将上面描述成如下公式:
3、
4、一般方法来设计基于FSM的SC电路
A、Circuit Implementation of the Linear FSM
将上面式子中
s
i
s_{i}
si改成
P
(
s
i
)
P(s_{i})
P(si)
电路如下:
这个电路主要三个部分:
解释一下这边的K to N Decoder,由于在某一个时刻只能有一个状态存在,而总共又有
N
=
2
k
N=2^{k}
N=2k个状态,另外我们的这个FSM类似于数电中的饱和计数器,由这K个D触发器输出组成每一个状态,将这K位的二进制数译成十进制数,并输送到对应序号的管脚上,这就是这个Decoder的作用。
注:这个FSM和饱和计数器十分相似。它们唯一的区别就是状态转移图没有形成一个闭环,即在初始状态的时候不会回退到末尾状态,而末尾状态不会前进到初始状态,所以FSM相比于饱和计数器会更加高效并且需要更少的硬件。
饱和计数器的状态转移图如下:
其实通过上面的搭建的基于FSM的SC电路的框架,可以进一步理解基于FSM利用SC实现复杂函数的核心思想。前面的组合电路中,利用一些基本的逻辑门实现一些基本运算,例如,与门实现乘法;同样,在时序电路中,也存在基本运算单元,其实就是实现状态转移的那一部分,也就是上面那幅图中,编码器前面那部分电路,这部分实现了状态转移的部分,为什么说这部分是基本单元呢?因为,正如上面提到的,如果我们将该状态转移图利用连续的未知变量Px(即概率)等价描述,也就是这部分:
就可以得到一系列的方程,如下:
而这些方程就是构成复杂函数的基本单元。