n đ−ợc thiết lập hoặc xoá dựa trê kết quả của lda,ad, adc và sbc Các lệh adc và
4.5.4. Bộ điều khiển của CPU (control section)
Bộ điều khiển controller gồm có một chuỗi trạng thái, mà mỗi trạng thái giữ một tín hiệu điều khiển kích hoạt chính xác xung clock. Ngõ nhập của những khối luận lý từ những trạng thái của những flip- flops khác nhau và từ những ngõ nhập
76 Nguyễn Chí Kiên Chí Kiên
bên ngoài, mà trạng thái đó ảnh h−ởng bên trong bộ điều khiển. Ngõ xuất của khối luận lý (logic block) là những tín hiệu điều khiển mà những tín hiệu điều khiển này trở thành những ngõ nhập của khối kế tiếp. Trạng thái của những flip-flops đ−a ra những tín hiệu điều khiển khác nhau.
Nh− mô tả trong sơ đồ tất cả những trạng thái đồng bộ với xung clock và những ngõ xuất góp phần đ−a ra những tín hiệu điều khiển hoặc kích hoạt những flip-flop. Trong sơ đồ này trạng thái i có điều kiện kích hoạt bởi chính nó hoặc bởi trạng thái k. Trạng thái i có điều kiện kích hoạt trạng thái j và trạng thái k luôn luôn đ−ợc kích hoạt sau thời gian xung clock mà trạng thái j đã kích hoạt. Tín hiệu điều khiển csx thì luôn luôn phát ra sau khi trạng thái k đ−ợc kích hoạt hoặc khi trạng thái i đ−ợc kích hoạt và điều kiện chắc chắn là đuợc chứa đựng trên những ngõ nhập a, b và c. Tín hiệu điều khiển csy trở thành kích hoạt khi tín hiệu ở trong trạng thái j và điều kiện chắc chắn đ−ợc chứa trong ngõ nhập d và e.
Hình 4.3.6. (a) Sơ đồ cấu trúc bộ điều khiển của CPU Khai báo ENTITY của bộ điều khiển CPU
ENTITY control IS
PORT (clk: IN std_logic;
load_ac, zero_ac, load_ir, load_sr, load_page_mar, load_offset_mar, increment_pc, load_page_pc, load_offset_pc,
77 Nguyễn Chí Kiên Chí Kiên
reset_pc, cm_carry_sr,
pc_on_mar_page_bus, ir_on_mar_page_bus, pc_on_mar_offset_bus, dbus_on_mar_offset_bus, pc_offset_on_dbus, obus_on_dbus, databus_on_dbus, mar_on_adbus, dbus_on_databus,
arith_shift_left, arith_shift_right, alu_and, alu_not, alu_a, alu_add, alu_b, alu_sub: OUT std_logic; ir_lines: IN byte; status: IN nibble;
read_mem, write_mem: OUT std_logic; interrupt: IN std_logic);
END control;
Các trạng thái của bộ điều khiển Trạng thái s1
s1: PROCESS (s(1), clk)
BEGIN
IF (clk='0' AND clk'EVENT) THEN IF s(1) = '1' THEN pc_on_mar_page_bus <= '1'; pc_on_mar_offset_bus <= '1'; load_page_mar <= '1'; load_offset_mar <= '1'; IF interrupt= '1' THEN reset_pc <= '1'; s(1) <= '1'; s(2) <= '0'; ELSE reset_pc <= '0'; s(1) <= '0'; s(2) <= '1'; END IF; END IF; END IF; END PROCESS;
78 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (b) Mô tả phần cứng của khối S1
Trong trạng thái 1 bắt đầu đặt dữ liệu pc trên mar_bus và truyền d− liệu này vào trong mar. Nếu ngõ nhập interrupt tích cực thì ngõ nhập pc_reset đ−ợc phát ra và trả về điều khiển đến trạng thái 1. Nếu CPU không ngắt thì trạng thái 2 tích cực ở cạnh xuống của xung clock. Ngoài ra trên cạnh này của xung clock, mar nhận giá trị mới. Trong mã thanh ghi dữ liệu và trạng thái điều khiển chúng ta có chắc chắn rằng chúng đồng bộ tất cảvới cạnh xuống của xung clock.
Trạng thái 2
s2: ROCESS(s(2), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s(2) = '1' THEN mar_on_adbus <= '1'; read_mem <= '1'; databus_on_dbus <= '1'; alu_a <= '1'; load_ir <= '1'; increment_pc <= '1'; s(3) <= '1'; END IF;
79 Nguyễn Chí Kiên Chí Kiên
END IF; END PROCESS;
Mô tả phần cứng của khối S2
Hình 4.3.6 (c) Mô tả phần cứng của khối S2
Khi ở trạng thái 2, mar đã nhận giá trị mới ở trong danh sách cho nó trong trạng thái 1. Nội dung của bộ nhớ đ−a ra trong databus phải khởi tạo trong ir. Mục đích chủ yếu là tín hiệu điều khiển databus_on_dbus phát ra, tín hiệu alu_a đ−ợc tích cực và các ngõ nhập ir đ−ợc cho phép. Trên cạnh của xung clock trạng thái 3 trở nên tích cực và ir sẽ có giá trị mới của nó. Mặc dù trong trạng thái 2 hàm tăng của pc đ−ợc chọn vì vậy giá trị của nó tăng lên trong cạnh xuống tiếp theo của xung clock.
Trạng thái 3
s3: PROCESS(s(3), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s(3) = '1' THEN
pc_on_mar_page_bus <= '1'; pc_on_mar_offset_bus <= '1'; load_page_mar <= '1';
load_offset_mar <= '1';
IF ir_lines (7 DOWNTO 4) /= "1110" THEN s(4) <= '1';
80 Nguyễn Chí Kiên Chí Kiên ELSE s (4) END IF; END IF; END IF;
IF (ir_lines (7 DOWNTO 4) /= "1110") THEN IF ir_lines (1) = '1' THEN alu_not <= '1'; alu_b <= '0'; ELSE alu_not <= '0'; alu_b <= '1'; END IF;
IF ir_lines (3 DOWNTO 0) = "1000" THEN arith_shift_left <= '1';
ELSE
arith_shift_left <= '0'; END IF;
IF ir_lines (3 DOWNTO 0) = "1001" THEN arith_shift_right <= '1';
ELSE
arith_shift_right <= '0'; END IF;
IF (ir_lines (3) = '1' OR ir_lines(1) = '1') THEN load_sr <= '1'; load_ac <= '1'; ELSE load_sr <= '0'; load_ac <= '0'; END IF;
81 Nguyễn Chí Kiên Chí Kiên
ELSE cm_carry_sr <= '0'; END IF;
IF (ir_lines (3) = '0' AND ir_lines(0) = '1') THEN zero_ac <= '1'; ELSE zero_ac <= '0'; s(2) <= '1'; END IF; END IF; END PROCESS;
82 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (c) Mô tả phần cứng của khối S3
Khi trạng thái 3 tích cực, trạng thái 3 bắt đầu xử lý đọc byte tiếp theo từ bộ nhớ, trong cùng thời gian đó nó kiểm tra số byte trong chỉ thị lệnh hiện hành. Nếu nó là lệnh hai byte thì byte kế tiếp trở thành byte địa chỉ của nó và trạng thái 4 đ−ợc kích hoạt để tiếp tục thực hiện 2 byte lệnh. Trên quyền khác, nếu lệnh hiện hành là lệnh không địa chỉ và không đòi hỏi byte 2, thực hiện trạng thái 3 và kích hoạt trạng thái 2 để thực hiện lệnh tiếp theo.
Những lệnh không địa chỉ (một byte) thực hiện tính toán trên thanh ghi và những cờ. - Tín hiệu alu_b đ−ợc kích hoạt vì thế ngõ ra alu chứa nội dung của acc.
- Hàm arith_shift_right của alu đ−ợc chọn nó dịch chuyển nội dung của acc sang bên phải.
- Ngõ nhập của thanh ghi trạng thái thì đ−ợc cho phép vì thế những giá trị mới của những cờ đ−ợc phát ra bởi thanh ghi dịch và nạp vào trong thanh ghi trạng thái. - Ngõ nhập của acc đ−ợc cho phép vì thế đ−ợc nạp vào thanh ghi này với ngõ ra của thanh ghi dịch.
Trạng thái 4
s4: PROCESS(s (4), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s(4) = '1' THEN
mar_on_adbus <= '1'; databus_on_dbus <='1';
dbus_on_mar_offset_bus <= '1'; load_offset_mar <= '1';
IF (ir_lines (7 DOWNTO 6) /= "11") THEN ir_on_mar_page_bus <= '1';
load_page_mar'1'; IF (ir_lines (4) = '1') THEN s(5)<=’1’; s(6)<=’0’
83 Nguyễn Chí Kiên Chí Kiên ELSE s(5)<=’0’; s(6)<=’1’ END IF; IF (ir_line s(5) = '0') THEN s(7)<=’1’; s(9)<=’0’ ELSE s(7)<=’0’; s(9)<=’1’ END IF; increment_pc <= '1'; END IF; --s (4) END IF; --clk END PROCESS;
Mô tả phần cứng của khối S4
Hình 4.3.6 (d) Mô tả phần cứng của khối S4
84 Nguyễn Chí Kiên Chí Kiên
thi. Để chuẩn bị đọc byte thứ hai của lệnh trong trạng thái 3, load_offset_mar đ−ợc kích hoạt, byte này sẽ phát xung clock trong mar trên cạnh xuống tiếp theo của xung clock. Nếu lệnh đ−ợc thực thi là lệnh địa chỉ đầy đủ thì số trang ir chuyển sang trạng thái sẳn sàng ở ngõ nhập của trang mar trong thanh ghi với xung kế tiếp. Nếu lệnh đ−ợc thực thi là jsr hoặc bra thì thanh ghi ar_page giữ lại giá trị hiện hành. Bởi vì đây là những lệnh địa chỉ duy nhất trong trang hiện hành.
Trạng thái 4 kích hoạt trạng thái 5 hoặc trạng thái 6 cho những cách trình bày địa chỉ trực tiếp hoặc gián tiếp của những lệnh địa chỉ đầy đủ và nó kích hoạt trạng thái 7 hoặc trạng thái 9 bởi những lệnh jsr hoặc bra.
Trạng thái 5
s5: PROCESS(s(5), clk) BEGIN
IF (clk='0' AND clk'EVENT) THEN IF s(5) = '1' THEN mar_on_adbus <= '1'; read_mem <= '1'; databus_on_dbus'1'; dbus_on_mar_offset_bus <= '1'; load_offset_mar <= '1'; s(6) <= '1'; END IF; END IF; END PROCESS; Mô tả phần cứng của khối S5
85 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (e) Mô tả phần cứng của khối S5
Cạnh xuống của xung clock kích hoạt trạng thái 5 ngoài ra nó cũng nạp địa chỉ đầy đủ vào mar. Trong trạng thái này vị trí con trỏ của bộ nhớ chuyển đến mar đọc dữ liệu trên databus và tạo giá trị trên ngõ nhập của thanh ghi mar_offset. Sự kích hoạt load_offset_mar là nguyên nhân để mar nạp những byte từ bộ nhớ trên cạnh đối của xung clock. Trạng thái 5 kích hoạt trạng thái 6 mà trạng thái này thì giống nh− đ−ợc kích hoạt bởi trạng thái 4 nếu địa chỉ trực tiếp đ−ợc sử dụng.
Trạng thái 6
Trạng thái 6 đ−ợc kích hoạt khi những lệnh thực thi là jmp, sta, lda, and, add hoặc sub. Trong trạng thái này mar chứa những toán hạng địa chỉ đầy đủ.
s6: PROCESS (s(6), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s(6) = '1' THEN
IF (ir_lines (7 DOWNTO 5) = "100") THEN load_page_pc <= '1';
load_offset_pc <= '1'; s(2) <= '1';--goto 2 END IF;
IF (ir_lines (7 DOWNTO 5) = "101") THEN mar_on_adbus <= '1'; alu_b <= '1'; obus_on_dbus <= '1'; dbus_on_databus <= '1'; write_mem <= '1'; s(1) <= '1'; END IF; IF (ir_lines (7) = '0') THEN mar_on_adbus <= '1';
86 Nguyễn Chí Kiên Chí Kiên
read_mem <= '1'; databus_on_dbus <= '1';
IF ir_lines (6 DOWNTO 5) = "00" THEN alu_a <= '1';
ELSE alu_a <= '0'; END IF;
IF ir_lines (6 DOWNTO 5) = "01" THEN alu_and <= '1';
ELSE alu_and <= '0'; END IF;
IF ir_lines (6 DOWNTO 5) = "10" THEN alu_add <= '1';
ELSE alu_add <= '0'; END IF;
IF ir_lines (6 DOWNTO 5) = "11" THEN alu_sub <= '1'; ELSE alu_sub <= '0'; END IF; load_sr <= '1'; load_ac <= '1'; s(1) <= '1'; END IF; END IF; END IF; END PROCESS;
87 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (f) Mô tả phần cứng của khối S6
Trạng thái 7
s7: PROCESS(s (7), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s (7) = '1' THEN mar_on_adbus <= '1'; pc_offset_on_dbus'1'; dbus_on_databus <= '1'; write_mem <= '1'; load_offset_pc <=
88 Nguyễn Chí Kiên Chí Kiên s (8) <= '1'; --goto 8 END IF; END IF; END PROCESS; Mô tả phần cứng của khối S7
Hình 4.3.6 (g) Mô tả phần cứng của khối S7
ở trạng thái 7 tiếp tục thực thi lệnh jsr. Trong trạng thái này ghi nội dung của pc vào thủ tục mar và trong cùng thời gian này địa chỉ đầu của thủ tục chuyển vào thanh ghi pc.
Trạng thái 8
s8: PROCESS(s(8), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s (8) = '1' THEN increment_pc <= '1'; s(1) <= '1'; END IF; END IF; END PROCESS; Mô tả phần cứng của khối S8
89 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (h) Mô tả phần cứng của khối S8
Sau trạng thái 7 trên cạnh xuống của xung clock thì trạng thái 8 tích cực để thực thi lệnh jsr. Trong trạng thái này pc chứa vị trí đầu tiên của thủ tục. Trong trạng thái 8 nạp tín hiệu increment_pc và kích hoạt trạng thái 1 để nạp lệnh đầu tiên của thủ tục.
Trạng thái 9
s9: PROCESS(s (9), clk) BEGIN
IF (clk = '0' AND clk'EVENT) THEN IF s(9) = '1' THEN
IF (status AND ir_lines (3 DOWNTO 0)) /= "0000" THEN load_offset_pc <= '1'; ELSE load_offset_pc <= '0'; END IF; s(1) <= '1'; --goto 1 END IF; END IF; END PROCESS; Mô tả phần cứng của khối S9
90 Nguyễn Chí Kiên Chí Kiên
Hình 4.3.6 (i) Mô tả phần cứng của khối S9
Khi trạng thái 4 kích hoạt và một lệnh rẽ nhánh bắt đầu thực thi khi đó trạng thái 9 đ−ợc kích hoạt, địa chỉ lệnh rẽ nhánh ở trong thanh ghi mar. Trạng thái 9 nạp mar vào trong pc nếu phù hợp thì tìm giữa bit 3 và bit 0 của lệnh rẽ nhánh và những bit thanh ghi trạng thái. Nếu điều kiện rẽ nhánh không thoả mãn thì pc giữ lại giá trị của nó.Trong một số tr−ờng hợp bộ điều khiển trả về trạng thái 1 để thực hiện lệnh kế tiếp. Kết hợp các hình từ hình 4.3.6 (a) đến 4.3.6 (i) thành mô hình hoạt động của khối điều khiển nh− sau:
Hình 4.3.6 (j) mô hình hoạt động của khối điều khiển
Trong hình các khối hình vuông 1, 2, 3, 4, 5, 6, 7, 8, 9 là những khối điều khiển trạng thái từ 1 đến 9. Những khối hình tròn lgs1, lgs2, lgs3, lgs4 là những
91 Nguyễn Chí Kiên Chí Kiên
khối luận lý làm nhiệm vụ chọn lựa điều kiện thực hiện trạng thái tiếp theo.
Ch−ơng 5: mô phỏng
Trong các ch−ơng tr−ớc đã giới thiệu tổng quát về IC khả trình, công nghệ FPGA, ngôn ngữ mô tả phần cứng VHDL và ph−ơng pháp thiết kế bộ VXL 8 bit sử dụng công nghệ FPGA. Để kiểm tra mạch thiết kế có đúng theo yêu cầu hay không thì chúng ta sử dụng phần mềm đi mô tả hệ thống.