數(shù)字IC手撕代碼-半加器、全加器
????????大家好我是酸菜魚,這個系列著重講解數(shù)字IC或FPGA實習面試及秋招面試的高頻手撕代碼題 。
往期代碼題:
數(shù)字ic手撕代碼-導覽目錄 - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意奇數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(狀態(tài)機寫法) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器( 任意小數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
......
完全內(nèi)容,請前往導覽目錄查看。
半加器:
????????所謂半加器,就是不考慮進位的加法器,只有兩個輸入和兩個輸出;輸入A和B,輸出和數(shù)sum和進位cout,半加器真值表如下:

????????寫一個半加器其實就是把各個參數(shù)之間的關系用verilog描述出來。很容易可以得到:


從而有verilog代碼:

????????然而大多數(shù)公司的手撕代碼完半加器和全加器后,還會讓你手繪門電路,所以在這里我也提一下門電路畫法。
????????門電路其實很好畫,知道了信號之間的與非關系,就很好處理了,比如半加器的cout就是A和B的與,直接用一個兩輸入與門就能連接。而sum是A和B的異或,用一個異或門就可以得到,當然也不排除公司故意不讓你用異或門的情況。異或轉(zhuǎn)換成與門如下:

異或會用門電路畫了,那么半加器的門電路就很簡單了。

全加器:
????????全加器就是在半加器的基礎上引入一個進位輸入,總共三個輸入兩個輸出。全加器真值表如下:

????????這個不要背表達式,如果背表達式,正式手撕代碼的時候很容易忘記,然后寫錯(雖然全加器很簡單。)我們推導一下表達式。
????????這里的輸出一共有兩個,一個sum,一個進位cout。sum的值是A+B+cin然后去掉進位得到的,也就是說A、B、cin 中,如果輸入1的個數(shù)是奇數(shù),則sum為1,輸入1的個數(shù)為偶數(shù)(含零)則sum為0。根據(jù)這個奇偶判定,可以想到用異或操作,所以得到表達式:

????????cout的值也好分析,cout是加和出來的進位,也就是說,如果A、B、cin三個數(shù)中,有兩個及以上個1,則cout為1,這個容易得到表達式:

代碼:

????????全加器的門電路就不畫了,原理和半加器是一致的,信號有點多容易弄混,所以畫的時候細心一點,就沒什么問題。