Bộ cộng Carry Ripple và bộ cộng Carry Look Ahead 115

Một phần của tài liệu Thiết kế vi mạch bảng VHDL (Trang 116 - 120)

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:

Một phần của tài liệu Thiết kế vi mạch bảng VHDL (Trang 116 - 120)