Carry ripple và carry look ahead là 2 phương phỏp cổ điển để thiết kế cỏcc bộ cộng. Phương phỏp đầu tiờn cú thuận lợi là yờu cầu phần cứng ớt, trong khi cỏi thứ hai lại nhanh hơn.
+ Bộ cộng carry ripple:
Hỡnh 9.6. Sơ đồ bộ cộng ripple carry
Trờn sơ đồ ta cú thể thấy, với mỗi bit, một đơn vị bộ cộng đầy đủ sẽ được thực hiện. Bảng thật của bộ cộng đầy đủ được chỉ ra bờn cạnh sơ đồ, trong đú a, b là cỏc bớt đầu vào, cin là bit nhớ vào, s là bit tổng, cout là bit nhớ ra. Từ bảng thật ta dễ dàng tớnh được:
s = a xor b xor cin
cout = (a and b) xor (a and cin) xor (b xor cin)
Từ cụng thức trờn ta xõy dựng chương trỡnh VHDL như sau (Ở đõy chỳng ta cú thể ỏp dụng cho bất kỳ số lượng đầu vào nào):
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--- ENTITY Bo_cong_carry_ripple IS
GENERIC (n: INTEGER := 4);
PORT ( a, b: IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); cin: IN STD_LOGIC;
s: OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0); cout: OUT STD_LOGIC);
END Bo_cong_carry_ripple;
--- ARCHITECTURE arc OF Bo_cong_carry_ripple IS SIGNAL c: STD_LOGIC_VECTOR (n DOWNTO 0); BEGIN
c(0) <= cin;
G1: FOR i IN 0 TO n-1 GENERATE
s(i) <= a(i) XOR b(i) XOR c(i); c(i+1) <= (a(i) AND b(i)) OR
(a(i) AND c(i)) OR (b(i) AND c(i)); END GENERATE;
cout <= c(n); END arc;
---
Kết quả mụ phỏng:
+ Bộ cộng carry look ahead:
Sơ đồ bộ cộng carry look ahead 4 bit được chỉ ra trong hỡnh 9.8.1 dưới đõy:
Hỡnh 9.8.1. Sơ đồ bộ cộng carry look ahead
Mạch được hoạt động dựa trờn cỏc khỏi niờm generate và propagate. Chớnh đặc điểm này đó làm cho bộ cộng này thực hiện với tốc độ nhanh hơn so với bộ cộng trước.
Giả sử 2 đầu vào là 2 bit a,b thỡ 2 tớn hiệu p(propagate) và g(generate) được tớnh như sau:
g = a and b p = a or b
Nếu chỳng ta xem a, b là cỏc vector:
a = a(n-1)…a(1)a(0) ; b = b(n-1)…b(1)b(0) thỡ g, p được tớnh như sau:
p = p(n-1)…p(1)p(0); g = g(n-1)…g(1)g(0) Trong đú:
g(i) = a(i) and b(i) p(i) = a(i) or b(i)
Lỳc này vector nhớ sẽ là: c = c(n-1)…c(1)c(0), trong đú: c(0) = cin
c(1) = c(0)p(0) + g(0)
c(2) = c(0)p(0)p(1) + g(0)p(1) + g(1) c(i) = c(i-1)p(i-1) + g(i-1)
Từ cụng thức tỡnh trờn, chỳng ta viết chương trỡnh thiết kế bộ cộng carry look ahead 4 bit như sau:
--- LIBRARY ieee;
USE ieee.std_logic_1164.all;
--- ENTITY Bo_cong_carry_look_ahead IS
cin: IN STD_LOGIC;
s: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); cout: OUT STD_LOGIC);
END Bo_cong_carry_look_ahead;
---
ARCHITECTURE Bo_cong_carry_look_ahead OF
Bo_cong_carry_look_ahead IS
SIGNAL c: STD_LOGIC_VECTOR (4 DOWNTO 0); SIGNAL p: STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL g: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN
---- PGU: --- G1: FOR i IN 0 TO 3 GENERATE
p(i) <= a(i) XOR b(i); g(i) <= a(i) AND b(i); s(i) <= p(i) XOR c(i); END GENERATE;
---- CLAU: --- c(0) <= cin;
c(1) <= (cin AND p(0)) OR g(0);
c(2) <= (cin AND p(0) AND p(1)) OR (g(0) AND p(1)) OR
g(1);
c(3) <= (cin AND p(0) AND p(1) AND p(2)) OR (g(0) AND p(1) AND p(2)) OR (g(1) AND p(2)) OR g(2);
c(4) <= (cin AND p(0) AND p(1) AND p(2) AND p(3)) OR (g(0) AND p(1) AND p(2) AND p(3)) OR
(g(1) AND p(2) AND p(3)) OR (g(2) AND p(3)) OR g(3); cout <= c(4); END Bo_cong_carry_look_ahead; --- Kết quả mụ phỏng: