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: