數字邏輯電路1--(半)全減器

    去年秋季學期學習數電的時候,看到全(半)加器的真值表就不怎麼理解,可能本身自己的邏輯能力不是很厲害,後來,有一天晚上看着真值表,突然有了靈感,就一下子就理解了。


這次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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章