算 术 逻 辑 部 件 设 计 蒋 小 龙 2001.7.5 1 声 明 作此资料为本人个人行为,此资料版权为本人所有。 你可以任意使用,但你非经本人允许不得对此资料内容作任何修改。 你因使用此资料所带来任何收益,本人均不染指;因使用此资料所引起的任何不良后果,本人不承担任 何形式的责任。 出版物引用,但请注明! 蒋 小 龙 2001.7.5 2 目 录 声明 …………………………………………………………………………………… 1 0、 约定 …………………………………………………………………………………… 3 1、 一位加法器 …………………………………………………………………………… 4 2、 4位加法器 …………………………………………………………………………… 4 3、 4位超前进位链 ……………………………………………………………………… 5 4、 16位超前进位链 ……………………………………………………………………… 6 5、 更多位超前进位链 …………………………………………………………………… 8 6、 算术运算设计 ………………………………………………………………………… 9 7、 逻辑操作设计 ………………………………………………………………………… 10 8、 标识位 ………………………………………………………………………………… 10 9、 设计示例1 —— 16位7功能算术逻辑部件 ………………………………………… 12 10、设计示例2 —— 4位16功能算术逻辑部件 ………………………………………… 15 后记 …………………………………………………………………………………… 20 个人介绍 ……………………………………………………………………………… 21 3 0、约定 运算 A 操作 、位 ; B 操作 、位 ; D 果 、位 , 操作 位 ; Ci 进位、一位,以前操作所 ,本 操作 ; Co 进位、一位,本 操作 ; C 进位、位 , 操作 的进位,不 操作 位 小; G 进位 、位 , 操作 位 , 意 ; P 进位 ?、位 , 操作 位 , 意 。 运算¢ + 对£?¥的 作加法操作 A + B; - 用?¥的 §currency1'¥的 作; A - B - 对“?£后的 作??操作,fi用0§currency1“?£后的 ; - B & 对£?¥的 fl位作 操作; A & B # 对£?¥的 fl位作 操作; A # B @ 对£?¥的 fl位作– 操作; A @ B ~ 对“?£后的 作fl位??操作; ~ B 对运算¢的约定?? · 的??有?。 设计 用 VerilogHDL ?”?…,所有的‰ ¢? VerilogHDL ?法。 有`′,请?? VerilogHDL 资料。 4 1、一位加法器 一位ˉ加器。 '? ˙¨ ,D、Co逻辑 ?式为 D = A @ B @ Ci (1-1) Co = A & B # A & Ci # B & Ci (1-2) = A & B # (A # B) & Ci (1-3) 不?作出£逻辑?,此 ??。 一位ˉ加器ˇ— 进位加法器 。 因£ , £ 、 加法器的 。因£ 、 , ? £ 部件的 本a件。£¢ '。 ˙¨ 可 , ?位??,??o 。 2、4位加法器 位加法器可以 用 个一位ˉ加器 行进位加法器。 ?? 对 ?式,因 位运算 ??位进位来?后? 进行。因此, 的 非 可 。 运算肯定 ?法胜任。 对 行进位加法器 可得 运算的 进位的 。 此,§小进位的 非 有?。 下面讨·的超前进位链 有?§少进位的 , 进位门 进位,?进位彼此独立,不依赖 进位 播。因此, 的 非 小、 度非 。 既然进位已经解决,则加法器¨ D = A @ B @ C (2-1) 不存?′题。 此可 ,进位的解决 核心。 5 3、4位超前进位链 式(1-3) Co = A & B # (A # B) & Ci (3-1) 可以看出 A、B均为1,则 进位?出; A、B存?1,则进位?出依赖 ?位进位Ci。换一 说法 A、B均为1,则 进位; A、B存?1,则 ?(?位)进位(Ci)。 A、B、Ci?本位运算, 本位¨D,向 位进位Co。更一般的 Dn = An @ Bn @ Cn (3-2) Cn+1 = An & Bn # (An # Bn) & Cn (3-3) 令 Gn = An & Bn (3-4) Pn = An # Bn (3-5) 则式(3.-3)为 Cn+1 = Gn # Pn & Cn (3-6) 样,就引入了进位 函 (G)、进位 ?函 (P)。£意 为 Gn为1, 定 进位; Pn为 1,则向 位 ?(?位)进位(Cn),可认为?位进位越过本位直接向 位进位。此 否说明仍存?进位 播, 使进位 ?法§小? 以4位超前进位链为 C0 = Ci C1 = G0 # P0 & C0 = G0 # P0 & Ci (3-7) C2 = G1 # P1 & C1 = G1 # P1 & G0 # P1 & P0 & Ci (3-8) C3 = G2 # P2 & C2 = G2 # P2 & G1 # P2 & P1 & G0 # P2 & P1 & P0 & Ci (3-9) C4 = G3 # P3 & C3 = G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0 # P3 & P2 & P1 & P0 & Ci (3-10) Co = C4 £逻辑? 下 6 可 , 迭代关系currency1掉,则?位彼此独立,进位 播不复存?。因此,总的 ? 门的 。£ 也就自不待”。 对式(2-1) D = A @ B @ C (3-11) = ((~ A) & B # A & (~ B)) @ C = ((~ A) & B # A & (~ B) # (~ A) & A # (~ B) & B # A & (~ A) & B & (~ B) B)) @ C = ((~ A) & (A # B) # (~ B) & (A # B) # A & B & (~ A) & (~ B)) @ C = (((~ A) # (~ B)) & (A # B) # A & B & (~ (A # B))) @ C = ((~ (A & B)) & (A # B) # A & B & (~ (A # B))) @ C = (A & B) @ (A # B) @ C (3-12) = G @ P @ C (3-13) 可 D = A @ B @ C = G @ P @ C = (A & B) @ (A # B) @ C (3-14) 此特 对算术逻辑部件的设计非 有用! 4、、161 位超前进位链 对4位超前进位加法器 二?入 A、B,进位?入Ci, D,进位Co。因此,可以用4个4 位超前进位进位链 a 接形 16位进位链。 存?′题,就 a内虽 超前进位,但 a间却 行, 存?进位 播′题, 不 短, 度也就 不了! 从4位超前进位链得?启 , 否? a间?行超前进位? 察第4、8、12、16位的进位, 得? C4 = G3 # P3 & C3 = (G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0) # (P3 & P2 & P1 & P0) & Ci (4-1) C8 = G7 # P7 & C7 = (G7 # P7 & G6 # P7 & P6 & G5 # P7 & P6 & P5 & G4) # (P7 & P6 & P5 & P4) & (G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0) # (P7 & P6 & P5 & P4) & (P3 & P2 & P1 & P0) & Ci (4-2) C12 = G11 # P11 & C11 = (G11 # P11 & G10 # P11 & P10 & G9 # P11 & P10 & P9 & G8) # (P11 & P10 & P9 & P8) & (G7 # P7 & G6 # P7 & P6 & G5 # P7 & P6 & P5 & G4) # (P11 & P10 & P9 & P8) & (P7 & P6 & P5 & P4) & (G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0) # (P11 & P10 & P9 & P8) & (P7 & P6 & P5 & P4) & (P3 & P2 & P1 & P0) & Ci (4-3) C16 = G15 # P15 & C15 = (G15 # P15 & G14 # P15 & P14 & G13 # P15 & P14 & P13 & G12) # (P15 & P14 & P13 & P12) & (G11 # P11 & G10 # P11 & P10 & G9 # P11 & P10 & P9 & G8) # 7 (P15 & P14 & P13 & P12) & (P11 & P10 & P9 & P8) & (G7 # P7 & G6 # P7 & P6 & G5 # P7 & P6 & P5 & G4) # (P15 & P14 & P13 & P12) & (P11 & P10 & P9 & P8) & (P7 & P6 & P5 & P4) & (G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0) # (P15 & P14 & P13 & P12) & (P11 & P10 & P9 & P8) & (P7 & P6 & P5 & P4) & (P3 & P2 & P1 & P0) & Ci (4-4) 令 GX4 = G15 # P15 & G14 # P15 & P14 & G13 # P15 & P14 & P13 & G12 (4-5) GX3 = G11 # P11 & G10 # P11 & P10 & G9 # P11 & P10 & P9 & G8 (4-6) GX2 = G7 # P7 & G6 # P7 & P6 & G5 # P7 & P6 & P5 & G4 (4-7) GX1 = G3 # P3 & G2 # P3 & P2 & G1 # P3 & P2 & P1 & G0 (4-8) PX4 = P15 & P14 & P13 & P12 (4-9) PX3 = P11 & P10 & P9 & P8 (4-10) PX2 = P7 & P6 & P5 & P4 (4-11) PX1 = P3 & P2 & P1 & P0 (4-12) 可得 C4 = GX0 # PX0 & Ci (4-13) C8 = GX1 # PX1 & GX0 # PX1 & PX0 & Ci (4-14) C12 = GX2 # PX2 & GX1 # PX2 & PX1 & GX0 # PX2 & PX1 & PX0 & Ci (4-15) C16 = GX3 # PX3 & GX2 # PX3 & PX2 & GX1 # PX3 & PX2 & PX1 & GX0 # PX3 & PX2 & PX1 & PX0 & Ci (4-16) 较式((4-13)~(4-16)) 式((3-7)~(3-10)),可看出 a间进位也可用超前进位链完 。 16位超前进位链 下 8 4位超前进位链 下 ?际应用 ,最 位进位一般不直接使用,对£要求可降?。本? ,此位需 门 。 综? 察式(4-5)~(4-16)及??幅?,可发… G、P GX、PX有? 门 , GX、PX a 间进位有? 门 ,再需? ? 门 最终的进位。因此,总共需六 门 。 至此,′题已得?解决。 5、更多位超前进位链 对更多位超前进位链可?照?节,形 多 超前进位链树。 以64位超前进位链为 。 可用4位的超前进位链 a? 。第一 用16个 a,?出直接的进位;第二 用4个 a,用以形 第一 a间进位;第三 用1个 a,为第二 提供 a间进位。 样,形 进位需10 门 一、 二 间需2,二、三 间需2,三、二 间需2,二、一 间需2,第一 ?出需2。 也可用8位超前进位链 a? 。第一 用8个 a,?出直接的进位;第二 用1个 a,为第一 提供 a间进位。 样,形 进位需6 门 。 ?际?,每增加一 ,就需要增加形 GX、PX的?间2,再形 进位需?2,总共增加4。 否说明后一 ?案就一定 ! 不一定。需 电路 线 、逻辑门的扇入扇出 力、逻辑门 的 ?多?面的因 。 再 32位、128位超前进位链,应 何?…。 ??际应用 , 多 ?案, 多?面因 ,得?最 果。 至此,作为 加法器的核心 超前进位链 的讨·已完 。 9 6、算术运算设计 §法的 ?式 下 D = A - B - Ci (6-1) fl代 运算法则以及? 的定 可得 D = A - B - Ci (6-2) = A + (- B) - Ci (6-3) = A + (~ B + 1) - Ci (6-4) = A + (~ B) + 1 - Ci (6-5) = A + (~ B) + (1 – Ci) (6-6) = A + (~ B) + (~ Ci) (6-7) 此得出的 · 从 § A§currency1§ B以及 位Ci,可以 A加? B的fl位??的¨以及 位Ci??的¨! 加法的 ?式 D = A + B + Ci (6-8) 照式(6-7)、(6-8),作出 下 · 作加法? A、B、Ci 加,作§法? B、Ci?? A 加! 引入一 as。 £为0?作加法操作; £为1?作§法操作。 下式 D = A + (as ? B : (~ B)) + (as @ Ci) (6-9) D = A + (asv @ B) + (as @ Ci) (6-10) ?式(6-9) ,有一运算操作¢ ? : ;£ ?式为 件 ? 件为˙ : 件为 用 ,因£为一位 ,不 位 B直接操作。 ?式(6-10) ,有一 asv, B位 , as 。 超前进位链的?入¨为G、P。作加法运算?,G、P为 G = A & B (6-11) P = A # B (6-12) 作§法运算?,G、P为 G = A & (~ B) (6-13) P = A # (~ B) (6-14) 对 可 加§法运算 G = A & (asv @ B) (6-15) P = A # (asv @ B) (6-16) 至此,算术运算已得?解决! 10 7、逻辑操作设计 逻辑操作 fl位操作,不需要 位间进位。 逻辑操作也就 、 、– 三 操作。 也 容 ? 二操作 A、B直接进行逻辑操作得? 果D。 有一 ?法 用G、P间接进行逻辑操作。 ?照式(3-14) D = A @ B @ C = G @ P @ C = (A & B) @ (A # B) @ C (7-1) 逻辑操作 ?式 D = A @ B = G @ P = (A & B) @ (A # B) (7-2) 对 操作 D = A & B = G (7-3) 对 操作 D = A # B = P (7-4) 对 – 操作 D = A @ B = G @ P (7-5) 引入一二位 lc。 £为00?,作 操作; £为01?,作 操作; £为1X?,作– 操作。 G = (~ (lc = 01)) ? (A & B) : 0 (7-6) P = (~ (lc = 00)) ? (A # B) : 0 (7-7) D = G @ P (7-8) 对 ? ?法, …??从 。 向 用后一 。 然 样一来,多了一 节, 不 有。 8、标识位 任何一?算术逻辑操作¢ ? ?样的标识位。最£要的有 ?标识、进位标识、¢ 标识、¥出 标识。 果为???标识, §说 待currency1 为?则??标识。currency1 也不一定?此,可以? '路?currency1 。 ¢ 标识的设?有? 一 ““ 果的¢ 位,fi 果的最 位;二 使用??¢ 位,fi 二操 作 作¢ ??一位,此? 果的最 位fi用 设?¢ 标识。 ?此讨·进位标识的设?,?fi说明一下fl个 – 进位、 位、进位标识、?进位。进位、 位 ?' 意 ?的‰ ;进位标识““进位、 位。?进位 指进位链?最 位。 加法操作?,可 进位,因为 果可 超出了 · , ??进位? …出来。加法?, 标识位的设?,?需要““?进位fi行。 11 ? ,0 §currency1任何不为 0 的 ,¢ 位;0 §currency1 0,不 位。??的 ,进位链??不 此 …。 0§currency1一不为0的 B,G为0。B不为0,则£位 定有1, B??,此?位 定有0,P位 也 定有0。因此,?进位 定为0。 0§currency10,fi为0加?B??的¨及1,?际?,1 作为进位引入的。此?G为0。B??,此?位 ˉ为1,P位 也ˉ为1,?进位““最??入的进位,£?为1。因此,?进位 定为1。 可以看?,?进位?的 … ?际的 位?” ?。 …?的讨· § 为0,非 特?。 下式 D = A - B (8-1) = (0 + A) + (0 - B) (8-2) (0 + A)?进位 为0。所以 作§法?,进位标识的设? ?进位??。 ¥出标识位的设? 作加法?, 二操作 ¢ ,… 果¢ ?,则?;作§法?, § 、 果¢ ,… § ¢ ?,则?。 加法? G = A & B (8-3) P = A # B (8-4) D = G @ P @ C (8-5) 以Amsb A的最 位,以Amsb+1 A的??最 位。 OV = Amsb & Bmsb & (~ Dmsb) # (~ Amsb) & (~ Bmsb) & Dmsb (8-6) = Gmsb & (~ (Gmsb @ Pmsb @ Cmsb)) # (~ Pmsb) & (Gmsb @ Pmsb @ Cmsb) (8-7) = Gmsb & (~ Cmsb) # (~ Pmsb) & Cmsb (8-8) ? 式(3-6) Cmsb+1 @ Cmsb = (Gmsb # Pmsb & Cmsb) @ Cmsb (8-9) = Gmsb & (~ Cmsb) # (~ Gmsb) & (~ Pmsb) & Cmsb = Gmsb & (~ Cmsb) # (~ (Gmsb # Pmsb)) & Cmsb (8-10) = Gmsb & (~ Cmsb) # (~ ((Amsb & Bmsb) # (Amsb # Bmsb))) & Cmsb = Gmsb & (~ Cmsb) # (~ (Amsb # Bmsb)) & Cmsb = Gmsb & (~ Cmsb) # (~ Pmsb) & Cmsb (8-11) 可以看? 式(8-8)、(8-11) ?。可 加法? OV = Cmsb+1 @ Cmsb (8-12) §法? G = A & (~ B) (8-13) P = A # (~ B) (8-14) D = G @ P @ C (8-15) OV = Amsb & (~ Bmsb) & (~ Dmsb) # (~ Amsb) & Bmsb & Dmsb (8-16) = Gmsb & (~ (Gmsb @ Pmsb @ Cmsb)) # (~ Pmsb) & (Gmsb @ Pmsb @ Cmsb) (8-17) = Gmsb & (~ Cmsb) # (~ Pmsb) & Cmsb (8-18) 12 ? 式(3-6) Cmsb+1 @ Cmsb = (Gmsb # Pmsb & Cmsb) @ Cmsb (8-19) = Gmsb & (~ Cmsb) # (~ Gmsb) & (~ Pmsb) & Cmsb = Gmsb & (~ Cmsb) # (~ (Gmsb # Pmsb)) & Cmsb (8-20) = Gmsb & (~ Cmsb) # (~ ((Amsb & (~ Bmsb)) # (Amsb # (~ Bmsb)))) & Cmsb = Gmsb & (~ Cmsb) # (~ (Amsb # (~ Bmsb))) & Cmsb = Gmsb & (~ Cmsb) # (~ Pmsb) & Cmsb (8-21) 可以看? 式(8-18)、(8-21) ?。可 §法? OV = Cmsb+1 @ Cmsb (8-22) 所以 OV = Cmsb+1 @ Cmsb (8-23) 至此,算术逻辑部件设计, ·?的‰ 已ˉ部解决! 9、设计 1 16位7 算术逻辑部件 ??面的讨· , ?注意?一个‰ G、P。 £?,超前进位链 标?的,算术逻辑部件设计最£要的 作 设计G、P函 ! `用?节′幅 算术逻辑部件的设计。 本节 设计一16位7 算术逻辑部件。 ?入 二 A、B,进位;Ci; ?出 果 D,标识位 进位CF、?标识ZF、??¢ SF、¥出OF。 Fc 000 A + B; 001 A – B; 010 A + B + Ci; 011 A - B - Ci; 100 A & B; 101 A # B; 110 A @ B; 111 A @ B; 要求?? 。 ?? ,用超前进位链; 度为16位,用4位超前进位链ˉ?。 13 module ALU_Demo_1 ( A,B,Ci,// D,// Fc,// cf,zf,sf,of// ); input [15:0] A,B; input Ci; output[15:0] D; input [ 2:0] Fc; output cf,zf,sf,of; reg [15:0] G,P; wire [16:0] C; // Fc G P Cp Descript // 000 A & B A | B 0 A + B // 001 A & (~ B) A | (~ B) 1 A - B // 010 A & B A | B Ci A + B + Ci // 011 A & (~ B) A | (~ B) (~ Ci) A - B - Ci // 100 A & B 0 X A & B // 101 0 A | B X A | B // 110 A & B A | B X A ^ B // 111 A & B A | B X A ^ B //----generat the G always @(Fc or A or B) casex(Fc) 3'b000: G = A & B; 3'b001: G = A & (~ B); 3'b010: G = A & B; 3'b011: G = A & (~ B); 3'b100: G = A & B; 3'b101: G = {16{1'b0}}; 3'b110: G = A & B; 3'b111: G = A & B; default: G = A & B; endcase 14 //----generat the P always @(Fc or A or B) casex(Fc) 3'b000: P = A | B; 3'b001: P = A | (~ B); 3'b010: P = A | B; 3'b011: P = A | (~ B); 3'b100: P = {16{1'b0}}; 3'b101: P = A | B; 3'b110: P = A | B; 3'b111: P = A | B; default: P = A | B; endcase //----generat the C in leading carry link wire Cp; wire [ 3:0] Gl,Pl; wire [ 4:1] Cx; wire [16:1] Ct; assign Cp = ((Ci & Fc[1]) ^ Fc[0]); Carry_Leading_4 CL0 (G[ 3: 0],P[ 3: 0],Cp ,Ct[ 4: 1],Gl[0],Pl[0]); Carry_Leading_4 CL1 (G[ 7: 4],P[ 7: 4],Cx[1],Ct[ 8: 5],Gl[1],Pl[1]); Carry_Leading_4 CL2 (G[11: 8],P[11: 8],Cx[2],Ct[12: 9],Gl[2],Pl[2]); Carry_Leading_4 CL3 (G[15:12],P[15:12],Cx[3],Ct[16:13],Gl[3],Pl[3]); Carry_Leading_4 CLX (Gl[ 3:0],Pl[ 3:0],Cp,Cx[ 4:1],,); //assign C = {Ct,Cp}; assign C = {Cx[4],Ct[15:13],Cx[3],Ct[11:9],Cx[2],Ct[7:5],Cx[1],Ct[3:1],Cp}; //----generate the result assign D = G ^ P ^ ((~ Fc[2]) ? C[15:0] : {16{1'b0}}); assign cf = (C[16] ^ Fc[0]) & (~ Fc[2]); assign zf = ! D; assign sf = G[15] ^ P[15] ^ ((~ Fc[2]) & C[16]); assign of = (C[15] ^ C[16]) & (~ Fc[2]); endmodule 15 module Carry_Leading_4 (G,P,Ci,C,Gl,Pl); input [ 3:0] G,P; output [ 4:1] C; input Ci; output Gl,Pl; wire [ 3:0] G,P; wire [ 4:1] C; wire Ci; wire Gl,Pl; assign C[1] = G[0] | P[0] & Ci; assign C[2] = G[1] | P[1] & G[0] | P[1] & P[0] & Ci; assign C[3] = G[2] | P[2] & G[1] | P[2] & P[1] & G[0] | P[2] & P[1] & P[0] & Ci; assign C[4] = Gl | Pl & Ci; assign Gl = G[3] | P[3] & G[2] | P[3] & P[2] & G[1] | P[3] & P[2] & P[1] & G[0]; assign Pl = P[3] & P[2] & P[1] & P[0]; endmodule 10、设计 2 4位位161 算术逻辑部件 本节 设计一4位16 算术逻辑部件。 ?入 二 A、B,进位;Ci; ?出 果 D,标识位 进位CF、?标识ZF、??¢ SF、¥出OF。 Fc 0000 B; 0001 B + 1; 0010 A + B + Ci; 0011 A + B; 0100 ~ B; 0101 - B; 0110 A - B + Ci - 1; 0111 A - B; 16 1000 B - 1; 1001 B – A; 1010 B – A + Ci - 1; 1011 ~ A; 1100 A & B; 1101 A # B; 1110 A @ B; 1111 abs A; 要求?? 。 出…? 有一 下操作 D = A - B + Ci – 1 = A + (- B) + Ci – 1 = A + (~ B) + 1 + Ci – 1 = A + (~ B) + Ci module ALU_Demo_2 ( A,B,Ci,// D,// Fc,// cf,zf,sf,of// ); input [ 3:0] A,B; input Ci; output[ 3:0] D; input [ 3:0] Fc; output cf,zf,sf,of; reg [ 3:0] G,P; reg [ 4:0] C; wire ol;//logic operate if it is '1' wire so;//subtract operate when it is '1' // D = A - B + Ci - 1 // = A + (- B) + Ci - 1 // = A + (~ B) + 1 + Ci - 1 // = A + (~ B) + Ci 17 //Function table & it descript in other word // Fc Descript ow T // 0000 B 0 + B + 0 0 + B + 0 // 0001 B + 1 0 + B + 1 0 + B + 1 // 0010 A + B + Ci A + B + Ci A + B + Ci // 0011 A + B A + B A + B // 0100 ~ B 0 - B - 1 0 + (~ B) // 0101 - B 0 - B 0 + (~ B) + 1 // 0110 A - B + Ci - 1 A - B + Ci - 1 A + (~ B) + Ci // 0111 A - B A - B A + (~ B) + 1 // 1000 B - 1 B - 0 - 1 (~ 0) + B // 1001 B - A B - A (~ A) + B + 1 // 1010 B - A + Ci - 1 B - A + Ci - 1 (~ A) + B + Ci // 1011 ~ A 0 - A - 1 (~ A) + 0 // 1100 A & B A & B A & B // 1101 A | B A | B A | B // 1110 A ^ B A ^ B A ^ B // 1111 abs A (0 - A) / (0 + A) (A[3] ? (~ A) : A) + 0 + (A[3]) //----generat the G // G = oa & ob always @(Fc or A or B) casex(Fc) 4'b0000: G = 4'b0000; //oa = 0; ob = B; cp = 0; 4'b0001: G = 4'b0000; //oa = 0; ob = B; cp = 1; 4'b0010: G = A & B; //oa = A; ob = B; cp = Ci; 4'b0011: G = A & B; //oa = A; ob = B; cp = 0; 4'b0100: G = 4'b0000; //oa = 0; ob = (~ B); cp = 0; 4'b0101: G = 4'b0000; //oa = 0; ob = (~ B); cp = 1; 4'b0110: G = A & (~ B); //oa = A; ob = (~ B); cp = Ci 4'b0111: G = A & (~ B); //oa = A; ob = (~ B); cp = 1; 4'b1000: G = B; //oa = (~ 0); ob = B; cp = 0; 4'b1001: G = (~ A) & B; //oa = (~ A); ob = B; cp = 1; 4'b1010: G = (~ A) & B; //oa = (~ A); ob = B; cp = Ci; 4'b1011: G = 0; //oa = (~ A); ob = 0; cp = 0; 4'b1100: G = A & B; //oa = A; ob = B; cp = x; 4'b1101: G = 4'b0000; //oa = A; ob = B; cp = x; 4'b1110: G = A & B; //oa = A; ob = B; cp = x; 4'b1111: G = 4'b0000; //oa = (A[3] ? (~ A) : A); ob = 0; cp = A[3]; default: G = 4'bxxxx; //oa = X; ob = X; cp = x; endcase 18 //----generat the P // P = oa | ob always @(Fc or A or B) casex(Fc) 4'b0000: P = B; //oa = 0; ob = B; cp = 0; 4'b0001: P = B; //oa = 0; ob = B; cp = 1; 4'b0010: P = A | B; //oa = A; ob = B; cp = Ci; 4'b0011: P = A | B; //oa = A; ob = B; cp = 0; 4'b0100: P = (~ B); //oa = 0; ob = (~ B); cp = 0; 4'b0101: P = (~ B); //oa = 0; ob = (~ B); cp = 1; 4'b0110: P = A | (~ B); //oa = A; ob = (~ B); cp = Ci; 4'b0111: P = A | (~ B); //oa = A; ob = (~ B); cp = 1; 4'b1000: P = 4'b1111; //oa = (~ 0); ob = B; cp = 0; 4'b1001: P = (~ A) | B; //oa = (~ A); ob = B; cp = 1; 4'b1010: P = (~ A) | B; //oa = (~ A); ob = B; cp = Ci; 4'b1011: P = (~ A); //oa = (~ A); ob = 0; cp = 0; 4'b1100: P = 4'b0000; //oa = A; ob = B; cp = x; 4'b1101: P = A | B; //oa = A; ob = B; cp = x; 4'b1110: P = A | B; //oa = A; ob = B; cp = x; 4'b1111: P = (A[3] ? (~ A) : A); //oa = (A[3] ? (~ A) : A); ob = 0; cp = A[3]; default: P = 4'bxxxx; //oa = X; ob = X; cp = x; endcase //----generat the Ci // P = oa | ob always @(Fc or A or B) casex(Fc) 4'b0000: C[0] = 1'b0; //oa = 0; ob = B; cp = 0; 4'b0001: C[0] = 1'b1; //oa = 0; ob = B; cp = 1; 4'b0010: C[0] = Ci; //oa = A; ob = B; cp = Ci; 4'b0011: C[0] = 1'b0; //oa = A; ob = B; cp = 0; 4'b0100: C[0] = 1'b0; //oa = 0; ob = (~ B); cp = 0; 4'b0101: C[0] = 1'b1; //oa = 0; ob = (~ B); cp = 1; 4'b0110: C[0] = Ci; //oa = A; ob = (~ B); cp = Ci; 4'b0111: C[0] = 1'b1; //oa = A; ob = (~ B); cp = 1; 4'b1000: C[0] = 1'b0; //oa = (~ 0); ob = B; cp = 0; 4'b1001: C[0] = 1'b1; //oa = (~ A); ob = B; cp = 1; 4'b1010: C[0] = Ci; //oa = (~ A); ob = B; cp = Ci; 4'b1011: C[0] = 1'b0; //oa = (~ A); ob = 0; cp = 0; 4'b1100: C[0] = 1'bx; //oa = A; ob = B; cp = x; 4'b1101: C[0] = 1'bx; //oa = A; ob = B; cp = x; 4'b1110: C[0] = 1'bx; //oa = A; ob = B; cp = x; 4'b1111: C[0] = A[3]; //oa = (A[3] ? (~ A) : A); ob = 0; cp = A[3]; default: C[0] = 1'bx; //oa = X; ob = X; cp = x; endcase 19 assign ol = (Fc == 4'b1100) | (Fc == 4'b1101) | (Fc == 4'b1110); assign so = (Fc == 4'b0101) | (Fc == 4'b0110) | (Fc == 4'b0111) | (Fc == 4'b1000) | (Fc == 4'b1001) | (Fc == 4'b1010) | ((Fc == 4'b1111) & A[3]); //----generat the C in leading carry link Carry_Leading_4 CL4 (G,P,C[0],C[ 4:1],,); //----generate the result assign D = G ^ P ^ ((~ ol) ? C[ 3:0] : 4'b0000); assign cf = (C[4] ^ so) & (~ ol); assign zf = ! D; assign sf = G[3] ^ P[3] ^ C[4]; assign of = (C[4] ^ C[3]) & (~ ol); endmodule module Carry_Leading_4 (G,P,Ci,C,Gl,Pl); input [ 3:0] G,P; output [ 4:1] C; input Ci; output Gl,Pl; wire [ 3:0] G,P; wire [ 4:1] C; wire Ci; wire Gl,Pl; assign C[1] = G[0] | P[0] & Ci; assign C[2] = G[1] | P[1] & G[0] | P[1] & P[0] & Ci; assign C[3] = G[2] | P[2] & G[1] | P[2] & P[1] & G[0] | P[2] & P[1] & P[0] & Ci; assign C[4] = Gl | Pl & Ci; assign Gl = G[3] | P[3] & G[2] | P[3] & P[2] & G[1] | P[3] & P[2] & P[1] & G[0]; assign Pl = P[3] & P[2] & P[1] & P[0]; endmodule 20 后 本人从˙¨ 电路设计以来,所 过有关算术逻辑部件的设计,?一 ? 系? 。??有关从 ?人ˇ的— , 至 超前进位不 的也 有人?。 作作过 超前进位链 一 , 目 § 算术逻辑部件设计有所 。但后来发… ?果为?。一 下,作此资料。 应 说,以 存器 ? 算术逻辑部件设计应 此行?从?人ˇ 本 力要求。 果 设计 力 为三个? 术 、a 、 。系? ?需 就行。 ? 器设计 ,??? FPGA ?? 一??,算术逻辑部件设计需要a ,o 需 术 所 ?的算术逻辑部件设计 系? 。 作此 , ?位 作带来 。 此资料 超前进位链 部 直接? 以前 为 所作 超前进位链 ?有 改 ,因此 ?及版权′题。但超前进位链 术不?及版权′题,?位不用担心,本资料所提供 术可 心使用、 ?。 本人 不 、 ′不 、??不?、更?一 作,?? , ?位不 指?。 蒋 小 龙 2001.7.5 21 个 人 介 绍 蒋小龙乃身份证名,亦用名:蒋维隆 集成电路逻辑设计。设计过16位、32位微处理器,现考虑超标量微处理器实现 联系:jiangweilong@cmmail.com jiangweilong@china.com