算 术 逻 辑 部 件
设 计
蒋 小 龙
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