Chương 9: Thiết kế thờm cỏc mạch

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

Phần này chỳng ta sẽ trỡnh bày cỏc mạch sau: + Barrel shifter

+ Bộ so sỏnh khụng dấu và cú dấu.

+ Bộ cộng

+ Bộ chia dấu chấm tĩnh. + Bộ điều khiển mỏy bỏn hàng. + Bộ nhận dữ liệu nối tiếp.

+ Bộ chuyển đổi song song sang nối tiếp.

+ SSD

+ Bộ phỏt tớn hiệu

+ Bộ nhớ

9.1. Barrel Shifter.

Sơ đồ của mạch của bộ dịch barrel được chỉ ra trong hỡnh 9.1. Đầu vào là vector 8 bit. Đầu ra là phiờn bản dịch của đầu vào, với lượng dịch được định nghĩa bởi 8 đầu vào “shift” (từ o đến 7). Mạch gồm cú 3 bộ dịch barrel riờng lẻ, mỗi một cỏi giống như trong vớ dụ 6.9. Nhưng chỳng ta phải chu ý rằng, barrel đầu tiờn cú chỉ cú 1 đầu “0” được kết nối với một bộ dồn kờnh, trong khi barrel thứ 2 cú 2 đầu vào “0” và barrel cuối cựng cú tới 4 đầu vào “0”. Để vector lớn hơn thỡ chỳng ta phải dữ 2 đầu vào là “0”. Vớ dụ nếu shift = “001” thỡ chỉ barrel đầu tiờn gõy ra dịch, cũn nếu shift = “111” thỡ tất cỏc đều gõy ra dịch.

Hỡnh 9.1. Bộ dịch barrel

Mó thiết kế sẽ như sau:

---LIBRARY ieee; LIBRARY ieee;

USE ieee.std_logic_1164.all;

---ENTITY barrel IS ENTITY barrel IS

PORT ( inp: IN STD_LOGIC_VECTOR (7 DOWNTO 0); shift: IN STD_LOGIC_VECTOR (2 DOWNTO 0); outp: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END barrel;

---ARCHITECTURE behavior OF barrel IS ARCHITECTURE behavior OF barrel IS

BEGIN

PROCESS (inp, shift)

VARIABLE temp1: STD_LOGIC_VECTOR (7 DOWNTO 0); VARIABLE temp2: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN

---- Bo dich thu nhat --- IF (shift(0)='0') THEN

temp1 := inp; ELSE

temp1(0) := '0';

FOR i IN 1 TO inp'HIGH LOOP temp1(i) := inp(i-1); END LOOP;

END IF;

IF (shift(1)='0') THEN temp2 := temp1; ELSE FOR i IN 0 TO 1 LOOP temp2(i) := '0'; END LOOP;

FOR i IN 2 TO inp'HIGH LOOP temp2(i) := temp1(i-2); END LOOP; END IF; ---- Bo dich thu 3 --- IF (shift(2)='0') THEN outp <= temp2; ELSE FOR i IN 0 TO 3 LOOP outp(i) <= '0'; END LOOP;

FOR i IN 4 TO inp'HIGH LOOP outp(i) <= temp2(i-4); END LOOP; END IF; END PROCESS; END behavior; --- Kết quả mụ phỏng:

Hỡnh 9.2.Kết quả mụ phỏng cho bộ dịch barrel

9.2. Bộ so sỏnh khụng dấu và cú dấu.

Hỡnh 9.3 hiện lờn sơ đồ của bộ so sỏnh. Kớch thước của vector được so sỏnh là generic (n+1). 3 đầu ra phải được cung cấp là: 1 đầu ra là a>b, 1 đầu ra là a = b, đầu ra cũn lại là a < b. 3 giải phỏp được giới thiệu :đầu tiờn xột a và b là cỏc số cú dấu, trong khi 2 giải phỏp cũn lại là cỏc số khụng dấu. Kết quả mụ phỏng sẽ cho chỳng ta thấy rừ hơn. (adsbygoogle = window.adsbygoogle || []).push({});

Hỡnh 9.3.Mụ hỡnh của bộ so sỏnh

Bộ so sỏnh cú dấu:

Để làm việc với số cú dấu hoặc số khụng dấu thỡ chỳng ta đều phải khai bỏo gúi std_logic_arith (cụ thể chỳng ta sẽ thấy trong đoạn mó dưới đõy).

Mó thiết kế bộ so sỏnh cú dấu: ---- Bo so sanh co dau: ---

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_arith.all; -- can thiet! --- ENTITY Bo_so_sanh_co_dau IS

GENERIC (n: INTEGER := 7);

PORT (a, b: IN SIGNED (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END Bo_so_sanh_co_dau;

---ARCHITECTURE arc OF Bo_so_sanh_co_dau IS ARCHITECTURE arc OF Bo_so_sanh_co_dau IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END arc; --- Kết quả mụ phỏng: Hỡnh 9.4. Kết quả mụ phỏng bộ so sỏnh cú dấu Bộ so sỏnh khụng dấu 1:

Phần mó VHDL sau đõy là bản sao của phần mó đó được trỡnh bày (ở bộ so sỏnh khụng dấu).

---- Bo so sanh khong dau 1: ---

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_arith.all; --rat can thiet! ---

ENTITY Bo_so_sanh_khong_dau1 IS GENERIC (n: INTEGER := 7);

PORT (a, b: IN UNSIGNED (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END Bo_so_sanh_khong_dau1;

---ARCHITECTURE arc OF Bo_so_sanh_khong_dau1 IS ARCHITECTURE arc OF Bo_so_sanh_khong_dau1 IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END arc; --- Kết quả: Hỡnh 9.5.1.Kết quả bộ so sỏnh khụng dấu 1 Bộ so sỏnh khụng dấu 2:

Bộ so sỏnh khụng dấu cú thể cũng được thực hiện với STD_LOGIC_VECTORS, trong trường hợp này khụng cần thiết phải khai bỏo std_logic_arith.

Mó thiết kế sẽ như sau:

---- Bo so sanh khong dau: ---

LIBRARY ieee;

USE ieee.std_logic_1164.all;

---ENTITY comparator IS ENTITY comparator IS

GENERIC (n: INTEGER := 7);

PORT (a, b: IN STD_LOGIC_VECTOR (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC);

END comparator;

---ARCHITECTURE unsigned OF comparator IS ARCHITECTURE unsigned OF comparator IS BEGIN

x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END unsigned;

Mụ phỏng kết quả: (adsbygoogle = window.adsbygoogle || []).push({});

Hỡnh 9.5.2. Kết quả của bộ so sỏnh khụng dấu2

9.3. Bộ cộng Carry Ripple và bộ cộng Carry Look Ahead.

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 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;

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