最近在学习《计算机系统系统要素-从零构建现代计算机》,在实现第3章第一个组件也就是Bit.hdl时,遇到了一些疑难,这里把解决办法和思路总结一下.
Bit组件要求实现
If load[t] == 1 then out[t+1] = in[t]
else out does not change (out[t+1] = out[t])
那么思路是用一个Mux和一个DFF实现,并且Mux的输出端要连到DFF的in端,关键点是以谁的out作为最后的输出.
我开始写的代码为
Mux(a=d,b=in,sel=load,out=c //Mux的输出连到DFF的in端
,out=out); //Mux.out作为整个输出
DFF(in=c,out=d);
测试不过。
然后看了网上的答案为
Mux(a=d,b=in,sel=load,out=c);
DFF(in=c,out=d,out=out);
经过研究,终于搞懂了两个做法的差异,总结如下
第一个电路的数学模型为
Mux.a=Dff.out(t)
Mux.b=Bit.in(t)
Mux.sel(t)=load(t)
Mux.out(t)=Mux.sel(t)?Mux.b(t):Mux.a(t)
Dff.in(t)=Mux.out(t)
Dff.out(t)=Dff.in(t-1)
Bit.out(t)=Mux.out(t)
此时有
Bit.out(t)=Mux.out(t)=Mux.sel(t)?Mux.b(t):Mux.a(t)
=load(t)?in(t):Dff.out(t)
=load(t)?in(t):Dff.in(t-1)
=load(t)?in(t):Mux.out(t-1)
=load(t)?in(t):Bit.out(t-1)
显然和要求不符
第二个电路的数学模型为
Mux.a(t)=Dff.out(t)
Mux.b(t)=Bit.in(t)
Mux.sel(t)=load(t)
Mux.out(t)=Mux.sel(t)?Mux.b(t):Mux.a(t)
Dff.in(t)=Mux.out(t)
Dff.out(t)=Dff.in(t-1)
Bit.out(t)=Dff.out(t)
于是有
Bit.out(t+1)=Dff.out(t+1)=Dff.in(t)=Mux.out(t)
=Mux.sel(t)?Mux.b(t):Mux.a(t)
=load(t)?Bit.in(t):Dff.out(t)
=load(t)?Bit.in(t):Bit.out(t)
符合要求