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ìnhd 9.6 chỉ ra 1 bộ cộng ripple cary 4 bit không dấu:
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:
Hình 9.7. Kết quả mô phỏng cho bộ cộng ripple carry
+ 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
PORT ( a, b: IN STD_LOGIC_VECTOR (3 DOWNTO 0); 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);
(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:
Hình 9.8.2. Kết quả mô phỏng cho bộ cộng carry look ahead