carry4(超前快速進位邏輯結構)和多位比較器/加法器實現
先說一段廢話
近期萌生了寫技術部落格的念頭,一來是可以記錄一些遇到的技術問題,理清思路,也可以記錄自己的技術成長;二來是可以將自己的知識分享,以便後人再碰到時能從容不破。希望今後在碰到原創有價值的問題時能堅持這一習慣,也算是督促自己,下面進入正題。
問題的引出
這裡有一個問題,一個32位的比較器需要使用多少個LUT。苦思冥想仍然未能得到答案,寫程式後檢視RTL網表,得到了答案。但是又看到了一個新的結構carry4(超前快速進位邏輯結構),這個結構會用在多位的比較器和多位的加法器上,要理解比較器和加法器的工作原理就需要理解這個超前快速進位邏輯。經過仔細研究,引出了這邊文章。
討論
首先給出答案一個32位的比較器需要使用32個LUT。具體這個超前快速進位邏輯結果起什麼作用慢慢進行分析。 通過RTL網表可以看出,綜合出來的結構如下圖:
1、32位比較器中的LUT
首先,32位比較器總共有64bit(位)輸入,實現兩32位數(a,b)比較,if(a>b)輸出1;else 輸出0;可以看到八個4輸入LUT為一組,接到carry4結構中。這八個4輸入LUT又分為兩組,前四個一組,後四個一組。前四個實現a>b的比較,後四個實現a=b的比較。 可以看到前四個LUT中的第一個為4輸入,分別連線a和b的2bit。簡化真值表如下:
輸入 | 輸出O |
---|---|
a>b | 1 |
a=b | 0 |
a<b | 0 |
後四個同理,簡化真值表如下:
輸入 | 輸出O |
---|---|
a>b | 0 |
a=b | 1 |
a<b | 0 |
這樣前四個LUT分別判斷了a、b兩數的0-1、2-3、4-5、6-7位的是否大於。後四個判斷了是否等於。那麼最簡單的比較就是比較高兩位了,如果高兩位a[31:30]>b[31:30],那麼就可以輸出1了。
但是隻這樣比較是不全面的,如果高兩位a不大於b,並不代表這a就小於或者等於b了,還需要比較後兩位,再後兩位這樣迴圈下去,直至比較到最低兩位,才能確定結果。
判斷32位的數簡單的流程來講就是進行比較:如果高八位a大於b,那麼肯定a大於b,輸出1;如果高八位a小於或等於的話,輸出是0。
但是僅僅是比較高8位是不全面的,高八位不大於的話有可能次八位還是a大,本應該輸出1,卻輸出了0,這是不對的,所以就需要判斷高八位是否等於,如果等於就繼續判斷後八位,迴圈下去。這也就是為什麼每八bit需要八個LUT分別分為兩組來判斷大於、等於。就是為了如果高八位不大於的話,判斷是等於,就會去判斷後八位。這裡就需要用到carry4結構來獲取後八位的比較結果了。
同樣的,我們講的是一個lut負責兩位,一組的前四個有四bit的輸出,而不是1bit,如何把4bit的輸出也聯絡起來,變成1bit,也需要這個carry4結構。
2、carry4的結構
在上面可以看到八個LUT接到一個carry4上,接法是a>b的判斷(前四個輸出)作為DI0輸入,a=b的判斷(後四個輸出)作為S0輸入。CIN接下一級carry4的輸出COUT,接法細節如圖: 對工作流程進行分析:
如果最高位相等(S3=1),mux選擇器就會選擇下一級的選擇器,如果不等(S3=0)mux選擇器就會選擇DI3,這樣的話就實現了判斷,並將八個一組LUT聯絡起來了。
- 只分析1bit,如果這一位元的值相等,則看低位bit的判斷值/進位值;
- 如果這一位元的值不等,則輸出值等於DI3,此時的輸出值就確定了是大於,還是小於,而且不包括等於的情況。
- 如果高位等於,就輸出就看低位的判斷值,如果低位大於就輸出1,小於就輸出0,仍等於,則繼續由下一級決定。
- 如果直到最下面的mux仍是等於,則由CIN決定輸出值。
一個carry4的功能就如上,可以實現8bit的數的比較。而由於比較器是32位的,即四組LUT,就需要四個carry4。
繼續上面的分析,當最下面的mux仍是等於,由CIN決定輸出值。而CIN接到了下一級的COUT(CO3)上,串聯起來,可以參考第一個圖。
這樣就將四組的比較值聯絡了起來,從最高兩位比較到最低兩位。如果最低兩位仍然相等,那麼輸出值就由CYINT決定。由於比較器是if(a>b) 輸出1,其他輸出0,所以CYINT就是0,即兩數相等。如果比較器是if(a>=b) 輸出1,其他輸出0,則CYINT就被設定為1。這裡可以自己跑跑看,就可以比較出差別。
3、carry4用於多位加法器
對於多位的加法器實現,也會用到carry4,具體的分析在第二個連結裡有,這裡只貼圖對一些細節進行一個補充說明。
a=4’b0101; b=4’b0011; S = a^b = 4’b0110; 對a和b做加法。
S輸入的是a與b的異或值(異或就是不進位加法)。DI輸入任何一個值(a或b)都可以。選擇器在S等於0(前面的不相等)的時候選擇DI,否則選擇下一級CO。
如何實現加法,首先S就是異或結果,異或為:【00-0,10-1,01-1,11-0(未進位)】只是缺少進位的加法。
這裡首先分析如何實現進位,也就是CO埠(1為進位,0為不進位)。
- 當S等於0時有兩種情況,00或者11,此時選擇器的選擇由DI決定,00時輸出0,也就進位是0;11時輸出的是1,剛好是進位了。
- 當S等於1時有兩種情況,01或者10,此時選擇器的選擇由CO,即下一級進行,也就是進位項進行,如果進位項是1,剛好加起來進位,如果是0則不進位。上面的情況分別為1234,繼續分析
如何把值算對就靠的是C了。
- 當S為0時,與下一級進行異或(相同0;不同1),也就是說此時00或者11了,本位的情況由下一級的進位情況決定,下一級為0本位就是0,下一級為1本位就進一位為1.
- 當S為1時,與下一級異或,下一級為1時進位,本位為0 ,下一級為0時不進位,本位為1(單bit加法,進位由前面的搞定)。
最後加法結果是C(1000)正確值,進位情況是CO(0111)。
分析到這裡就得感慨數位電路的奇妙,巧妙的利用選擇器和異或邏輯就可以實現進位和加法的運算,通過多級級聯進位,就可以實現多位的判斷。
本文就到這裡了,水平有限,有錯誤和提升的還請指正。
最後念一句詩,業精於勤而荒於嬉,希望自己能夠堅持積累,堅持成長。