LỜI NÓI ĐẦU
Một thành phần quan trọng của máy tính là bộ xử lý trung tâm (CPU). Có rất nhiều công sức được đầu tư vào việc chế tạo các CPU nhằm tạo ra các máy tính đáp ứng yêu cầu ngày càng cao của xã hội. Đó cũng chính là nhiệm vụ mà đề tài này cần thực hiện. Để thiết kế một CPU với đầy đủ chức năng cần một công cụ đủ mạnh. Trong số những công cụ đó, ngôn ngữ mô tả phần cứng (VHDL) sẽ được sử dụng trong đề tài này
Từ ngôn ngữ VHDL các nhà thiết kế phần cứng có thể thiết kế ra những thiết bị phần cứng như CPU, bộ vi điều khiển một cách nhanh chóng và cũng có thể thực hiện mô phỏng và kiểm tra khả năng hoạt động của thiết bị trước khi đưa vào sản xuất, nhờ vậy có thể giảm bớt thời gian, chi phí sản xuất . Do khả năng và tính hiệu quả của ngôn ngữ VHDL là động cơ chính để chúng em chọn đề tài “Thiết kế CPU dùng ngôn ngữ VHDL” làm đề tài cho luận văn tốt nghiệp của mình.
Chúng em chân thành biết ơn toàn thể quý thầy cô trong Khoa Công Nghệ Thông Tin Trường Đại Học Kỹ Thuật Công Nghệ TPHCM, xin chân thành cảm ơn thầy Lê Mạnh Hải đã tận tình hướng dẫn chúng em thực hiện luận văn này.
Trong thời gian ngắn, có lẽ chưa đủ để nghiên cứu sâu một đề tài tương đối lớn, nên chắc chắn không thể tránh khỏi thiếu sót. Kính mong quý thầy cô góp ý để chúng em tiến bộ thêm.
MỤC LỤC
Trang
LỜI NÓI ĐẦU 1
GIỚI THIỆU 2
I. MỤC ĐÍCH 2
II. BỐ CỤC 2
MỤC LỤC 3
Phần 1 VHDL VÀ FPGA 6
I. GIỚI THIỆU 6
1. Giới thiệu về VHDL 6
2. Các đặc điểm của VHDL 6
II. CÁC KHÁI NIỆM CƠ BẢN 6
1. Các khối 6
2. Giới thiệu hai đơn vị thiết kế cơ bản của VHDL 7
2.1. Khai báo thực thể 8
2.2. Thực thể kiến trúc 8
3. Gói 9
III. MỐI QUAN HỆ GIỮA NGÔN NGỮ VHDL VÀ PHẦN CỨNG 9
1. Các thành phần của VHDL để mô tả phần cứng 9
1.1. Các kiểu của VHDL 9
1.2. Các đối tượng của ngôn ngữ VHDL 10
1.3. Các toán tử số học 11
1.3.1. Các toán tử luận lý 11
1.3.2. Các toán tử quan hệ 11
1.3.3. Các toán tử cộng 11
1.3.4. Các toán tử dịch 11
1.3.5. Các toán tử một ngôi 12
1.3.6. Các toán tử nhân 12
1.4. Các lệnh tuần tự 12
1.4.1. Phép gán biến số 12
1.4.2. Phép gán tín hiệu 12
1.4.3. Lệnh điều kiện 12
1.4.4. Lệnh lặp 13
2. Sự thể hiện phần cứng bằng VHDL 13
2.1. Các mạch tổ hợp 13
2.1.1. Các cổng luận lý 13
2.1.2. Các toán tử số học 13
2.1.3. Các toán tử dịch và quay 14
2.1.4. Bộ dồn kênh 14
2.2. Các mạch đồng bộ 15
2.2.1. Mạch cài 15
2.2.2. Thanh ghi 16
IV. CÔNG NGHỆ FPGA 16
1. Các loại FPGA 17
1.1. Các công nghệ lập trình chíp 18
1.1.1. Công nghệ lập trình dùng RAM tĩnh 18
1.1.2. Công nghệ lập trình dùng cầu chì nghịch 19
1.1.3. Công nghệ lập trình EPROM và EEPROM 20
1.2. Các loại FPGA trên thị trường 21
2. Một số ứng dụng của FPGA 22
3. Thiết bị Max, Flex 23
3.1. MAX 24
3.2. FLEX 24
Phần 2 THIẾT KẾ CPU 25
I. NHIỆM VỤ 25
II. TỔ CHỨC BỘ NHỚ CỦA CPU 25
III. TẬP LỆNH CỦA CPU 26
IV. CHẾ ĐỘ ĐỊA CHỈ CỦA LỆNH 27
V. HÀNH VI CPU 29
1. Định thời và đồng hồ 29
1.1. Giản đồ định thời đáp ứng ngắt quãng 29
1.2. Giản đồ chu kỳ thực hiện lệnh 1 byte 30
1.3. Giản đồ định thời chu kỳ thực hiện các lệnh rẽ nhánh và lệnh jmp ở chế độ trực tiếp 30
1.4. Giản đồ định thời chu kỳ thực hiện lệnh lda, adc, sbc 31
1.5. Giản đồ định thời chu kỳ thực hiện lệnh jsr 31
1.6. Giản đồ định thời chu kỳ thực hiện lệnh sta 31
1.7. Giản đồ định thời chu kỳ thực hiện lệnh lda, and, adc, sbc 32
1.8. Giản đồ định thời chu kỳ thực hiện lệnh sta 32
2. Khối phục vụ chương trình 33
3. Mô tả hành vi cpu 36
VI.CÁC THÀNH PHẦN CỦA CPU 38
1. Chức năng của các thành phần của CPU 39
2. Thực hiện lệnh 39
3. Mô tả các thành phần 41
3.1. Đơn vị luận lý số học 41
3.2. Đơn vị dịch chuyển 44
3.3. Thanh ghi trạng thái 45
3.4. Thanh ghi tích luy 46
3.5. Thanh ghi lệnh 47
3. Bộ điều khiển của CPU 48
Phần 3 MÔ PHỎNG 62
I. MAX+PLUSII 62
1. Tổng Quát 62
2. Cách sử dụng Max+PlusII 62
2.1. Thực hiện soạn thảo và dịch một chương trình 63
2.2. Thực hiện kiểm tra kết quả sau khi đã tổng hợp mạch 64
2.3. Thoát khỏi Max+plusII 65
II. MÀN HÌNH KHI MÔ PHỎNG 65
1. Khối luận lý số học ALU 65
2. Khối dịch chuyển SHU 66
3. Khối điều khiển 67
4. Sơ đồ chân CPU 69
5. Màn hình mô phỏng lệnh 70
Phần 4 KẾT LUẬN KIẾN NGHỊ 71
I. NHẬN XÉT CHUNG 71
a. Những mặt đạt được 71
b. Những vấn đề tồn tại 71
II. HƯỚNG PHÁT TRIỂN 71
III. ĐÁNH GIÁ 71
IV. KẾT LUẬN 71
Phần 5 TÀI LIỆU THAM KHẢO 73
73 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2688 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Thiết kế CPU dùng ngôn ngữ VHDL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
tuyeán döõ lieäu, thì döõ lieäu ñöôïc ñoïc vaøo byte1 vaø tín hieäu read_mem trôû veà 0. Sau khi phaân tích leänh, taïi ñaàu chu kyø S3 tuyeán ñòa chæ phaùt noäi dung cuûa PC+1 vaø tín hieäu read_mem laïi tích cöïc (leân ‘1’). Taïi ñaàu chu kyø S4 döõ lieäu ñöôïc ñoïc vaøo byte2, sau ñoù CPU ñieàu khieån tín hieäu read_mem trôû veà 0 vaø thöïc hieän leänh trong chu kyø S4.
1.4. Giaûn ñoà ñònh thôøi chu kyø thöïc hieän leänh lda, adc, sbc (cheá ñoä tröïc tieáp) vaø leänh jmp (cheá ñoä giaùn tieáp).
Hình 18.
Töø traïng thaùi S1 ñeán S4 thöïc hieän gioáng nhö muïc 3, ñeán ñaàu chu kyø S5, CPU ñoïc noäi dung treân tuyeán döõ lieäu coù ñòa chæ laø byte1 (3-0) & byte2 ñeå laáy data vaø thöïc hieän leänh.
1.5. Giaûn ñoà ñònh thôøi chu kyø thöïc hieän leänh jsr
Hình 19.
Giaûn ñoà naøy töø traïng thaùi S1 ñeán S4 gioáng nhö muïc 3, ñeán chu kyø 5 tín hieäu write_mem tích cöïc cho pheùp CPU thöïc hieän thao taùc ghi noäi dung PC (7-0) vaøo oâ nhôù ñòa chæ PC (3-0) & byte2.
1.6. Giaûn ñoà ñònh thôøi chu kyø thöïc hieän leänh sta (cheá ñoä tröïc tieáp)
Hình 20.
Giaûn ñoà naøy töø traïng thaùi S1 ñeán S4 gioáng nhö muïc 3, taïi chu kyø S5 CPU thöïc hieän thao taùc ghi noäi dung ac vaøo oâ nhôù ñòa chæ byte1 (3-0) & byte2
1.7. Giaûn ñoà ñònh thôøi chu kyø thöïc hieän leänh lda, and, adc, sbc (cheá ñoä giaùn tieáp)
Hình 21.
Töø chu kyø S1 ñeán chu kyø S4 thöïc hieän gioáng muïc 3, ñaàu chu kyø S5 ñoïc noäi dung oâ nhôù ôû ñòa chæ byte1 (3-0) &ø byte2 vaøo byte 2 laøm ñòa chæ. Ñaàu chu kyø S7, phaùt ñòa chæ trong byte1 (3-0) & byte2 ra tuyeán dabus ñeå ñoïc döõ lieäu cho CPU xöû lyù.
1.8. Giaûn ñoà ñònh thôøi chu kyø thöïc hieän leänh sta (cheá ñoä giaùn tieáp)
Hinh 22.
Töø chu kyø S1 ñeán S6 thöïc hieän gioáng vôùi giaûn ñoà ôû muïc 7, ñaàu chu kyø S7 phaùt ñòa chæ trong byte1 (3-0) & byte2 ñeå ghi noäi dung acc vaøo boä nhôù.
Töø 8 giaûn ñoà traïng thaùi treân veõ ñöôïc sô ñoà traïng thaùi moâ taû haønh vi cuûa CPU nhö sau:
Hình 23.
2. Khoái phuïc vuï chöông trình (xem[ 2, 4] )
Khoái utility naøy khai baùo kieåu con byte ñoä daøi 8 bit kieåu STD_LOGIC_VECTOR, kieåu con ten ñoä daøi 10 bit kieåu STD_LOGIC_VECTOR. Ngoaøi ra khai baùo caùc haèng soá coù giaù trò laø caùc vector bit cuûa caùc leänh. Teân cuûa caùc leänh ñöôïc gaùn cho caùc maõ taùc vuï cuûa leänh ñoù. Khoái utilities trình baøy hai haøm add_cv vaø sub_cv. Hai haøm naøy thöïc hieän coäng vaø tröø hai toaùn haïng kieåu std_logic_vector coù ñoä daøi 8 bit. Keát quaû traû veà laø kieåu bit vector coù chieàu daøi 8 + 2. Trong ñoù, bit coù vò trí 8+1 chæ thò côø nhôù, bit coù vò trí 8+2 chæ thò côø traøn. Hai giaù trò ADDR_WIDTH vaø DATA_WIDTH laø chieàu daøi bit cuûa hai tuyeán ñòa chæ vaø döõ lieäu.
PACKAGE UTILITY IS
CONSTANT ADDR_WIDTH: INTEGER := 2;
CONSTANT DATA_WIDTH: INTEGER :=8;
SUBTYPE byte IS std_logic_vector (7 DOWNTO 0);
SUBTYPE ten IS std_logic_vector (9 DOWNTO 0);
SUBTYPE nibble IS std_logic_vector (3 DOWNTO 0);
FUNCTION add_cv (a, b: byte; cin: std_logic) RETURN ten;
FUNCTION sub_cv (a, b: byte; cin: std_logic) RETURN ten;
FUNCTION set_if_zero (a: STD_LOGIC_VECTOR)
RETURN STD_LOGIC;
CONSTANT zero_8: byte := "00000000";
CONSTANT int_66: STD_LOGIC_VECTOR (11 DOWNTO 0):= "000001100110";
CONSTANT zero_12: STD_LOGIC_VECTOR (11 DOWNTO 0):= "000000000000";
CONSTANT cla: std_logic_vector (3 DOWNTO 0):="0001";
CONSTANT cma: std_logic_vector (3 DOWNTO 0):="0010";
CONSTANT cmc: std_logic_vector (3 DOWNTO 0):="0100";
CONSTANT asl: std_logic_vector (3 DOWNTO 0):="1000";
CONSTANT asr: std_logic_vector (3 DOWNTO 0):="1001";
CONSTANT jsr: std_logic_vector (2 DOWNTO 0):="110";
CONSTANT bra: std_logic_vector (3 DOWNTO 0):="1111";
CONSTANT indirect: std_logic:='1';
CONSTANT jmp: std_logic_vector (2 DOWNTO 0):="100";
CONSTANT sta: std_logic_vector (2 DOWNTO 0):="101";
CONSTANT lda: std_logic_vector (2 DOWNTO 0):="000";
CONSTANT ann: std_logic_vector (2 DOWNTO 0):="001";
CONSTANT adc: std_logic_vector (2 DOWNTO 0):="010";
CONSTANT sbc: std_logic_vector (2 DOWNTO 0):="011";
CONSTANT jsr_or_bra:std_logic_vector (1 DOWNTO 0):="11";
CONSTANT a_and_b: STD_LOGIC_VECTOR (5 DOWNTO 0):="000001";
CONSTANT b_compt: STD_LOGIC_VECTOR (5 DOWNTO 0):="000010";
CONSTANT a_input: STD_LOGIC_VECTOR (5 DOWNTO 0):="000100";
CONSTANT a_add_b: STD_LOGIC_VECTOR (5 DOWNTO 0):="001000";
CONSTANT b_input: STD_LOGIC_VECTOR (5 DOWNTO 0):="010000";
CONSTANT a_sub_b: STD_LOGIC_VECTOR (5 DOWNTO 0):="100000";
END UTILITY;
Trong thaân khoái utility trình baøy hai giaûi thuaät thöïc hieän hai pheùp toaùn coäng vaø tröø. Trong haøm coäng, keát quaû pheùp coäng bit vaø côø nhôù cuûa noù ñöôïc tính nhö sau:
Sum := a XOR b XOR carry
Carry := ((a xor b) and carry) or ( a and b)
Voøng for thöïc hieän 8 pheùp coäng lieân tieáp ñeå taïo ra keát quaû vaø côø nhôù. Ñeå xaùc ñònh bit traøn, kieåm tra hai ngoõ vaøo cuøng daáu vaø keát quaû khaùc daáu thì pheùp tính ñaõ bò traøn
Neáu daáu_a baèng daáu_b vaø keát quaû khaùc daáu_a thì traøn ngöôïc laïi thì khoâng traøn
Ñoái vôùi pheùp tröø cuõng töông töï nhö pheùp coäng chæ khaùc laø tröôùc khi thöïc hieän thì laáy soá buø cuûa b vaø côø traøn.
PACKAGE BODY utility IS
FUNCTION add_cv (a, b: byte; cin: std_logic) RETURN ten IS
VARIABLE r, c: ten := "0000000000";
VARIABLE a_sign, b_sign: std_logic := '0';
BEGIN
a_sign := a (a'LEFT);
b_sign := b (b'LEFT);
r(0) := a(0) XOR b(0) XOR cin;
c(0):=((a(0) XOR b(0)) AND cin) OR (a(0) AND b(0));
FOR i IN 1 TO (a'LEFT) LOOP
r(i) := a(i) XOR b(i) XOR c(i-1);
c(i) := ((a(i) XOR b(i)) AND c(i-1)) OR (a(i) AND b(i));
END LOOP;
r(a'LEFT+1) := c(a'LEFT);
IF a_sign = b_sign AND r(a'LEFT) /= a_sign
THEN r (a'LEFT+2) := '1';
ELSE r (a'LEFT+2) := '0';
END IF;
RETURN r;
END add_cv;
FUNCTION sub_cv (a, b: byte; cin: std_logic) RETURN ten IS
VARIABLE not_b: byte := zero_8;
VARIABLE not_c: std_logic;
VARIABLE r, c: ten := "0000000000";
VARIABLE a_sign, b_sign: std_logic := '0';
BEGIN
not_b := NOT b;
not_c := NOT cin;
a_sign := a(a'LEFT);
b_sign := not_b(b'LEFT);
r(0) := a(0) XOR not_b(0) XOR not_c;
c(0) := ((a(0) XOR not_b(0)) AND not_c) OR (a(0) AND not_b(0));
FOR i IN 1 TO (a'LEFT) LOOP
r(i) := a(i) XOR not_b(i) XOR c(i-1);
c(i) := ((a(i) XOR not_b(i)) AND c(i-1)) OR (a(i) AND not_b(i));
END LOOP;
r(a'LEFT+1) := NOT c(a'LEFT);
IF a_sign = b_sign AND r(a'LEFT) = a_sign THEN r(a'LEFT+2) := '1';
ELSE r(a'LEFT+2) := '0';
END IF;
RETURN r;
END sub_cv;
END utility;
3. Moâ taû haønh vi cpu (xem[4])
Moâ taû haønh vi cuûa CPU baèng leänh
cpu: PROCESS (clk_cpu)
Khai baùo caùc bieán caàn thieát cho chöông trình
BEGIN
Wait UNTIL clk_cpu = ‘0’;
IF reset =’0’ THEN Ñaët caùc traïng thaùi ban ñaàu
ELSE
CASE state IS
WHEN S0 | S10 =>
Ñaët bieán veà ban ñaàu
IF interrup = ‘1’ THEN Xöû lyù ngaét quaõng
ELSE
Phaùt tín hieäu ñoäc boä nhôù
END IF;
WHEN S1 =>
IF interrup =’1’ THEN Trôû veà traïng thaùi S10
ELSE
Ñoïc döõ lieäu treân bus ñöa vaøo byte1, taêng PC+ 1
IF byte1 (7 downto 4) = leänh moät byte THEN
Thöïc hieän leänh 1 byte
ELSE Ñaët traïng thaùi S2;
END IF;
END IF;
WHEN S2 =>
Phaùt tín hieäu ñoïc boä nhôù ñaët traïng thaùi S3
WHEN S3 =>
Ñoïc döõ lieäu vaøo byte 2, taêng PC + 1
IF byte1 (7 downto 4) = reõ nhaùnh THEN
Thöïc hieän leänh reõ nhaùnh, ñòa chæ trong byte 2
ELSIF byte1 (4) /= leänh giaùn tieáp AND byte1(7 downto 5)=jmp THEN
Thöïc hieän leänh nhaûy tröïc tieáp
ELSE Ñaët traïng thaùi s4
END IF;
WHEN S4 =>
Ñaët traïng thaùi S5
IF byte1 (7 down to 5) = jsr THEN Phaùt xung ghi boä nhôù
ELSE
IF byte1(4) = leänh giaùn tieáp THEN
Phaùt byte2 ra tuyeán ñòa chæ
Phaùt xung ñoïc boä nhôù
ELSIF byte1(7 downto 5)=sta tröïc tieáp THEN
Phaùt byte1(3-0)&byte2 ra tuyeán ñòa chæ
Naïp ac vaøo tuyeán döõ lieäu
Phaùt xung ghi boä nhôù
ELSE
Phaùt byte1(3-0)&byte2 ra tuyeán ñòa chæ
Phaùt xung ñoïc boä nhôù
END IF;
WHEN S5 =>
IF leänh jsr THEN Thöïc hieän leänh jsr
ELSIF leänh sta tröïc tieáp THEN Keát thuùc xung ghi
ELSIF leänh giaùn tieáp THEN
Ñoïc byte thöù 3 vaøo byte 2
Ñaët traïng thaùi s6
IF byte1 (7 downto 5) jmp THEN
Thöïc hieän leänh jmp giaùn tieáp
END IF;
ELSE
Thöïc hieän leänh tröïc tieáp lda, and, adc, sbc
END IF;
WHEN S6 =>
Ñaët traïng thaùi S7
IF byte1 (7 downto 5) = sta THEN
Phaùt byte1(3-0)&byte2 ra tuyeán ñòa chæ
Naïp ac vaøo tuyeán data
Phaùt xung ghi boä nhôù
ELSE
Phaùt byte1(3-0)&byte2 ra tuyeán ñòa chæ
Phaùt xung ñoïc boä nhôù
END IF;
WHEN s7 =>
IF leänh sta giaùn tieáp THEN Keát thuùc xung ghi
ELSE
Thöïc hieän leänh giaùn tieáp lda, and, adc, sbc
END IF;
Trôû veà traïng thaùi S10
END IF;
END PROCESS;
VI. CAÙC THAØNH PHAÀN CUÛA CPU(Xem[2,4])
Sô ñoà moâ taû toång quaùt CPU
Hình 24.
CPU ñuôïc trình baøy ôû ñaây coù caùc thaønh phaàn chính laø AC, IR , PC, MAR, SR, ALU vaø SHU. Doøng döõ lieäu chaïy giöõa caùc thaønh phaàn thoâng qua caùc tuyeán keát noái.
1. Chöùc naêng cuûa caùc thaønh phaàn cuûa CPU
Baûy thaønh phaàn cuûa CPU: AC, IR, PC, MAR vaø SR laø caùc thanh ghi, ALU vaø SHU laø caùc ñôn vò luaän lyù toå hôïp. Moãi thaønh phaàn coù moät taäp hôïp ñaàu vaøo vaø ñaàu ra vôùi nhieàu ñöôøng ñieàu khieån.
Thanh ghi tích luyõ AC laø thanh ghi 8 bit thanh ghi naøy coù nhieäm vuï cung caáp toaùn haïng cho ñôn vò luaän lyù soá hoïc ALU.
Thanh ghi leänh IR noái vôùi DBUS thoâng qua boä luaän lyù soá hoïc ALU vaø cung caáp caùc bit leänh ñeán boä ñieàu khieån vaø moät ñòa chæ trang ñeán tuyeán ñòa chæ (ADBUS)
Thanh ghi boä ñeám chöông trình PC laø moät thanh ghi 12 BIT cuõng laø moät boä ñeám leân theo kieåu nhò phaân cung caáp caùc ñòa chæ leänh ñeán tuyeán ñòa chæ (ADBUS) thoâng qua thanh ghi ñòa chæ boä nhôù (MAR).
Thanh ghi ñòa chæ mar laø boä ñeám ñòa chæ, caùc thanh ghi MAR vaø PC coù caùc phaàn trang vaø ñoä dôøi ñöôïc nhaän daïng bôûi tín hieäu mar_page, pc_page, mar_offset, pc_offset. Soá trang ñöôïc löu tröõ trong 4 bit coù troïng soá cao nhaát.
Ñôn vò luaän lyù soá hoïc ALU laø ñôn vò luaän lyù toå hôïp vôùi hai taäp hôïp ñaàu vaøo 8 bit, boán ñaàu vaøo côø, ba ñaàu vaøo ñieàu khieån. Caùc ñaàu ra cuûa ñôn vò naøy ñöôïc noái ñeán caùc ñaàu vaøo cuûa ñôn vò SHU. Shifter (SHU) laø ñôn vò luaän lyù toå hôïp vaø noù thöïc hieän nhöõng thao taùc dòch chuyeån traùi hay phaûi cuûa toaùn haïng 8 bit.
Thanh ghi traïng thaùi SR coù 4 ñaàu vaøo vaø 4 ñaàu ra. Caùc ñaàu ra cuûa thanh ghi traïng thaùi truyeàn qua ALU vaø SHU roài quay voøng trôû laïi ñaàu vaøo cuûa chính noù. Ñieàu naøy cho pheùp caùc côø ñöôïc ñieàu chænh bôûi moät trong nhöõng ñôn vò luaän lyù naøy.
Boä ñieàu khieån (CONTROLLER) phaùt ra tín hieäu ñieàu khieån cho caùc khoái thaønh phaàn vaø caùc bus. Nhöõng tín hieäu naøy gaây ra chuyeån ñoäng döõ lieäu thoâng qua bus heä thoáng vaø löu tröõ döõ lieäu naøy vaøo thanh ghi. Boä ñieàu khieån ñöa ra tín hieäu ñieàu khieån döïa vaøo tín hieäu reset, vaøo traïng thaùi cuûa noù, vaøo ngaét quaõng beân ngoaøi vaø vaøo caùc bit cuûa IR vaø SR.
2. Thöïc hieän leänh
Döïa vaøo leänh naèm trong thanh ghi IR, boä ñieàu khieån phaùt sinh caùc tín hieäu ñieàu khieån theo thöù töï thích hôïp ñeå thöïc hieän leänh. Ñeå minh hoïa cho cô cheá leänh naøy coù theå moâ taû chuoãi söï kieän ñeå thöïc hieän leänh lda nhö sau.
Ban ñaàu boä ñeám chöông trình chöùa ñòa chæ cuûa leänh ñöôïc phaùt ra. Vieäc tìm leänh baét ñaàu vôùi vieäc chuyeån ñòa chæ töø PC ñeán MAR vaø taêng PC leân 1. Ñeå thöïc hieän ñòa chæ trong PC ñöôïc ñaët treân mar_bus vaø MAR phaûi ñöôïc cho pheùp vaø coù xung ñoàng hoà. Sau ñoù boä ñieàu khieån kích hoaït tín hieäu trong MAR leân tuyeán ñòa chæ ADBUS cuøng luùc vôùi vieäc phaùt tín hieäu read. Ñieàu naøy laøm cho döõ lieäu töø boä nhôù xuaát hieän treân DATABUS1 vaø ñi qua DBUS, ALU, SHU vaø OBUS ñeå tôùi IR. Ñeå ñaït ñöôïc muïc ñích naøy CONTROLLER kích hoaït tín hieäu ñieàu khieån databus_on_dbus, chæ daãn cho ALU ñeå ñaët side_a leân ñaàu ra cuûa noù, vaø ñieàu khieån thanh ghi dòch ñaët döõ lieäu ñaàu vaøo leân ñaàu ra maø khoâng dòch chuyeån noù. Döõ lieäu treân ñaàu ra cuûa SHU ñöôïc pheùp naïp vaøo IR.
Tieáp theo vieäc naïp leänh CONTROLLER ñöa ra tín hieäu thích hôïp döïa treân caùc bit cuûa IR. Caùc bit coù troïng soá cao nhaát cuûa IR laø 0000, chæ tôùi leänh lda ñònh vò tröïc tieáp ñeå taïo ra ñòa chæ ñaày ñuû cho leänh lda, CONTROLLER caøi noäi dung hieän haønh cuûa PC vaøo MAR vaø keá ñoù ñöôïc ñaët leân ADBUS vaø phaùt xung read_mem. Data ñoïc töø boä nhôù seõ truyeàn qua DBUS vaø MAR_BUS ñeå ñeán ñaàu vaøo cuûa thanh ghi MAR_OFFSET. Luùc naøy, CONTROLLER kích hoaït tín hieäu ñeå ñaët 4 bit coù troïng soá thaáp nhaát cuûa PC leân thanh ghi MAR_PAGE. Khi coù ñuû tín hieäu ôû ñaàu vaøo xung ñoàng hoà mar thöïc hieän caøi ñòa chæ ñaày ñuû cuûa toaùn haïng cuûa lda vaøo thanh ghi naøy.
Thao taùc ñoïc boä nhôù tieáp theo seõ ñaët toaùn haïng cuûa leänh lda leân DATABUS. Döõ lieäu 8 bit naøy truyeàn qua DBUS vaø saün saøng treân a_side cuûa ALU. CONTROLLER ñieàu khieån ALU ñaët ñaàu vaøo side_a leân ñaàu ra cuûa noù, vaø laøm cho SHU ñöa döõ lieäu ñaàu vaøo ñeán ñaàu ra cuûa noù maø khoâng dòch chuyeån. Toaùn haïng cuûa lda baây giôø xuaát hieän treân OBUS, CONTROLLER cho pheùp naïp vaøo AC vaø taïi caïnh leân cuûa ñoàng hoà, toaùn haïng cuûa lda ñöôïc caøi vaøo thanh ghi tích luyõ
Vieäc thöïc hieän caùc leänh khaùc ñöôïc laøm theo caùch töông töï nhö tieán trình ñaõ moâ taû ñoái vôùi leänh lda. Ñoái vôùi caùc leänh and, adc, vaø sbc, khi toaùn haïng cuûa leänh coù maët treân side_a cuûa ALU, CONTROLLER phaùt tín hieäu cho ALU ñeå thöïc hieän thao taùc and, adc hoaëc sbc thay vì ñöa toaùn haïng qua ñaàu ra cuûa ALU. Ñoái vôùi ñòa chæ giaùn tieáp, CONTROLLER taïo ra thao taùc ñoïc theâm töø boä nhôù tröôùc khi thöïc hieän leänh.
Caùc tín hieäu ñieàu khieån ngoõ vaøo vaø ngoõ ra cuûa CPU
Phaàn töû
Loaïi
Teân tín hieäu
Chöùc naêng
AC
Ñieàu khieån thanh ghi
Load_ac,
zero_ac
Naïp ac
Xoaù ac
IR
Ñieàu khieån thanh ghi
Load_ir
Naïp ir
PC
Ñieàu khieån thanh ghi
Increment_pc,
Load_page_pc,
Load_offset_pc
Reset_pc
Taêng pc
Naïp phaàn trang cuûa pc
Naïp phaàn dôøi cuûa pc
Xoaù pc
MAR
Ñieàu khieån thanh ghi
Load_page_mar
Load_offset_mar
Naïp phaàn trang cuûa mar
Naïp phaàn dôøi cuûa mar
SR
Ñieàu khieån thanh ghi
Load_sr
Cm_carry_sr
Naïp sr
Laáy buø côø carry cuûa sr
MAR_BUS
Ñieàu khieån bus
Pc_on_mar_page_bus
Ir_on_mar_page_bus
Pc_on_mar_offset_bus
dbus_on_mar_offset_bus
Ñaët phaàn trang cuûa pc leân phaàn trang cuûa tuyeán mar
Ñaët 4 bits cuûa ir leân phaàn trang cuûa tuyeán mar
Ñaët ñoä dôøi cuûa pc leân ñoä dôøi cuûa tuyeán mar
Ñaët dbus leân ñoä dôøi cuûa tuyeán mar
DBUS
Ñieàu khieån bus
Pc_offset_on_dbus
Obus_on_dbus
Databus_on_dbus
Ñaët ñoä dôøi cuûa pc leân dbus
Ñaët obus leân dbus
Ñaët databus beân ngoaøi leân dbus beân trong
ADBUS
Ñieàu khieån bus
Mar_on_adbus
Ñaët taát caû mar leân adbus
DATABUS1
Ñieàu khieån bus
Dbus_on_databus1
Ñaët databus1 beân ngoaøi leân dbus beân trong
DATABUS2
Ñieàu khieån bus
Obus_on_databus2
Ñaët obus beân trong leân databus2 beân ngoaøi
SHU
Ñôn vò logic
Arith_shift_left
Arith_shift_right
Dòch 1 bit sang traùi
Dòch 1 bit sang phaûi
ALU
Ñôn vò logic
Alu_and
Alu_not
Alu_a
Alu_add
Alu_b
Alu_sub
Xuaát ngoõ ra alu cuûa pheùp and 2 ngoõ vaøo
Xuaát ngoõ ra alu cuûa pheùp buø ngoõ vaøo b
Xuaát ngoõ ra alu cuûa chính ngoõ vaøo a
Alu thöïc hieän coäng hai ngoõ vaøo
Xuaát ngoõ ra alu cuûa chính ngoõ vaøo b
Alu thöïc hieän tröø 2 ngoõ vaøo
Other
I/O
Read_mem
Write_mem
Interrup
Khôûi ñoäng thao taùc ñoäc boä nhôù
Khôûi ñoäng thao taùc vieát boä nhôù
Ngaét quaõng CPU
Baûng 3.
3. Moâ taû caùc thaønh phaàn
3.1. Ñôn vò luaän lyù soá hoïc (Arithmetic logic unit)
ALU coù hai toaùn haïng 8bit, 6 doøng maõ thao taùc (six opcode select lines), 4 côø nhaäp, 8 ñöôøng xuaát döõ lieäu, vaø 4 côø xuaát. Saùu doøng maõ naøy choïn toaùn haïng cuûa ALU theo baûng sau.
STT
Doøng maõ
(Opcode line
Thao taùc
(Operation)
Côø
0
1
2
3
4
5
Alu_and
Alu_not
Alu_a
Alu_add
Alu_b
Alu_sub
a AND b
NOT b
a
b PLUS a
b
b MINUS a
zn
zn
zn
vczn
zn
vczn
Baûng 4
Sô ñoà moâ taû phaàn cöùng khoái ALU
Hình 25.
Ñaây laø ñoaïn chöông trình moâ taû haønh vi khoái ALU cuûa CPU baèng ngoân ngöõ VHDL
ENTITY alu IS
PORT (a_side, b_side: IN byte;
alu_and, alu_not, alu_a, alu_add, alu_b, alu_sub: IN STD_LOGIC;
in_flags: IN nibble;
z_out: OUT byte; out_flags: OUT nibble);
END alu;
ARCHITECTURE behavioral OF alu IS
BEGIN
coding: PROCESS (a_side, b_side, alu_and, alu_not, alu_a, alu_add, alu_b, alu_sub)
VARIABLE t: ten;
VARIABLE temp: STD_LOGIC_VECTOR (5 DOWNTO 0);
VARIABLE temp1: nibble;
VARIABLE v, c, z, n: STD_LOGIC;
ALIAS n_flag_in:std_logic IS in_flags (0);
ALIAS z_flag_in:std_logic IS in_flags (1);
ALIAS c_flag_in:std_logic IS in_flags (2);
ALIAS v_flag_in:std_logic IS in_flags (3);
BEGIN
out_flags <= "0000"; temp (5) := alu_sub;
temp (4) := alu_b; temp (3) := alu_add;
temp (2) := alu_a; temp (1) := alu_not;
temp (0) := alu_and;
CASE temp IS
WHEN a_add_b=>
T := add_cv (b_side, a_side, c_flag_in);
C := t (8); V := t (9);
WHEN a_sub_b =>
T := sub_cv (b_side, a_side, c_flag_in);
C := t (8); V := t (9);
WHEN a_and_b=>
T (7 DOWNTO 0) := a_side AND b_side;
C := c_flag_in; V := v_flag_in;
WHEN a_input=>
T (7 DOWNTO 0) := a_side ;
C := c_flag_in; V := v_flag_in;
WHEN b_input=>
T (7 DOWNTO 0) := b_side ;
C := c_flag_in; V := v_flag_in;
WHEN b_compt=>
T (7 DOWNTO 0) := not b_side ;
C := c_flag_in; V := v_flag_in;
WHEN OTHERS=>NULL;
END CASE;
N := t(7);
Z := set_if_zero(t(7 DOWNTO 0));
z_out <= t (7 DOWNTO 0);
temp1 (3) := v; temp1 (2) := c;
temp1 (1) := n; temp1 (0) := z;
out_flags <= temp1;
END PROCESS coding;
END behavioral;
3.2. Ñôn vò dòch chuyeån (Shifter unit)
Ñôn vò dòch chuyeån SHU cuûa CPU coù hai caùch hoaït ñoäng dòch traùi hoaëc dòch phaûi, 4 côø nhaäp vôùi 8 ñöôøng döõ lieäu nhaäp, 4 côø xuaát vaø 8 ñöôøng döõ lieäu xuaát. Khi dòch traùi toaùn haïng noù dòch chuyeån bit 0 vaøo vò trí coù troïng soá thaáp nhaát cuûa ñaàu ra, di chuyeån bit coù troïng soá cao nhaát cuûa ñaàu vaøo ñeán côø nhôù. Khi dòch phaûi bit tín hieäu ôû ngoõ nhaäp töø bit 7 ñeán bit 1 dòch sang phaûi moät ñôn vò vaø noù noái theâm giaù trò vaøo bit coù troïng soá cao nhaát cuûa ngoõ ra baèng giaù trò 0. Caû hai phöông phaùp dòch chuyeån, ñeàu coù aûnh höôûng ñeán côø zero vaø côø not.
Sô ñoà moâ taû phaàn cöùng cuûa khoái SHU
Hình 26.
Ñoaïn chöông trình moâ taû haønh vi cuûa SHU
ENTITY shifter IS
PORT (alu_side: IN byte;
arith_shift_left, arith_shift_right: IN STD_LOGIC;
in_flags: IN nibble;
obus_side: OUT byte; out_flags: OUT nibble);
END shifter;
ARCHITECTURE behavior OF shifter IS
BEGIN
coding: PROCESS (alu_side, arith_shift_left, arith_shift_right )
VARIABLE t, t1: byte;
VARIABLE v, c, z, n: STD_LOGIC;
ALIAS n_flag_in:std_logic IS in_flags (0);
ALIAS z_flag_in:std_logic IS in_flags (1);
ALIAS c_flag_in:std_logic IS in_flags (2);
ALIAS v_flag_in:std_logic IS in_flags (3);
BEGIN
if arith_shift_right='0' and arith_shift_left='0' then
t := alu_side; v := in_flags(3);
c := in_flags(2); z := in_flags(1);
n := in_flags(0);
elsif arith_shift_left = '1' then
n := t(7); z := set_if_zero(t);
c := alu_side(7); v := alu_side(6) xor alu_side(7);
elsif arith_shift_right = '1' then
t := (alu_side(7) & alu_side(7 downto 1));
n:=t(7); z:=set_if_zero(t);
c:=c_flag_in; v:=v_flag_in;
end if;
obus_side <= t; out_flags (3) <= v;
out_flags (2) <= c; out_flags (1) <= z;
out_flags (0) <=n;
END PROCESS coding;
END behavior;
3.3. Thanh ghi traïng thaùi (Status register unit)
Thanh ghi traïng thaùi laø thanh ghi ñoàng boä, döõ lieäu naïp leân nhöõng côø ñöôïc ñieàu khieån ñoàng boä bôûi ngoõ nhaäp cuûa load vaø côø cm_carry. Khi côø load ñöôïc kích hoaït taát caû 4 côø nhaäp ñöôïc naïp vaøo trong côø cuûa nhöõng flip-flops, vaø khi kích hoaït côø cm_carry, côø c ñöôïc naïp hoaøn taát
Sô ñoà phaàncöùng cuûa thanh ghi
Hình 27.
Duøng VHDL moâ taû thanh ghi traïng thaùi söû duïng qui trình leänh xöû lyù xung clock vaøo. Bieán internal_state trong caáu truùc haønh vi cuûa status_register_unit chöùa giaù trò cuûa thanh ghi. Treân nhöõng caïnh cuûa xung clock, bieán naøy chæ ñònh ñeán höôùng xuaát cuûa thanh ghi traïng thaùi.
ENTITY sr IS
PORT (in_flags: IN nibble; out_status:OUT nibble;
load, cm_carry, ck: IN std_logic);
END sr;
ARCHITECTURE behavioral OF sr IS
BEGIN
PROCESS(ck)
VARIABLE internal_state: nibble:="0000";
ALIAS internal_c: std_logic IS internal_state(2);
BEGIN
IF(ck='0') THEN
IF(load='1') THEN internal_state:=in_flags;
ELSIF(cm_carry='1') THEN
internal_c:=NOT internal_c;
END IF;
out_status<= internal_state;
END IF;
END PROCESS;
END behavioral;
3.4. Thanh ghi tích luyõ (Accumulator)
Sô ñoà phaàn cöùng 1 bit cuûa Acc
Hình 28.
Thanh ghi tích luyõ laø thanh ghi 8 bit baèng caùch naïp ñoàng boä nhaäp nhöõng giaù trò ‘0’. Thanh ghi tích luyõ naïp döõ lieäu töø beân ngoaøi vaøo trong thanh ghi ôû caïnh xuoáng cuûa xung clock, khi ngoõ nhaäp naïp kích hoaït vaø ngoõ nhaäp ‘0’ bò caám. Ñoàng thôøi söï hoaït ñoäng cuûa ngoõ nhaäp zero vaø load ñöôïc ñaët ñoàng boä thanh ghi.
Ñoaïn maõ VHDL moâ taû datafolw cuûa accumulator trong caáu truùc datafolw cuûa acc
ENTITY acc IS
PORT (i8: IN byte; o8: OUT byte; load, zero ,ck : IN std_logic);
END acc;
ARCHITECTURE dataflow OF acc IS
BEGIN
Process (load, clk)
BEGIN
IF (ck=’0’ AND ck’EVENT) THEN
IF load=’1’ THEN
IF zero= ‘1’ THEN o8 <= “00000000”;
ELSE o8 <= i8;
END IF;
END IF;
END IF;
END process;
END dataflow;
3.5. Thanh ghi leänh (Instruction register)
Thanh ghi leänh (ir) laø thanh ghi ñoàng boä 8 bit vôùi ngoõ nhaäp tích cöïc ôû möùc cao. Ngoõ nhaäp cho pheùp naïp clock vaø nguyeân nhaân ñeå thanh ghi naïp caïnh xuoáng cuûa ngoõ nhaäp xung clock
Sô ñoà 1 bit phaàn cöùng cuûa IR
Hình 29.
Ñoaïn maõ VHDL moâ taû thanh ghi leänh trong caáu truùc dataflow cuûa ir
ENTITY ir IS
PORT (i8: IN byte; o8: OUT byte; load, ck: IN std_logic);
END ir;
ARCHITECTURE dataflow OF ir IS
BEGIN
PROCESS (load, ck)
BEGIN
IF (ck='0' AND NOT ck'STABLE) THEN
IF load='1' THEN o8 <= i8;
END IF;
END IF;
END PROCESS;
END dataflow;
3. Boä ñieàu khieån cuûa CPU (control section)
Boä ñieàu khieån controller goàm coù moät chuoãi traïng thaùi, maø moãi traïng thaùi giöõ moät tín hieäu ñieàu khieån kích hoaït chính xaùc xung clock.
Ngoõ nhaäp cuûa nhöõng khoái luaän lyù töø nhöõng traïng thaùi cuûa nhöõng flip-flops khaùc nhau vaø töø nhöõng ngoõ nhaäp beân ngoaøi, maø traïng thaùi ñoù aûnh höôûng beân trong boä ñieàu khieån. Ngoõ xuaát cuûa khoái luaän lyù (logic block) laø nhöõng tín hieäu ñieàu khieån maø nhöõng tín hieäu ñieàu khieån naøy trôû thaønh nhöõng ngoõ nhaäp cuûa khoái keá tieáp. Traïng thaùi cuûa nhöõng flip-flops ñöa ra nhöõng tín hieäu ñieàu khieån khaùc nhau.
Sô ñoà caáu truùc boä ñieàu khieån cuûa CPU
Hình 30.
Nhö moâ taû trong sô ñoà taát caû nhöõng traïng thaùi ñoàng boä vôùi xung clock vaø nhöõng ngoõ xuaát goùp phaàn ñöa ra nhöõng tín hieäu ñieàu khieån hoaëc kích hoaït nhöõng flip-flop. Trong sô ñoà naøy traïng thaùi i coù ñieàu kieän kích hoaït bôûi chính noù hoaëc bôûi traïng thaùi k. Traïng thaùi i coù ñieàu kieän kích hoaït traïng thaùi j vaø traïng thaùi k luoân luoân ñöôïc kích hoaït sau thôøi gian xung clock maø traïng thaùi j ñaõ kích hoaït. Tín hieäu ñieàu khieån csx thì luoân luoân phaùt ra sau khi traïng thaùi k ñöôïc kích hoaït hoaëc khi traïng thaùi i ñöôïc kích hoaït vaø ñieàu kieän chaéc chaén laø ñuôïc chöùa ñöïng treân nhöõng ngoõ nhaäp a, b vaø c. Tín hieäu ñieàu khieån csy trôû thaønh kích hoaït khi tín hieäu ôû trong traïng thaùi j vaø ñieàu kieän chaéc chaén ñöôïc chöùa trong ngoõ nhaäp d vaø e.
Khai baùo ENTITY cuûa boä ñieàu khieå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,
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;
Caùc traïng thaùi cuûa boä ñieàu khieån
Traïng thaù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;
Moâ taû phaàn cöùng cuûa khoái S1
Hình 31.
Trong traïng thaùi 1 baét ñaàu ñaët döõ lieäu pc treân mar_bus vaø truyeàn döõ lieäu naøy vaøo trong mar. Neáu ngoõ nhaäp interrupt tích cöïc thì ngoõ nhaäp pc_reset ñöôïc phaùt ra vaø traû veà ñieàu khieån ñeán traïng thaùi 1. Neáu CPU khoâng ngaét thì traïng thaùi 2 tích cöïc ôû caïnh xuoáng cuûa xung clock. Ngoaøi ra treân caïnh naøy cuûa xung clock, mar nhaän giaù trò môùi. Trong maõ thanh ghi döõ lieäu vaø traïng thaùi ñieàu khieån chuùng ta coù chaéc chaén raèng chuùng ñoàng boä taát caû vôùi caïnh xuoáng cuûa xung clock.
Traïng thaù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;
END IF;
END PROCESS;
Moâ taû phaàn cöùng cuûa khoái S2
Hình 32.
Khi ôû traïng thaùi 2, mar ñaõ nhaän giaù trò môùi ôû trong danh saùch cho noù trong traïng thaùi 1. Noäi dung cuûa boä nhôù ñöa ra trong databus phaûi khôûi taïo trong ir. Muïc ñích chuû yeáu laø tín hieäu ñieàu khieån databus_on_dbus phaùt ra, tín hieäu alu_a ñöôïc tích cöïc vaø caùc ngoõ nhaäp ir ñöôïc cho pheùp. Treân caïnh cuûa xung clock traïng thaùi 3 trôû neân tích cöïc vaø ir seõ coù giaù trò môùi cuûa noù. Maëc duø trong traïng thaùi 2 haøm taêng cuûa pc ñöôïc choïn vì vaäy giaù trò cuûa noù taêng leân trong caïnh xuoáng tieáp theo cuûa xung clock
Traïng thaù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';
ELSE s (4) <= '0';
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;
IF ir_lines (2) = '1' THEN cm_carry_sr <= '1';
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;
Moâ taû phaàn cöùng cuûa khoái S3
Hình 33.
Khi traïng thaùi 3 tích cöïc, traïng thaùi 3 baét ñaàu xöû lyù ñoïc byte tieáp theo töø boä nhôù, trong cuøng thôøi gian ñoù noù kieåm tra soá byte trong chæ thò leänh hieän haønh. Neáu noù laø leänh hai byte thì byte keá tieáp trôû thaønh byte ñòa chæ cuûa noù vaø traïng thaùi 4 ñöôïc kích hoaït ñeå tieáp tuïc thöïc hieän 2 byte leänh. Treân quyeàn khaùc, neáu leänh hieän haønh laø leänh khoâng ñòa chæ vaø khoâng ñoøi hoûi byte 2, thöïc hieän traïng thaùi 3 vaø kích hoaït traïng thaùi 2 ñeå thöïc hieän leänh tieáp theo.
Nhöõng leänh khoâng ñòa chæ (moät byte) thöïc hieän tính toaùn treân thanh ghi vaø nhöõng côø.
- Tín hieäu alu_b ñöôïc kích hoaït vì theá ngoõ ra alu chöùa noäi dung cuûa acc.
- Haøm arith_shift_right cuûa alu ñöôïc choïn noù dòch chuyeån noäi dung cuûa acc sang beân phaûi.
- Ngoõ nhaäp cuûa thanh ghi traïng thaùi thì ñöôïc cho pheùp vì theá nhöõng giaù trò môùi cuûa nhöõng côø ñöôïc phaùt ra bôûi thanh ghi dòch vaø naïp vaøo trong thanh ghi traïng thaùi.
- Ngoõ nhaäp cuûa acc ñöôïc cho pheùp vì theá ñöôïc naïp vaøo thanh ghi naøy vôùi ngoõ ra cuûa thanh ghi dòch.
Traïng thaù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';
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;
END IF;
increment_pc <= '1';
END IF; --s (4)
END IF; --clk
END PROCESS;
Moâ taû phaàn cöùng cuûa khoái S4
Hình 34.
Traïng thaùi 4 ñöôïc kích hoaït khi ñòa chæ ñaày ñuû hoaëc ñòa chæ trang ñöôïc thöïc thi. Ñeå chuaån bò ñoïc byte thöù hai cuûa leänh trong traïng thaùi 3, load_offset_mar ñöôïc kích hoaït, byte naøy seõ phaùt xung clock trong mar treân caïnh xuoáng tieáp theo cuûa xung clock. Neáu leänh ñöôïc thöïc thi laø leänh ñòa chæ ñaày ñuû thì soá trang ir chuyeån sang traïng thaùi saún saøng ôû ngoõ nhaäp cuûa trang mar trong thanh ghi vôùi xung keá tieáp. Neáu leänh ñöôïc thöïc thi laø jsr hoaëc bra thì thanh ghi mar_page giöõ laïi giaù trò hieän haønh. Bôûi vì ñaây laø nhöõng leänh ñòa chæ duy nhaát trong trang hieän haønh.
Traïng thaùi 4 kích hoaït traïng thaùi 5 hoaëc traïng thaùi 6 cho nhöõng caùch trình baøy ñòa chæ tröïc tieáp hoaëc giaùn tieáp cuûa nhöõng leänh ñòa chæ ñaày ñuû vaø noù kích hoaït traïng thaùi 7 hoaëc traïng thaùi 9 bôûi nhöõng leänh jsr hoaëc bra.
Traïng thaù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;
Moâ taû phaàn cöùng cuûa khoái S5
Hình 35.
Caïnh xuoáng cuûa xung clock kích hoaït traïng thaùi 5 ngoaøi ra noù cuõng naïp ñòa chæ ñaày ñuû vaøo mar. Trong traïng thaùi naøy vò trí con troû cuûa boä nhôù chuyeån ñeán mar ñoïc döõ lieäu treân databus vaø taïo giaù trò treân ngoõ nhaäp cuûa thanh ghi mar_offset. Söï kích hoaït load_offset_mar laø nguyeân nhaân ñeå mar naïp nhöõng byte töø boä nhôù treân caïnh ñoái cuûa xung clock. Traïng thaùi 5 kích hoaït traïng thaùi 6 maø traïng thaùi naøy thì gioáng nhö ñöôïc kích hoaït bôûi traïng thaùi 4 neáu ñòa chæ tröïc tieáp ñöôïc söû duïng.
Traïng thaùi 6
Traïng thaùi 6 ñöôïc kích hoaït khi nhöõng leänh thöïc thi laø jmp, sta, lda, and, add hoaëc sub. Trong traïng thaùi naøy mar chöùa nhöõng toaùn haïng ñòa chæ ñaày ñuû.
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';
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;
Moâ taû phaàn cöùng cuûa khoái S6
Hình 36.
Traïng thaù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 <= '1';
s (8) <= '1'; --goto 8
END IF;
END IF;
END PROCESS;
Moâ taû phaàn cöùng cuûa khoái S7
Hình 37.
ÔÛ traïng thaùi 7 tieáp tuïc thöïc thi leänh jsr. Trong traïng thaùi naøy ghi noäi dung cuûa pc vaøo thuû tuïc mar vaø trong cuøng thôøi gian naøy ñòa chæ ñaàu cuûa thuû tuïc chuyeån vaøo thanh ghi pc.
Traïng thaù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;
Moâ taû phaàn cöùng cuûa khoái S8
Hình 38.
Sau traïng thaùi 7 treân caïnh xuoáng cuûa xung clock thì traïng thaùi 8 tích cöïc ñeå thöïc thi leänh jsr. Trong traïng thaùi naøy pc chöùa vò trí ñaàu tieân cuûa thuû tuïc. Trong traïng thaùi 8 naïp tín hieäu increment_pc vaø kích hoaït traïng thaùi 1 ñeå naïp leänh ñaàu tieân cuûa thuû tuïc.
Traïng thaù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;
Moâ taû phaàn cöùng cuûa khoái S9
Hình 39.
Khi traïng thaùi 4 kích hoaït vaø moät leänh reõ nhaùnh baét ñaàu thöïc thi khi ñoù traïng thaùi 9 ñöôïc kích hoaït, ñòa chæ leänh reõ nhaùnh ôû trong thanh ghi mar. Traïng thaùi 9 naïp mar vaøo trong pc neáu phuø hôïp thì tìm giöõa bit 3 vaø bit 0 cuûa leänh reõ nhaùnh vaø nhöõng bit thanh ghi traïng thaùi. Neáu ñieàu kieän reõ nhaùnh khoâng thoaû maõn thì pc giöõ laïi giaù trò cuûa noù.Trong moät soá tröôøng hôïp boä ñieàu khieån traû veà traïng thaùi 1 ñeå thöïc hieän leänh keá tieáp
Keát hôïp caùc hình töø hình 28 ñeán 36 thaønh moâ hình hoaït ñoäng cuûa khoái ñieàu khieån nhö sau(xem theâm [2])
Hình 40.
Trong hình caùc khoái hình vuoâng 1, 2, 3, 4, 5, 6, 7, 8, 9 laø nhöõng khoái ñieàu khieån traïng thaùi töø 1 ñeán 9.
Nhöõng khoái hình troøn lgs1, lgs2, lgs3, lgs4 laø nhöõng khoái luaän lyù laøm nhieäm vuï choïn löïa ñieàu kieän thöïc hieän traïng thaùi tieáp theo.
Phaàn 3 MOÂ PHOÛNG
Phaàn I giôùi thieäu toång quaùt veà caùch söû duïng phaàn meàm MaxPlusII. Phaàn II trình baøy sô ñoà chaân caùc khoái ALU, SHU vaø khoái CONTRONLER baèng chíp FLEX10K vaø caùc giao dieän moâ phoûng cuûa caùc khoái naøy.
I. MAX+PLUSII
1. Toång Quaùt
Trong quaù trình thieát keá vaø toång hôïp maïch moät yeâu caàu ñaët ra cuoái cuøng laø kieåm tra ñöôïc maïch ñaõ thieát keá coù keát quaû ñuùng theo yeâu caàu. Trong caùc phaàm meàm veà toång hôïp vaø kieåm tra maïch coù phaàn meàm Max+plusII laø moät trong nhöõng phaàn meàm raát maïnh veà toång hôïp vaø kieåm tra maïch. Sau ñaây laø phaàn trình baøy caùch söû duïng veà phaàn meàm naøy:
2. Caùch söû duïng Max+PlusII
Khôûi ñoäng phaàn meàm Max+plusII.
Sau khi phaàn meàm Max+plusII ñaõ ñöôïc caøi ñaët ta tieán haønh khôûi ñoäng nhö sau:
Böôùc 1 : Baám vaøo bieåu töôïng Max+PlusII
Sau khi baám vaøo bieåu töôïng ñeå khôûi ñoäng maøn hình Max+PlusII hieän ra
Trình baøy cuûa maøn hình max+plus2 goàm caùc thaønh phaàn sau:
- Doøng 1: Thanh toolbar duøng hieån thò thö muïc vaø taäp tin hieän haønh.
- Doøng 2: Goàm 5 muïc chính:
+ Max+plus2
+ File
+ Assign
+ Option
+ Help
- Doøng 3: caùc bieåu töôïng söû duïng tröïc tieáp caùc öùng duïng cuûa Max+plus2
- Doøng 4: Khu vöïc trình baøy caùc loaïi text.
Böôùc 2 : Caùc thaønh phaàn chính trong caùc muïc doøng 2 nhö sau :
a- Muïc Max+plusII
MaxplusII ñöa ra nhieàu trôï giuùp. Heä thoáng bao goàm 11 nhoùm öùng duïng toång hôïp duøng ñeå thieát keá ñeán thöïc thi chöông trình.
Coù 11 phaàn:
Hierarchy Display: trình baøy caùc phaân caáp sau khi thieát keá vaø dòch.
Graphic editor: cho cheá ñoä veõ maïch thieát keá vaø kieåm tra maïch theo daïng caáu truùc
Symbol Editor: ñöa ra moät thöïc theå (entity) sau khi ñaõ dòch chöông trình.
Text Editor: vaøo soaïn thaûo chöông trình
Waveform Editor: soaïn thaûo vaø kieåm tra maïch cuûa chöông trình
Floorplan Editor: soaïn thaûo vaø thieát keá theo daïng Floorplan
Compiler: dòch chöông trình
Simulation: thöïc hieän moâ phoûng
Timing Analyzer: phaân tích thôøi gian cuûa chíp
Programmer: xaùc ñònh cuûa thieát bò phaàn cöùng
Message processor: maøn hình thoâng baùo vaø aùnh xaï ñeán caùc loãi khi dòch.
b- Muïc file:
Muïc file goàm coù 7 thaønh phaàn
c- Muïc Assign
Muïc Assign goàm coù 16 thaønh phaàn
d- Muïc Options goàm caùc thaønh phaàn :
e- Muïc Help: Duøng trôï giuùp trong phaàn meàm .
2.1. Thöïc hieän soaïn thaûo vaø dòch moät chöông trình
Ñeå thöïc hieän soaïn thaûo vaø dòch 1 chöông trình ta thöïc hieän theo trình töï sau:
Ñeå soaïn thaûo moät chöông trình toång hôïp phaàn cöùng :
Vaøo File \New\Text editor file
Khi naøy maøn hình soaïn thaûo xuaát hieän, vieäc soaïn thaûo trong moâi tröôøng naøy gioáng nhö trình soaïn thaûo winword. Sau khi soaïn thaûo xong ghi taäp tin vaø ñaët teân taäp tin coù phaàn môû roäng laø .vhd.
Ñeå dòch moät chöông trình ñaõ ñöôïc soaïn thaûo ta theo caùc böôùc sau:
Xaùc ñònh taäp tin hieän taïi caàn dòch baèng caùch thöc hieän:
Choïn File\Project\ set project to current file.
Sau khi ñaõ choïn xong theo yeâu caàu treân ta tieán haønh dòch:
Choïn muïc MAX+plus \ COMPILER khi naøy cöûa soå cuûa COMPILER seõ xuaát hieän nhö hình sau
Maøn hình Compiler hieån thò nhieàu muïc khaùc nhau, ñoù laø nhöõng boä phaän cuûa nhöõng quaù trình dòch vaø toång hôïp maïch.
Choïn nuùt Start ñeå baét ñaàu quaù trình dòch. Trong quùa trình dòch caùc muïc duyeät qua, neáu thaønh coâng thì caùc muïc seõ ñöôïc duyeät heát vaø hieån thò moät thoâng baùo veà caùc thoâng tin trong quaù trình dòch.
Maøn hình sau seõ thoâng baùo khi quaù trình dòch thaønh coâng.
2.2. Thöïc hieän kieåm tra keát quaû sau khi ñaõ toång hôïp maïch
Sau khi dòch xong chöông trình toång hôïp maïch tieán haønh kieåm tra keát quaû cuûa maïch ñöôïc toång hôïp .Vieäc kieåm tra ñöôïc tieán haønh nhö sau:
a. Soaïn thaûo moät taäp tin file waveform editor file.
Choïn File\New \Waveform editor file.
Khi naøy maøn hình soaïn Waveform editor file xuaát hieän
Ñeå ñöa caùc thaønh phaàn caàn kieåm tra cuûa maïch ta thöïc hieän choïn:
Choïn muïc Node \enter Nodes from SNF khi ñoù maøn hình cuûa caùc thaønh phaàn maïch seõ xuaát hieän.
Ta tieán haønh choïn nuùt List vaø ñöa caùc bieán cuûa Node sang maøn hình Waveform sau ñoù choïn nuùt OK.
Sau khi ñaõ choïn xong caùc bieán trong maøn hình Waveform Editor ta löu (ghi) teân taäp tin naøy vôùi phaàn môû roäng .scf.
b. Tieán haønh moâ phoûng keát quaû treân maøn hình Waveform Editor.
Khi coù ñöôïc taäp tin waveform ñaõ ñöôïc nhaäp ôû treân thì coù theå moâ phoûng baûng thieát keá vaø xaùc ñònh noù laøm vieäc ñuùng hay sai.
Môû baûng moâ phoûng baèng caùch choïn Max+plus II \ Simulator seõ nhìn thaáy cöûa soå baûng moâ phoûng ñöôïc môû ra.
Choïn Start ñeå baét ñaàu thöïc hieän moâ phoûng. Baûng moâ phoûng seõ hoaøn thaønh. Vaø ñöa ra keát quaû trong baûng waveform editor. Keát quaû ñuùng hay khoâng phuï thuoäc vaøo chöông trình cuûa ngöôøi thieát keá toång hôïp maïch.
Taát caû caùc böôùc treân coù theå ñöôïc thöïc hieän ñöôïc nhieàu laàn cho ñeán khi naøo ñaùp öùng ñuùng yeâu caàu cuûa ngöôøi thieát keá vaø toång hôïp maïch.
Trong Max+plusII coù raát nhieàu caùc chöùc naêng, ôû ñaây chæ trình baøy moät thao taùc ñeå phuïc vuï caùc coâng vieäc moâ phoûng trong luaän vaên naøy.
2.3. Thoaùt khoûi Max+plusII
Choïn File \Exit MaxplusII
II. MAØN HÌNH KHI MOÂ PHOÛNG
1. Khoái luaän lyù soá hoïc ALU
Hình 39.
Hình 39 moâ phoûng caùc tính hieäu ngoõ vaøo vaø ngoõ ra cuûa khoái ALU. Trong khoái alu thöïc hieän caùc leänh coäng, tröø, and, not, naïp tín hieäu side_a, naïp tín hieäu side_b.
Caùc tín hieäu ngoõ vaøo laø alu_add, alu_sub, alu_and, alu_not, alu_a, alu_b, in_flags2, in_flags3, side_a, side_b, caùc tín hieäu ra laø z_out, out_flags.
Khi tín hieäu alu_add ñöôïc kích leân thì noù thöïc hieän pheùp coäng hai giaù trò side_a vaø side_b keát quaû xuaát ra ôû z_out vaø caùc côø xuaát ra ôû out_flags trong leänh coäng neáu tín hieäu in_flags2 khoâng kích nghóa laø khoâng coù giaù trò thì pheùp coäng chæ coäng giaù trò trong side_a vôùi side_b coøn neáu coù in_flags2 thì noù coäng theâm giaù trò cuûa in_flags2.
Trong pheùp coäng ngoõ ra out_flags coù thöù töï caùc côø nhö sau v, c, n, z côø v ñöôïc baät leân khi daáu cuûa side_a, side_b cuøng daáu vaø daáu cuûa keát quaû z_out khaùc vôùi daáu cuûa side_a (caùc bit daáu chính laø bit thöù 7), côø c baät leân khi keát quaû z_out lôùn 255, côø n baèng vôùi bit 7 cuûa z_out, côø z baät leân khi keát quaû baèng 0.
Trong pheùp tröø cuõng töông töï nhö pheùp coäng, chæ khaùc caùch kieåm tra côø, côø v baät leân khi daáu cuûa side khaùc vôùi daáu side_b vaø daáu keát quaû cuøng vôùi daáu cuûa side_a, côø c baät leân khi keát quaû aâm coøn côø n vaø z thì gioáng nhö pheùp coäng.
Pheùp alu_and thì thöïc hieän pheùp and giöõa side_a vôùi side_b, côø v baèng vôùi tín hieäu vaøo in_flags3, côø c baèng tín hieäu vaøo in_flags2 côø n vaø côø z thì tuyø vaøo keát quaû ra z_out.
Pheùp alu_not thì thöïc hieän pheùp phuû ñònh cuûa tín hieäu vaøo side_a caùc côø thì gioáng nhö pheùp alu_and.
Pheùp alu_a thì thöïc hieän naïp giaù trò cuûa side_a vaøo caùc côø cuõng gioáng nhö pheùp alu_and.
Pheùp alu_a thì thöïc hieän naïp giaù trò cuûa side_b vaøo caùc côø cuõng gioáng nhö pheùp alu_and.
2. Khoái dòch chuyeån SHU
Hình 41.
Maøn hình moâ phoûng pheùp dòch traùi vaø dòch phaûi cuûa khoái SHU trong phaàn naøy coù tính hieäu vaøo laø arith_shift_left, arith_shift_left, in_flags, alu_side, tín hieäu ra laø obus_side, out_flags
Neáu khoâng coù pheùp dòch thì ngoõ ra obus_side coù giaù trò baèng vôùi ngoõ vaøo alu_side vaø caùc côø ra out_flags gioáng nhö côø vaøo in_flags, neáu dòch traùi thì côø v baät leân khi bit 6 vaø bit 7 cuûa tín hieäu vaøo alu_side khaùc nhau, côø c baät leân khi bit 7 cuûa tín hieäu vaøo alu_side laø 1, côø n baät leân khi bit 7 cuûa ngoõ ra obus_side laø 1, coøn côø z baät leân khi ngoõ ra obus_side laø 0, neáu dòch phaûi thì côø v vaø c ôû ngoõ ra out_flags gioáng nhö côø v vaø c ôû ngoõ vaøo in_flags, coøn côø n vaø z thì gioáng nhö dòch traùi.
3. Khoái ñieàu khieån
Hình 43.
Hình 43 moâ phoûng khoái CONTROL cuûa CPU trong khoái naøy coù 9 traïng thaùi töø s1 ñeán s9
Khi traïng thaùi s1 tích cöïc thì thöïc hieän nhöõng chöùc naêng nhö: pc_on_mar_page_bus, pc_on_mar_offset_bus, load_page_mar, load_offset_mar vaø kieåm tra interrupt neáu interrupt =1 thì noù quay laïi traïng thaùi s1 ngöôïc laïi thì sang traïng thaùi s2.
Khi traïng thaùi s2 ñöôïc tích cöïc thöïc hieän nhöõng chöùc naêng mar_on_adbus, read_mem, databus_on_dbus, alu_a, load_ir, increment_pc, roài chuyeån sang traïng thaùi s3.
Khi traïng thaùi s3 tích cöïc thì thöïc hieän pc_on_mar_page_bus, pc_on_mar_offset_bus, load_page_mar, load_offset_mar neáu bit 7 ñeán 4 cuûa ir_lines khoâng baèng “1110” thì chuyeån sang traïng thaùi s4. Neáu bit 7 ñeán 4 cuûa ir_lines baèng “1110” thì kieåm tra bit 1 cuûa ir_lines neáu = 1 thì thöïc hieän alu_not neáu = 0 thì thöïc hieän alu_b, neáu bit 3 ñeán 0 cuûa ir_lines = “1000” thì thöïc hieän arith_shift_left, neáu bit 3 ñeán bit 0 baèng “1001” thì thöïc hieän arith_shift_right, neáu bit 3 baèng 1 hoaëc bit 1 baèng 1 thì thöïc hieän load_sr, load_ac, neáu bit 2 baèng 1 thì thöïc hieän cm_carry_sr, neáu bit 3 cuûa ir_lines baèng 0 vaø bit 0 cuûa ir_lines baèng 1 thì thöïc hieän zero_ac roài quay veà traïng thaùi s2.
Khi s4 ñöôïc kích hoaït thì thöïc hieän mar_on_adbus, read_mem, databus_on_dbus, dbus_on_mar_offset_bus, load_offset_mar, kieåm tra bit 7 ñeán bit 6 cuûa cuûa ir_lines neáu khoâng baèng “11” thì thöïc hieän ir_on_mar_page_bus, load_page_mar vaø kieåm tra tieáp bit 4 cuûa ir_lines neáu baèng 1 thì thì chuyeån sang traïng thaùi s5 ngöôïc laïi thì chuyeån sang traïng thaùi s6, neáu bit 7 ñeán bit 6 cuûa ir_lines baèng “11” thì kieåm tra tieáp bit 5 cuûa ir_lines neáu baèng 0 thì chuyeån sang traïng thaùi s7 neáu baèng 1 thì chuyeån sang traïng thaùi s9, roài thöïc hieän increment_pc.
Trong traïng thaùi s5 thöïc hieän mar_on_adbus, read_mem, databus_on_dbus, dbus_on_mar_offset_bus, load_offset_mar roài chuyeån sang traïng thaùi s6.
ÔÛ traïng thaùi s6 kieåm tra bit 7 ñeán bit 5 cuûa ir_lines neáu baèng “100” thì thöïc hieän load_page_pc, load_offset_pc roài quay veà traïng thaùi s2, neáu baèng “101” thì thöïc hieän mar_on_adbus, alu_b, obus_on_dbus, dbus_on_databus, write_mem roài quay veà traïng thaùi s1, neáu bit 7 cuûa ir_lines baèng 0 thì thöïc hieän read_mem, mar_on_adbus, databus_on_dbus vaø kieåm tra bit 6 ñeán bit 5 cuûa ir_lines neáu baèng “00” thì thöïc hieän alu_a, neáu baèng “01” thì thöïc hieän alu_and, neáu baèng “10” thì thöïc hieän alu_add, neáu baèng “11” thì thöïc hieän alu_sub, thöïc hieän tieáp load_sr, load_ac roài quay veà traïng thaùi s1.
Traïng thaùi s7 thöïc hieän mar_on_adbus, pc_offset_on_dbus, dbus_on_databus, write_mem, load_offset_pc roài chuyeån sang traïng thaùi s8.
Traïng thaùi s8 thöïc hieän increment_pc roài quay laïi traïng thaùi s1.
ÔÛ traïng thaùi s9 neáu bit 3 ñeán bit 0 cuûa status vaø cuûa ir_lines khaùc “0000” thì thöïc hieän load_offset_pc roài quay veà traïng thaùi s1.
4. Sô ñoà chaân CPU
Sô ñoà chaân cuûa CPU söû duïng chíp EPF10K10LC84-3 cuûa hoï FLEX10K nhö hình 44.
Hình 44.
Trong sô ñoà chaân (hình 44) cuûa CPU ngoõ vaøo noái caùc chaân 1, 2, 5, 6, 7, 8, 19, 21, 25, 38, 39, 42, 43, 44, 58, 59, 60, 62, 64, 65, 66, 67, 69, 72, 73, 84.
Ngoõ ra noái caùc chaân 10, 22, 23, 24, 28, 29, 30, 36.
Caùc chaân 4, 12, 13, 14, 15, 20, 26, 31, 32, 33, 34, 40, 41, 45, 46, 55, 56, 57, 63, 68, 74, 75, 76, 77, 82 laø nhöõng chaân daønh rieâng khoâng ñöôïc söû duïng. Nhöõng chaân coøn laïi laø nhöõng chaân roãng khoâng coù tín hieäu.
5. Maøn hình moâ phoûng leänh
Hình 45 maøn hình moâ phoûng leänh coäng cuûa CPU.
Phaàn 4 KEÁT LUAÄN KIEÁN NGHÒ
I. NHAÄN XEÙT CHUNG
a. Nhöõng maët ñaït ñöôïc
Ñaõ thöïc hieän ñöôïc thieát keá CPU baèng ngoân ngöõ VHDL
Ñaõ moâ phoûng ñöôïc hoaït ñoäng cuûa caùc khoái ALU, SHU, CONTROLER döïa treân chíp FLEX10K
CPU thöïc hieän nhöõng leänh coäng, leänh tröø, leänh and, leänh not, leänh naïp, leänh dòch traùi bit, dòch phaûi bit, vaø hoaït ñoäng khoái ñieàu khieån cuûa CPU.
b. Nhöõng vaán ñeà toàn taïi
Ñeà taøi naøy chæ döøng laïi ôû möùc moâ phoûng moät soá leänh döïa treân phaàn meàm MAX+PLUSII.
CPU chæ coù moät soá leänh thoâng duïng nhö: coäng, tröø, and, not, dòch phaûi, dòch traùi, leänh naïp . Chöa coù caùc leänh coù caùc leänh nhaûy, leänh goïi chöông trình con, leänh reõ nhaùnh, leänh xoaù.
II. HÖÔÙNG PHAÙT TRIEÅN
Ñeà taøi thieát keá CPU duøng ngoân ngöõ VHDL khoâng chæ ñöôïc öùng duïng cho vieäc thieát keá CPU maø coøn coù theå öùng duïng noù ñeå thieát keá nhöõng con vi xöû lyù, nhöõng vi maïch ñieän töû tích hôïp vaø nhöõng heä thoáng maïch ñieän phöùc taïp khaùc .v.v.
III. ÑAÙNH GIAÙ
Maëc duø ñeà taøi naøy ñaõ ñaït ñöôïc muïc ñích coâng vieäc ñeà ra nhöng vì ñieàu kieän khoâng cho pheùp, neân trong ñeà taøi naøy khoâng theå thöïc hieän vieäc chaïy tröïc tieáp treân moät thieát bò phaàn cöùng cuï theå, maø chæ coù theå thöïc hieän chaïy moâ phoûng treân phaàn meàm MAXPLUS II ñeå kieåm tra nhöõng tín hieäu ñaàu vaøo vaø daàu ra cuûa moät soá leänh.
IV. KEÁT LUAÄN
Höôùng öùng duïng cuûa ñeà taøi: Ñeà taøi naøy coù theå ñöôïc öùng duïng trong coâng nghieäp maùy tính ñeå taïo ra caùc chíp tích hôïp, trong coâng nghieäp ñieän – ñieän töû ñeå cheá taïo caùc maïch tích hôïp duøng trong caùc thieát bò ñieän töû, ñieän töû vieãn thoâng nhö laø tivi, radio, ñieän thoaïi.v.v. Ngoaøi ra noù coøn öùng duïng trong coâng nghieäp cheá taïo oâtoâ, haøng khoâng .v.v.
Coâng ngheä thoâng tin vaø söï phaùt trieån maïnh meõ cuûa noù hieän nay treân phaïm vi toaøn caàu vaø ngay chính taïi nöôùc ta ñaõ ñaët ra nhöõng nhu caàu phaùt trieån cuûa khoa hoïc vaø xaõ hoäi. Ñeà taøi naøy ñöôïc xaây döïng nhaèm ñaùp öùng nhu caàu phaùt trieån cuûa khoa hoïc trong vieäc thieát keá vaø cheá taïo nhöõng thieát bò phaàn cöùng. Vieäc tìm hieåu aùp duïng kyõ thuaät môùi nhaèm thöû nghieäm vaø tieáp thu kieán thöùc ñeå coù theå hieåu bieát hôn veà quaù trình tin hoïc hoaù ôû nöôùc ta töø ñoù coù ñònh höôùng hoïc taäp vaø laøm vieäc phuø hôïp.
Döïa treân nhöõng maët ñaït ñöôïc vaø chöa ñaït ñöôïc cuûa ñeà taøi, chuùng em hy voïng raèng seõ nhaän ñöôïc nhieàu yù kieán ñoùng goùp nhaän xeùt ñeå coù ñieàu kieän phaùt trieån öùng duïng ñeà taøi naøy cho nhöõng öùng duïng thöïc teá.
Phaàn 5 TAØI LIEÄU THAM KHAÛO
1. VHDL Made Easy
David Pellerin – Douglas Taylor
2. VHDL ANALYSIS AND MODELING OF DIGITAL SYSTEMS
Zainalabedin Navabi
3. AVERILOG HDL PRIMER
J.BHASKER
4. Giaùo trình Ngoân Ngöõ VHDL ñeå thieát keá vi maïch
Nguyeãn Quoác Tuaán – Nhaø xuaát baûn ÑHQG TPHCM
5. Kyõ Thuaät Soá
Nguyeãn Thuyù Vaân – Nhaø xuaát baûn khoa hoïc kyõ thuaät
6. Kyõ Thuaät Vi Xöû Lyù
Vaên Theá Minh – Nhaø xuaát baûn giaùo duïc
7. www.gmvhdl.com
8. www.vcc.com
9. www.altera.com
10. www.vhdl.org
Các file đính kèm theo tài liệu này:
- Thiết kế CPU dùng ngôn ngữ VHDL.doc