Bộ chia dấu chấm tĩnh 119

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

Trước khi đi vào thiết kế, chúng ta cần phải nhắc lại thuật toán chia: Thuật toán chia:

Mục đích của thuật toán là chúng ta cần tính y = a/b trong đó a, b là những số cùng có (n+1) bit.

Thuật toán được thể hiện trong bảng 9.9, trong đó a = “1011” ( = (11)10) và b = “0011” (=(3)10). Kết quả sẽ thu được: thương y = “0011” (=(3)10) và số dư r = “0010” (=(2)10).

Hình 9.9. Thuật toán chia Giải thích thuật toán:

+ Đầu tiên chuyển số chia thành số 2n+1 bit bằng cách thêm vào sau n -1 bit 0 , số bị chia vẫn giữ nguyên.

+ So sánh số bị chia với số chia . Nếu số bị chia lớn hơn hoặc bằng số chia thì gán y =1 và thay số bị chia bằng hiệu của số bị chia với số chia. Ngược lại thì y =0

+ Quá trình thực hiện liên tục cho đến khi hết n lần. + Thương là dãy bit của y, số dư là sô bị chia cuối cùng.

Để thiết kế bộ chia này thì chúng ta có 2 phương pháp: Cả 2 phương pháp đều thực hiện theo mã tuần tự: Phương pháp thứ nhất chỉ thực hiện bằng câu lện if, phương pháp thứ 2 thực hiện bằng cả câu lện if và loop.

Mã thiết kế bộ chia sẽ như sau: Thiết kế theo phương pháp 1:

--- Phuong phap 1: step-by-step --- LIBRARY ieee;

USE ieee.std_logic_1164.all;

--- ENTITY Bo_chia IS

PORT ( a, b: IN INTEGER RANGE 0 TO 15;

y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC);

END Bo_chia;

Chỉ số Đầu vào a So sánh Đầu vào b y Thao tác cho cột a 1011 1011 1011 0101 3 2 1 0 0010 < < > > 0011000 0001100 0000110 0000011 0 0 1 1 Không làm gì Không làm gì Trừ cột a cho cột b Trừ cột a cho cột b

--- ARCHITECTURE arc OF Bo_chia IS

BEGIN

PROCESS (a, b)

VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN

--- Khoi tao vaµ bat loi: --- temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; --- y(3): --- IF (temp1 >= temp2 * 8) THEN

y(3) <= '1';

temp1 := temp1 - temp2*8; ELSE y(3) <= '0';

END IF;

--- y(2): --- IF (temp1 >= temp2 * 4) THEN

y(2) <= '1';

temp1 := temp1 - temp2 * 4; ELSE y(2) <= '0';

END IF;

--- y(1): --- IF (temp1 >= temp2 * 2) THEN

y(1) <= '1';

temp1 := temp1 - temp2 * 2; ELSE y(1) <= '0';

END IF;

--- y(0): --- IF (temp1 >= temp2) THEN

y(0) <= '1';

temp1 := temp1 - temp2; ELSE y(0) <= '0'; END IF; --- Phan du: --- rest <= temp1; END PROCESS; END arc; --- Kết quả mô phỏng:

Thiết kế theo phương pháp 2: --- Phuong phap 2:--- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY Bo_chia2 IS GENERIC(n: INTEGER := 3);

PORT ( a, b: IN INTEGER RANGE 0 TO 15;

y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC);

END Bo_chia2;

--- ARCHITECTURE arc OF Bo_chia2 IS

BEGIN

PROCESS (a, b)

VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN

--- Khoi tao gia tri va bat loi: --- temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; --- thuong: --- FOR i IN n DOWNTO 0 LOOP

IF(temp1 >= temp2 * 2**i) THEN y(i) <= '1';

temp1 := temp1 - temp2 * 2**I; ELSE y(i) <= '0'; END IF; END LOOP; --- phan du: --- rest <= temp1; END PROCESS; END arc; --- 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 120 - 123)