去年秋季學期學習數電的時候,看到全(半)加器的真值表就不怎麼理解,可能本身自己的邏輯能力不是很厲害,後來,有一天晚上看着真值表,突然有了靈感,就一下子就理解了。
這次EDA的課後作業就是verilog設計一個全減器,使用半減器的例化語句
0x00 廢話不多說,直接貼上半減器的真值表如下
我們來理解一下半減器的原理,我們知道,這是針對於二進制的運算,二進制基礎運算。當0-0=0,此時沒有向高位借位,所以對於高位借位則爲0。那麼0-1呢?我們知道,二級制運算以1當2(也就是10),所以沒法減去1,只能向高位進行借位操作,此時對於高位借位則爲1,借位之後變成“2”(10),最後運算的結果爲1。同理,再分析其他情況的運算也是如此。
貼上verilog描述
module h_suber(a, b, s, c);
input a, b;
output s, c;
assign s = a ^ b; //輸出差值
assign c = b & (~a); //向高位的借位
endmodule
0x01進一步加深,我們來學習下全減器,在半減器的基礎上增加了來自低位的借位,這裏可以對比全加器的規則,對於全加器是存在來自低位的“進位”,進行運算的時候也把低位進位考慮其中。所以對於全減器的規則,我們則把低位的借位給減去,再根據被減數和減數來判斷高位的借位。也可以這樣理解,對於低位的借位,因爲是低位向被減數這一位借的,所以被減數應當被減去一位1。
運算公式:A-B-C1=D(C2的值取決於運算的結果是否需要向高位借位)
//被減數x,減數y,低位借位sub_in,高位借位sub_out,差diffr
//例化語句實現
module f_suber(x, y, sub_in, sub_out, diffr);
input x, y, sub_in;
output sub_out, diffr;
wire net1, net2, net3;
//h_suber(a, b, s, c);
h_suber u1(x, y, net1, net2);
h_suber u2(net1, sub_in, diffr, net3);
or u3(sub_out, net2, net3);
endmodule