位:計(jì)算機(jī)加法器的核心原理與工程實(shí)現(xiàn))
1. 項(xiàng)目概述從開關(guān)到計(jì)算加法器的演進(jìn)之路在數(shù)字電路和計(jì)算機(jī)體系結(jié)構(gòu)的世界里加法器是當(dāng)之無(wú)愧的基石。它遠(yuǎn)不止是一個(gè)簡(jiǎn)單的“計(jì)算器”而是所有復(fù)雜運(yùn)算減法、乘法、除法乃至浮點(diǎn)運(yùn)算得以構(gòu)建的起點(diǎn)。今天我們不談那些高深莫測(cè)的處理器架構(gòu)就從一個(gè)最基礎(chǔ)的問(wèn)題聊起計(jì)算機(jī)是如何用一堆開關(guān)晶體管來(lái)實(shí)現(xiàn)“112”的這個(gè)問(wèn)題的答案就藏在半加法器、全加法器和超前進(jìn)位加法器這一系列精巧的設(shè)計(jì)之中。無(wú)論你是電子工程的學(xué)生還是對(duì)硬件底層感興趣的開發(fā)者理解這些加法器的原理就像是拿到了打開數(shù)字世界大門的鑰匙能讓你真正看懂從邏輯門到ALU算術(shù)邏輯單元的演進(jìn)脈絡(luò)。接下來(lái)我將結(jié)合自己調(diào)試電路和設(shè)計(jì)模塊的經(jīng)驗(yàn)帶你一步步拆解這三種加法器的核心原理、電路實(shí)現(xiàn)以及它們背后的設(shè)計(jì)哲學(xué)讓你不僅知道它們是什么更明白為什么需要它們以及在實(shí)際項(xiàng)目中如何選擇和優(yōu)化。2. 加法器的核心設(shè)計(jì)思路與演進(jìn)邏輯2.1 從一位加法到多位加法問(wèn)題的分解與抽象數(shù)字電路處理的是二進(jìn)制數(shù)加法運(yùn)算本質(zhì)上是對(duì)每一位進(jìn)行“加”操作并處理可能產(chǎn)生的進(jìn)位。最直接的思路就是從最低位開始一位一位地算。這聽起來(lái)簡(jiǎn)單但設(shè)計(jì)一個(gè)可靠的電路來(lái)實(shí)現(xiàn)它需要考慮清楚幾個(gè)層次的問(wèn)題。首先我們需要一個(gè)能處理單一位加法的基本單元。這個(gè)單元需要兩個(gè)輸入加數(shù)A和被加數(shù)B并產(chǎn)生兩個(gè)輸出本位和Sum和向高位的進(jìn)位Carry Out。但這里有個(gè)關(guān)鍵最低位加法時(shí)沒(méi)有來(lái)自更低位的進(jìn)位輸入而從第二位開始就必須考慮來(lái)自低位的進(jìn)位。這就引出了兩種最基本的單元半加法器和全加法器。半加法器只管兩個(gè)輸入位的相加而全加法器則額外處理了一個(gè)進(jìn)位輸入。這種設(shè)計(jì)體現(xiàn)了硬件設(shè)計(jì)中一個(gè)非常重要的思想模塊化和層次化。先設(shè)計(jì)好一個(gè)可靠、功能單一的小模塊全加法器然后用它像搭積木一樣構(gòu)建出更復(fù)雜的系統(tǒng)多位加法器。其次當(dāng)我們用全加法器串聯(lián)起來(lái)構(gòu)成一個(gè)多位加法器比如4位、8位時(shí)一個(gè)新的瓶頸出現(xiàn)了進(jìn)位延遲。在串聯(lián)也稱行波進(jìn)位加法器中進(jìn)位信號(hào)必須像波浪一樣從最低位依次傳遞到最高位。這意味著高位必須等待低位的運(yùn)算完全結(jié)束后才能開始計(jì)算嚴(yán)重限制了加法器的運(yùn)算速度。為了解決這個(gè)速度瓶頸工程師們發(fā)明了超前進(jìn)位加法器。它的核心思想是“預(yù)測(cè)”進(jìn)位通過(guò)額外的邏輯電路提前計(jì)算出所有位的進(jìn)位信號(hào)從而讓所有位幾乎能同時(shí)開始計(jì)算極大地提升了速度。從半加器到全加器是功能的完善從行波進(jìn)位到超前進(jìn)位則是性能的飛躍。理解這個(gè)演進(jìn)邏輯你就能把握住數(shù)字電路設(shè)計(jì)在追求正確性之后對(duì)效率的極致追求。2.2 關(guān)鍵邏輯門與、或、異或的舞臺(tái)在深入具體電路之前必須重溫一下三位“主角”與門AND、或門OR和異或門XOR。它們是構(gòu)建所有加法器的磚瓦。異或門XOR它是計(jì)算“和Sum”的關(guān)鍵。異或門的邏輯是“相同為0不同為1”。這正好對(duì)應(yīng)了二進(jìn)制加法的本位和規(guī)則忽略進(jìn)位000011101110本位。所以在半加器和全加器中Sum的輸出邏輯總是包含A和B的異或運(yùn)算。與門AND它是產(chǎn)生“進(jìn)位Carry”的關(guān)鍵之一。與門的邏輯是“全1為1否則為0”。想想看什么時(shí)候會(huì)產(chǎn)生進(jìn)位只有當(dāng)兩個(gè)加數(shù)位都是1的時(shí)候11。所以進(jìn)位信號(hào)Carry的邏輯表達(dá)式中總會(huì)包含A AND B這一項(xiàng)。或門OR用于組合多個(gè)產(chǎn)生進(jìn)位的條件。在全加器中進(jìn)位可能由兩種情況產(chǎn)生當(dāng)前兩個(gè)輸入位都是1或者雖然當(dāng)前兩個(gè)輸入位不全是1但來(lái)自低位的進(jìn)位是1且當(dāng)前至少有一個(gè)輸入位是1。這時(shí)就需要或門來(lái)合并這些條件。提示很多初學(xué)者會(huì)混淆“半加器”和“全加器”中“半”與“全”的含義。這里的“全”并非指功能完整而是特指“具備完整的進(jìn)位輸入端口”。全加器是一個(gè)完備的、可串聯(lián)的基本加法單元。3. 基礎(chǔ)構(gòu)建塊半加法器與全加法器深度解析3.1 半加法器兩位加法的起點(diǎn)半加法器是最簡(jiǎn)單的加法單元它處理兩個(gè)一位二進(jìn)制數(shù)A和B的相加。功能定義輸入A, B輸出和 Sum (S)進(jìn)位 Carry (C_out)真值表一切邏輯的起點(diǎn)。ABSum (S)Carry (C_out)0000011010101101觀察真值表你可以直觀地看到Sum的輸出規(guī)律只有當(dāng)A和B不同時(shí)Sum才為1。這完美匹配異或門XOR的邏輯S A ⊕ B。Carry的輸出規(guī)律只有當(dāng)A和B同時(shí)為1時(shí)Carry才為1。這完美匹配與門AND的邏輯C_out A · B。電路實(shí)現(xiàn)因此半加器的電路圖極其簡(jiǎn)潔一個(gè)異或門輸出Sum一個(gè)與門輸出Carry。你甚至可以用更基礎(chǔ)的與非門NAND或或非門NOR來(lái)搭建但異或門和與門的組合是最直觀、最易于理解的版本。局限性與應(yīng)用場(chǎng)景半加器的“半”體現(xiàn)在它沒(méi)有進(jìn)位輸入C_in。這意味著它只能用于二進(jìn)制加法的最低位因?yàn)樽畹臀淮_實(shí)沒(méi)有來(lái)自“前一位”的進(jìn)位。在實(shí)際的多位加法器設(shè)計(jì)中我們很少直接使用獨(dú)立的半加器芯片更多的是將其概念作為理解全加器的基礎(chǔ)。但在一些簡(jiǎn)單的校驗(yàn)電路或特定的組合邏輯中你可能會(huì)看到它的身影。3.2 全加法器可串聯(lián)的完整單元全加法器是構(gòu)建任何多位加法器的標(biāo)準(zhǔn)磚塊。它在半加法器的基礎(chǔ)上增加了一個(gè)至關(guān)重要的輸入來(lái)自低位的進(jìn)位輸入C_in。功能定義輸入A, B, C_in輸出和 Sum (S)進(jìn)位 Carry (C_out)真值表現(xiàn)在有3個(gè)輸入共8種組合。ABC_inSum (S)C_out0000000110010100110110010101011100111111分析這個(gè)真值表我們可以推導(dǎo)出輸出邏輯表達(dá)式Sum (S)觀察S為1的情況你會(huì)發(fā)現(xiàn)規(guī)律當(dāng)輸入中1的個(gè)數(shù)為奇數(shù)時(shí)S1。這依然是異或邏輯的擴(kuò)展即三個(gè)輸入的異或S A ⊕ B ⊕ C_in。你可以驗(yàn)證無(wú)論A、B、C_in如何取值這個(gè)等式都成立。Carry (C_out)C_out在三種情況下為1 a. A和B都為1無(wú)論C_in是什么對(duì)應(yīng)A · Bb. A和C_in都為1無(wú)論B是什么對(duì)應(yīng)A · C_inc. B和C_in都為1無(wú)論A是什么對(duì)應(yīng)B · C_in只要這三種情況有一種發(fā)生就會(huì)產(chǎn)生進(jìn)位。因此C_out是這三個(gè)條件的“或”關(guān)系C_out (A · B) (A · C_in) (B · C_in)。電路實(shí)現(xiàn)根據(jù)上述邏輯表達(dá)式你可以直接用兩個(gè)異或門和一個(gè)與或門組合來(lái)實(shí)現(xiàn)。但更經(jīng)典、更體現(xiàn)模塊化思想的做法是用兩個(gè)半加器和一個(gè)或門構(gòu)建一個(gè)全加器。第一個(gè)半加器計(jì)算A和B的和與進(jìn)位S1 A ⊕ B,C1 A · B。第二個(gè)半加器將S1與C_in相加S S1 ⊕ C_in,C2 S1 · C_in。最終的進(jìn)位C_out來(lái)自兩種情況第一個(gè)半加器產(chǎn)生的進(jìn)位C1或者第二個(gè)半加器產(chǎn)生的進(jìn)位C2。因此C_out C1 C2。 這個(gè)結(jié)構(gòu)非常清晰地展示了全加器如何通過(guò)組合更簡(jiǎn)單的模塊來(lái)實(shí)現(xiàn)更復(fù)雜的功能。實(shí)操心得在FPGA或數(shù)字IC設(shè)計(jì)中我們通常直接調(diào)用EDA工具庫(kù)里的全加器單元而不是自己用門電路搭建。但理解這個(gè)構(gòu)建過(guò)程至關(guān)重要。當(dāng)你在仿真中遇到加法時(shí)序問(wèn)題時(shí)能迅速判斷是組合邏輯延遲門級(jí)延遲問(wèn)題還是布線延遲問(wèn)題。例如用兩個(gè)半加器構(gòu)建的全加器其關(guān)鍵路徑從輸入到Sum或C_out的最長(zhǎng)路徑比優(yōu)化后的單一門級(jí)實(shí)現(xiàn)可能要長(zhǎng)這在高速設(shè)計(jì)中是需要考慮的。4. 從串聯(lián)到并行超前進(jìn)位加法器的原理與實(shí)現(xiàn)4.1 行波進(jìn)位加法器的瓶頸當(dāng)我們用n個(gè)全加器串聯(lián)起來(lái)構(gòu)成一個(gè)n位加法器時(shí)就得到了一個(gè)行波進(jìn)位加法器。它的連接方式很簡(jiǎn)單將第i位全加器的C_out連接到第i1位全加器的C_in。 這種結(jié)構(gòu)的優(yōu)點(diǎn)是設(shè)計(jì)簡(jiǎn)單、面積小。但缺點(diǎn)致命速度慢。因?yàn)楦呶槐仨毜却臀坏倪M(jìn)位信號(hào)計(jì)算并傳遞過(guò)來(lái)后才能開始計(jì)算。對(duì)于一個(gè)n位加法器最壞情況下進(jìn)位信號(hào)需要依次通過(guò)n個(gè)全加器的進(jìn)位邏輯鏈。假設(shè)每個(gè)全加器的進(jìn)位延遲為t那么總延遲就是n*t。當(dāng)n很大比如32位、64位時(shí)這個(gè)延遲是無(wú)法接受的它會(huì)成為整個(gè)CPU時(shí)鐘頻率提升的瓶頸。4.2 超前進(jìn)位的思想用空間換時(shí)間超前進(jìn)位加法器的核心思想是打破進(jìn)位傳遞的串聯(lián)依賴。它通過(guò)額外的組合邏輯直接根據(jù)所有位的輸入A, B和最低位進(jìn)位C_in并行地計(jì)算出每一位的進(jìn)位信號(hào)。這樣所有位幾乎可以在同一時(shí)間開始計(jì)算本位和從而極大縮短了總延遲。 關(guān)鍵在于推導(dǎo)進(jìn)位生成的通用公式。我們回顧全加器的進(jìn)位公式C_out (A · B) (A · C_in) (B · C_in)對(duì)于第i位i從0開始0為最低位我們定義兩個(gè)中間信號(hào)生成信號(hào)Generate, G_iG_i A_i · B_i。如果G_i為1表示這一位自身就會(huì)產(chǎn)生一個(gè)進(jìn)位無(wú)論有沒(méi)有進(jìn)位輸入。傳播信號(hào)Propagate, P_iP_i A_i ⊕ B_i。如果P_i為1表示這一位會(huì)將低位的進(jìn)位傳遞到高位即如果C_i為1則C_{i1}也為1。利用G和P第i位的進(jìn)位輸出可以重寫為C_{i1} G_i P_i · C_i這個(gè)公式非常優(yōu)美。它意味著進(jìn)位要么由本位“生成”要么由本位“傳播”低位的進(jìn)位?,F(xiàn)在我們展開來(lái)看前幾位的進(jìn)位C1 G0 P0 · C0(C0即最低位進(jìn)位C_in)C2 G1 P1 · C1 G1 P1·(G0 P0·C0) G1 P1·G0 P1·P0·C0C3 G2 P2 · C2 G2 P2·G1 P2·P1·G0 P2·P1·P0·C0C4 G3 P3 · C3 G3 P3·G2 P3·P2·G1 P3·P2·P1·G0 P3·P2·P1·P0·C0觀察C2、C3、C4的表達(dá)式你會(huì)發(fā)現(xiàn)它們不再依賴于前一級(jí)的進(jìn)位輸出而只依賴于所有低位的原始輸入A、B和最初的C0這就是“超前進(jìn)位”的奧秘。我們可以用多級(jí)與門和或門組成的組合邏輯電路一次性并行計(jì)算出所有這些進(jìn)位信號(hào)。4.3 4位超前進(jìn)位加法器CLA的電路結(jié)構(gòu)一個(gè)典型的4位超前進(jìn)位加法器由兩部分組成進(jìn)位生成/傳播邏輯為每一位計(jì)算G_i和P_i。超前進(jìn)位邏輯單元CLA Unit這是一個(gè)專門的組合邏輯電路輸入為G0, G1, G2, G3, P0, P1, P2, P3和C_in輸出為C1, C2, C3, C4。其內(nèi)部就是根據(jù)上面推導(dǎo)的C1到C4的公式用與或門搭建而成。和生成邏輯每一位在獲得自己的進(jìn)位輸入C_i對(duì)于第i位其進(jìn)位輸入就是C_i后可以并行計(jì)算本位和S_i P_i ⊕ C_i。注意這里的C_i已經(jīng)由CLA單元提前提供。這樣一來(lái)整個(gè)4位加法的延遲主要取決于計(jì)算所有G_i/P_i的延遲一級(jí)門延遲 CLA單元的組合邏輯延遲幾級(jí)門延遲但固定與位數(shù)無(wú)關(guān) 最后計(jì)算S_i的異或門延遲一級(jí)門延遲。這個(gè)總延遲遠(yuǎn)遠(yuǎn)小于4個(gè)全加器串聯(lián)的行波進(jìn)位延遲。4.4 多位超前進(jìn)位加法器的層級(jí)結(jié)構(gòu)對(duì)于16位、32位甚至64位的加法器如果直接套用上述公式CLA單元的電路會(huì)變得極其復(fù)雜與或門的扇入非常大反而會(huì)導(dǎo)致延遲和面積急劇增加。因此實(shí)際中采用分層超前進(jìn)位結(jié)構(gòu)例如組內(nèi)超前進(jìn)位組間行波進(jìn)位將16位加法器分成4個(gè)4位CLA小組。每個(gè)小組內(nèi)部是超前進(jìn)位速度很快。但小組之間的進(jìn)位采用類似行波的方式傳遞。這比純行波快但比純超前進(jìn)位慢是一種折中。組內(nèi)組間均超前進(jìn)位這就是**超前進(jìn)位生成器Carry Lookahead Generator, CLG**的用武之地。我們可以為每個(gè)4位CLA小組計(jì)算一個(gè)“小組生成信號(hào)G_group”和“小組傳播信號(hào)P_group”。然后再用一個(gè)頂層的CLA單元根據(jù)這些小組信號(hào)和C_in并行計(jì)算出每個(gè)小組的進(jìn)位輸入。這樣小組間的進(jìn)位也是并行的實(shí)現(xiàn)了真正的全超前進(jìn)位。現(xiàn)代高性能處理器中的加法器通常采用這種多級(jí)超前進(jìn)位結(jié)構(gòu)。注意事項(xiàng)超前進(jìn)位加法器用更復(fù)雜的電路更大的芯片面積、更高的功耗換來(lái)了速度的提升這是典型的“空間換時(shí)間”策略。在FPGA設(shè)計(jì)中工具鏈通常會(huì)自動(dòng)根據(jù)你的時(shí)序約束選擇是綜合成行波進(jìn)位還是超前進(jìn)位結(jié)構(gòu)或者使用器件內(nèi)置的專用快速進(jìn)位鏈。但對(duì)于ASIC設(shè)計(jì)或深度優(yōu)化手動(dòng)設(shè)計(jì)進(jìn)位結(jié)構(gòu)仍然是必要的技能。5. 加法器的電路實(shí)現(xiàn)與實(shí)戰(zhàn)解析5.1 門級(jí)電路實(shí)現(xiàn)與仿真驗(yàn)證無(wú)論是半加器、全加器還是超前進(jìn)位邏輯最終都需要落實(shí)到具體的門電路上。使用硬件描述語(yǔ)言如Verilog或VHDL進(jìn)行描述和仿真是現(xiàn)代數(shù)字設(shè)計(jì)的標(biāo)準(zhǔn)流程。以全加器為例一個(gè)行為級(jí)的Verilog描述非常簡(jiǎn)單module full_adder ( input A, B, C_in, output S, C_out ); assign S A ^ B ^ C_in; assign C_out (A B) | (A C_in) | (B C_in); endmodule綜合工具會(huì)自動(dòng)將其映射到目標(biāo)工藝庫(kù)的標(biāo)準(zhǔn)單元上。但如果你想手動(dòng)優(yōu)化或者理解門級(jí)網(wǎng)表可以將其實(shí)例化為兩個(gè)半加器和一個(gè)或門的結(jié)構(gòu)。對(duì)于超前進(jìn)位加法器以4位為例你需要先實(shí)現(xiàn)CLA單元module cla_unit ( input [3:0] G, P, input C_in, output [3:0] C, // C[0] is C1, C[1] is C2, ... output C_out ); assign C[0] G[0] | (P[0] C_in); assign C[1] G[1] | (P[1] G[0]) | (P[1] P[0] C_in); assign C[2] G[2] | (P[2] G[1]) | (P[2] P[1] G[0]) | (P[2] P[1] P[0] C_in); assign C[3] G[3] | (P[3] G[2]) | (P[3] P[2] G[1]) | (P[3] P[2] P[1] G[0]) | (P[3] P[2] P[1] P[0] C_in); assign C_out C[3]; // 對(duì)于4位CLAC[3]就是最終的進(jìn)位輸出 endmodule然后在頂層模塊中實(shí)例化CLA單元和多個(gè)全加器或直接計(jì)算和的邏輯。仿真驗(yàn)證是必不可少的步驟。你需要編寫測(cè)試平臺(tái)Testbench覆蓋邊界情況如全0、全1、進(jìn)位鏈傳遞等情況并使用波形查看器檢查輸出是否正確。一個(gè)常見(jiàn)的錯(cuò)誤是進(jìn)位信號(hào)的時(shí)序沒(méi)有對(duì)齊在同步電路中可能導(dǎo)致建立/保持時(shí)間違例。5.2 運(yùn)放模擬加法器另一個(gè)維度的實(shí)現(xiàn)值得注意的是在網(wǎng)絡(luò)熱詞中出現(xiàn)了“運(yùn)放加法器電路圖”、“LM324雙輸入反相加法器”等內(nèi)容。這屬于模擬電路領(lǐng)域與上述數(shù)字邏輯加法器是截然不同的實(shí)現(xiàn)方式但目的相似實(shí)現(xiàn)電壓信號(hào)的相加。以最常見(jiàn)的反相加法運(yùn)算電路為例原理利用運(yùn)算放大器虛短V ≈ V-和虛斷輸入電流為零的特性將多個(gè)輸入電壓通過(guò)電阻連接到運(yùn)放的反相輸入端V-。輸出電壓V_out與各輸入電壓的加權(quán)和成反比關(guān)系V_out -R_f * (V1/R1 V2/R2 ...)。通過(guò)選擇電阻值可以實(shí)現(xiàn)比例加法。LM324是一款常見(jiàn)的四運(yùn)放芯片常用于此類電路。與數(shù)字加法器的區(qū)別這是對(duì)連續(xù)模擬信號(hào)進(jìn)行線性疊加結(jié)果是模擬電壓而數(shù)字加法器處理的是離散的二進(jìn)制數(shù)字結(jié)果是數(shù)字量。兩者應(yīng)用場(chǎng)景不同模擬加法器常用于信號(hào)調(diào)理、音頻混合等數(shù)字加法器則是CPU/FPGA的核心算術(shù)部件。切勿將兩者的原理和設(shè)計(jì)方法混淆。實(shí)操心得在PCB設(shè)計(jì)模擬加法器時(shí)布局布線至關(guān)重要。電阻應(yīng)盡可能靠近運(yùn)放輸入端以減少寄生電容和噪聲。對(duì)于反相放大結(jié)構(gòu)在同相輸入端V到地之間連接一個(gè)匹配電阻阻值等于R1//R2//...//R_f可以減小輸入偏置電流引起的失調(diào)電壓。雙電源供電時(shí)別忘了在電源引腳附近放置去耦電容如0.1μF陶瓷電容這是保證運(yùn)放穩(wěn)定工作的基礎(chǔ)。6. 常見(jiàn)問(wèn)題、設(shè)計(jì)權(quán)衡與選型指南6.1 問(wèn)題排查與調(diào)試技巧在設(shè)計(jì)或使用加法器電路時(shí)可能會(huì)遇到以下典型問(wèn)題問(wèn)題現(xiàn)象可能原因排查思路與解決方法數(shù)字仿真結(jié)果錯(cuò)誤1. 代碼邏輯錯(cuò)誤如運(yùn)算符優(yōu)先級(jí)。2. 位寬不匹配導(dǎo)致溢出被截?cái)唷?. 測(cè)試向量未覆蓋關(guān)鍵情況如進(jìn)位溢出。1. 逐行檢查RTL代碼特別是進(jìn)位鏈邏輯。使用$display打印中間信號(hào)值。2. 檢查所有信號(hào)和變量的位寬聲明確保加法結(jié)果有足夠的位寬存放例如兩個(gè)4位數(shù)相加和需要5位寬。3. 補(bǔ)充測(cè)試用例必須測(cè)試最大/最小值相加、連續(xù)進(jìn)位等情況。時(shí)序仿真出現(xiàn)毛刺或違例1. 組合邏輯延遲過(guò)長(zhǎng)關(guān)鍵路徑時(shí)序不滿足。2. 超前進(jìn)位邏輯級(jí)數(shù)過(guò)多競(jìng)爭(zhēng)冒險(xiǎn)。3. 時(shí)鐘約束設(shè)置不當(dāng)。1. 查看綜合報(bào)告中的時(shí)序分析找到關(guān)鍵路徑??紤]插入流水線寄存器或優(yōu)化邏輯。2. 在超前進(jìn)位電路中由于與或門多輸入可能產(chǎn)生毛刺??赏ㄟ^(guò)仿真觀察必要時(shí)在輸出端加寄存器同步。3. 檢查時(shí)鐘頻率、抖動(dòng)和不確定性jitter uncertainty設(shè)置是否合理。FPGA資源占用過(guò)高1. 使用了行為級(jí)“”運(yùn)算符綜合工具可能推斷出面積較大的加法器。2. 多位加法器未優(yōu)化被綜合為多個(gè)分散的LUT。1. 對(duì)于關(guān)鍵路徑嘗試實(shí)例化器件原語(yǔ)如DSP48或使用IP核它們通常經(jīng)過(guò)高度優(yōu)化。2. 使用綜合工具的指令或?qū)傩匀鏢ynopsys的parallel_case、full_case或Vivado的use_dsp48屬性來(lái)引導(dǎo)綜合。模擬加法器輸出失真或振蕩1. 運(yùn)放帶寬不足或壓擺率不夠。2. 電路存在寄生振蕩布局布線不良。3. 電源去耦不足。1. 根據(jù)信號(hào)頻率選擇增益帶寬積GBW和壓擺率Slew Rate合適的運(yùn)放。確保閉環(huán)帶寬滿足需求。2. 檢查反饋回路在反饋電阻上并聯(lián)小電容幾pF到幾十pF進(jìn)行相位補(bǔ)償。優(yōu)化PCB布局縮短走線。3. 在運(yùn)放電源引腳最近處增加0.1μF和10μF的退耦電容。6.2 加法器類型選型與設(shè)計(jì)權(quán)衡在實(shí)際項(xiàng)目中選擇哪種加法器結(jié)構(gòu)是一個(gè)權(quán)衡的過(guò)程行波進(jìn)位加法器優(yōu)點(diǎn)結(jié)構(gòu)簡(jiǎn)單面積小功耗相對(duì)較低。缺點(diǎn)速度慢延遲隨位數(shù)線性增加。適用場(chǎng)景對(duì)速度要求不高的低頻應(yīng)用、面積敏感的設(shè)計(jì)、或者作為更復(fù)雜加法器如進(jìn)位選擇加法器的組成部分。超前進(jìn)位加法器優(yōu)點(diǎn)速度快延遲基本固定對(duì)于小組CLA與位數(shù)關(guān)系不大。缺點(diǎn)電路復(fù)雜面積大功耗高布線擁塞可能更嚴(yán)重。適用場(chǎng)景高性能CPU/GPU的算術(shù)核心、DSP處理單元、以及其他對(duì)運(yùn)算速度要求極高的關(guān)鍵路徑。進(jìn)位選擇加法器折中方案將加法器分為兩段高段同時(shí)計(jì)算“進(jìn)位為0”和“進(jìn)位為1”兩種結(jié)果等低段的實(shí)際進(jìn)位到來(lái)后再用一個(gè)多路選擇器選出正確的高段結(jié)果。它用額外的面積兩套計(jì)算電路換取了比行波進(jìn)位更快的速度通常比全超前進(jìn)位面積小。適用場(chǎng)景中等性能要求需要在速度和面積間取得平衡的設(shè)計(jì)。進(jìn)位保留加法器特殊用途常用于乘法器、壓縮樹等場(chǎng)景。它不立即解決進(jìn)位而是將進(jìn)位向量和和向量都保留下來(lái)在最后階段通過(guò)一個(gè)快速的加法器如超前進(jìn)位統(tǒng)一合并。它非常適合于需要連續(xù)進(jìn)行多次加法如點(diǎn)積運(yùn)算的場(chǎng)合。適用場(chǎng)景乘法器、FIR濾波器、密碼學(xué)運(yùn)算等。我的個(gè)人經(jīng)驗(yàn)是在FPGA項(xiàng)目中除非是極其嚴(yán)苛的時(shí)序場(chǎng)景否則直接使用“”運(yùn)算符讓綜合工具去優(yōu)化是最佳選擇?,F(xiàn)代綜合工具非常智能它會(huì)根據(jù)你的時(shí)序約束自動(dòng)選擇或混合使用行波進(jìn)位、超前進(jìn)位甚至調(diào)用專用的DSP塊中的快速加法器。而在ASIC設(shè)計(jì)中對(duì)于標(biāo)準(zhǔn)單元庫(kù)我們通常會(huì)有一個(gè)經(jīng)過(guò)精心手工優(yōu)化的加法器IP核在設(shè)計(jì)時(shí)直接調(diào)用。理解這些底層原理的價(jià)值在于當(dāng)工具無(wú)法滿足你的性能目標(biāo)時(shí)你知道從何處入手進(jìn)行手動(dòng)優(yōu)化或者如何為特定算法比如密碼學(xué)中的模加定制一個(gè)更高效的加法器結(jié)構(gòu)。加法器雖小卻是窺見(jiàn)數(shù)字系統(tǒng)設(shè)計(jì)精髓的一扇絕佳窗口。