最近在學習《計算機系統系統要素-從零構建現代計算機》,在實現第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)
符合要求