加法器和減法器的實現
最近一直在刷力扣。然後突然又想二刷計算機組成與設計。就結合計算機組成與設計這本書以及北大的同名精品課開始複習。看的是真的舒服。
唔,我自己看計算機組成與設計的時候,看了後面的邏輯設計部分,學到的最大的收穫就是,從真值表出發,或許可以推出簡單的邏輯運算公式,但是一定可以推出對應的電路圖。從邏輯運算公式出手,是一定能夠推出真值表的,也一定可以推出電路圖的。有了電路圖,真值表和邏輯運算公式也一定能夠推理出來。
因此,就從半加器出發吧。來試著推一下玩玩。
這是一個半加器的真值表。直接就可以看出C是與,S是異或。
這個比較簡單,電路如圖所示。
那如果是全加器呢?
來看,A B C 和OUT,很簡單,我們直接轉換真值表。
第一個A:1 B:1 C: 0 OUT:1。
那麼對應得就是
一般邏輯設計,有了真值表,可以直接看輸出為1的部分,只要能實現1,那麼0自然也實現了。
再來看其它部分:
那麼OUT的表示式整體上就是:並且化簡以後那就是:
那麼看最後的式子來翻譯OUT:
那就是 AB的與電路+(AB的異或電路)與C。
那麼結構如下:
好了,用同樣的道理進行化簡,就可以得到S的電路:
兩個內容一合成,就是全加器的電路:
4 bit加法器具體是這樣形成的:
也就是很簡單的4個1 bit 全加器串聯在一起就好了。
然後的話每一位分別對應一位加法器。
接下來是我做的一個例項:
好了,我們輕鬆地做出來了一個4Bit加法器。出發點是什麼?真值表和邏輯公式和電路的相互轉化!
具體32位加法器我就不具體做了,然後的話32位加法器差不多,下面是1個圖:
好了,問題來了,可能出現溢位的情況。具體的話得看到具體的操作。
如果是add,那是有符號數,就可能出現溢位,如果是addu,那是無符號數,那就問題不是太大。
具體的話是這樣的:
有符號數嘛,就是因為補碼造成的這種情況。無符號數就好多了,不會出現這種尷尬的情況。
當然了,溢位和進位不能一概而論,所以又有了下列的情況:
溢位又要怎麼檢測呢?很簡單,最高位的輸出不等於最高位的輸入。這就是溢位了。用什麼電路合適檢測?都是0和1的話輸出是0,否則為1。那麼顯然直接就是異或了。
減法器怎麼辦?A-B可以看成A+(-B)。那麼直接用補碼把B取反再+1即可。在具體的加法器的做法是這樣的:
當sub訊號為0時,那麼還是進行加法操作。當sub訊號為1時,B取反,之後C0置為1,進位輸入為1,那麼就做到了按位取反再加1的操作。
以上就是加減法的實現。