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,
Trang 1LỜ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
Huỳnh Thị Mộng Tuyền
Trang 2GIỚI THIỆU
I MỤC ĐÍCH
Luận văn này thực hiện một số công việc như sau
- Thiết kế CPU bằng ngôn ngữ VHDL
- Thực hiện mô phỏng chương trình trên chíp FLEX10K của hãng Altera
II BỐ CỤC
- Tìm hiểu một số khái niệm của của ngôn ngữ VHDL và mối quan hệ
giữa VHDL với phần cứng
- Công nghệ FPGA: tìm hiểu một số thiết bị FPGAs
- Thiết kế CPU: thực hiện mô tả nhiệm vụ của CPU, tập lệnh của CPU, chế độ địa chỉ lệnh của CPU, hành vi của CPU, các thành phần của CPU và viết chương trình để thực hiện một số lệnh của CPU
Trang 3MỤ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
Trang 42.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
Trang 52 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
Trang 6Phần 1 VHDL VÀ FPGA
Phần I giới thiệu ngôn ngữ VHDL và một số đặc điểm chính của nó Phần II trình bày các khái niệm cơ bản về khối, thực thể, kiến trúc và gói của ngôn ngữ VHDL Phần III trình bày mối quan hệ mật thiết giữa ngôn ngữ VHDL và phần cứng Phần IV giới thiệu về công nghệ FPGA để xây dựng các mạch tích hợp
I GIỚI THIỆU
1 Giới thiệu về VHDL
VHDL (VHDL là từ viết tắt của Very Hight Speed Integrated Circuit Hardware Description Language) là một ngôn ngữ lập trình đã được thiết kế theo cách mô tả hành vi của hệ thống số.VHDL được phát triển vào những
1980
VHDL có nhiều đặc điểm thích hợp mô tả hành vi của các thành phần thiết bị điện tử từ những cổng luận lý đơn giản đến những bộ vi xử lý phức tạp Đặc điểm của VHDL là cho phép mô tả chính xác hành vi của những mạch điện tử
Cũng giống như ngôn ngữ Pascal, C và C++, VHDL bao gồm những đặc điểm hữu ích cho kỹ thuật thiết kế những cấu trúc và trình bày những đặc điểm dữ liệu Không giống như những ngôn ngữ lập trình khác, VHDL
cung cấp những đặc điểm cho phép để mô tả những sự kiện xảy ra (xem[1])
2 Các đặc điểm của VHDL
Một số đặc điểm chính của ngôn ngữ VHDL (xem[4])
* Đặc điểm tổng quát: VHDL có thể được sử dụng để lập tài liệu
thiết kế, thiết kế mức độ cao, mô phỏng tổng hợp và kiểm tra phần cứng VHDL cho phép mô tả phần cứng từ mức hệ thống đến mức cổng, hỗ trợ tính đồng thời nghĩa là từ các hợp phần nhỏ đến lớn hoạt động tại một thời điểm
* Hỗ trợ phân cấp thiết kế: Đây là đặc tính thiết yếu của ngôn ngữ
phần cứng đa cấp Thiết kế chứa một mô tả giao diện và một số phần độc lập để mô tả hoạt động Hoạt động của hệ thống có thể được đặc tả dựa trên chức năng hoặc dựa trên cấu trúc của những phần nhỏ hơn của chúng Đặc tả cấu trúc các hợp phần có thể được thực hiện ở tất cả các cấp thiết kế
* Có thư viện hỗ trợ: Ngôn ngữ cung cấp cơ chế để truy cập đến nhiều thư viện khác nhau Thư viện không chỉ chứa đặc tả giao diện của
Trang 7thiết kế, mà còn chứa một số đặc tả của hệ thống Các đặc tả và các mẫu có thể dựa vào thư viện sau khi được dịch bởi chương trình dịch
* Có lệnh tuần tự: Khi người thiết kế phân chia hệ thống thành những hợp phần đồng thời hay phần con, tiếp đó người thiết kế có thể mô tả chi tiết hoạt động bên trong bằng những cấu trúc ngôn ngữ lập trình tuần tự như các lệnh case, if – then – else, loop,…Các lệnh tuần tự cung cấp phương pháp đơn giản để tạo ra các hợp phần phần cứng dựa trên chức năng của chúng
* Thiết kế tương thích chung: Để thiết kế tổng quát ngôn ngữ cho
phép người thiết kế đặt cấu hình mô tả hợp phần có thông số chung trong thiết kế Mô tả tương thích chung có thể thay đổi kích thước đặc tính vật lý, định thời đặc tính tải, và môi trường hoạt động của thiết kế
* Khai báo kiểu và cách dùng: Ngôn ngữ VHDL cho phép mô tả các kiểu bit, Boolean, integer, floating, kiểu liệt kê, kiểu dãy, bản ghi Ngoài ra còn hỗ trợ các kiểu do người sử dụng định nghĩa Ngôn ngữ VHDL cũng cho phép định nghĩa lại các toán tử của ngôn ngữ bởi người sử dụng
* Sử dụng các chương trình con: Ngôn ngữ VHDL cho phép định
nghĩa các hàm, thủ tục, các chuơng trình con có thể sử dụng để biến đổi các kiểu, định nghĩa đơn vị luận lý, định nghĩa lại toán hạng, định nghĩa toán tử mới, và các ứng dụng khác trong ngôn ngữ lập trình
* Điều khiển định thời: Ngôn ngữ VHDL là cho phép đặc tả định thời
ở tất cả các cấp như là: đặt giá trị của tín hiệu, thời gian trễ, định nghĩa tín hiệu đồng bộ, đặt độ rộng xung …
II CÁC KHÁI NIỆM CƠ BẢN (xem[1])
1 Các khối
VHDL được mô tả thành những khối, khối đầu tiên là đơn vị thiết kế Có 5 loại đơn vị thiết kế được phân thành hai phần là phần mô tả kiến trúc phần cứng và phần mềm
+Phần cứng gồm có: Thực thể (entity), cấu hình (configuration), kiến trúc (architecture)
+Phần mềm gồm có: gói (package) và thân gói (package body)
2 Giới thiệu hai đơn vị thiết kế cơ bản của VHDL
Hai đơn vị thiết kế cơ bản của VHDL là Entity declaration và Architecture body
Trang 8Một Entity là một mô hình sử dụng một khai báo thực thể và ít nhất có
một thực thể kiến trúc Khai báo thực thể là mô tả tổng quát bên ngoài của một thực thể, ví dụ như: tên các tín hiệu input, output Thân của kiến trúc (Architecture body) là đi vào đặc tả bên trong của một thực thể, ví dụ thiết lập sự nối kết liên tục của các thành phần mà đại diện cho cấu trúc của một thực thể, hoặc tập hợp tất cả các phát biểu đồng thời hay liên tục mà đại diện cho sự xử lý của thực thể
-Mô hình của thực thể
Hình 1
Khai báo thực thể là chỉ ra tên của mô hình cần thiết kế và danh sách các cổng giao tiếp Cổng là những tín hiệu mà thực thể dùng để giao tiếp với những mô hình khác trong môi trường tổng quát của nó
-Mô tả chi tiết một thực thể được chỉ ra bởi kiến trúc của thực thể như sau
Ví dụ: mô hình cho thực thể mach_cong, ở dạng cấu trúc (structural):
Architecture arc_mach_cong of mach_cong is
Sự trừu tượng phần cứng
của một hệ thống số
Khai báo thực thể
Thân kiến trúc
Trang 9End arc_mach_cong;
Thực thể kiến trúc có tên là “arc_mach_cong” Dùng những thành
phần có sẵn của ngôn ngữ VHDL như cổng And, Xor để nối kết chúng lại
với nhau tạo thành một cấu trúc cho thực thể
3 Gói
Trong môi trường thiết kế phần cứng cần phải nhóm các hợp phần hay các tiện ích dùng cho việc mô tả các hợp phần Những cấu trúc VHDL để mô tả các tiện ích và môi trường là các định nghĩa kiểu và chương trình con Những hợp phần và tiện ích như vậy có thể được nhóm lại bằng cách sử dụng khối Như ví dụ sau, cách khai báo khối chứa các hợp phần và tiện ích có thể tham khảo được từ các thực thể và các kiến trúc
Cú pháp: Package tên của gói is
Khai báo các thành phần của gói
End tên của gói ;
Trong phần thân khối chứa những định nghĩa chương trình con và các
tiện ích được dùng bởi chương trình con
Package body tên của gói is
Khai báo các thành phần trong thân của gói
End tên của gói ;
Ngôn ngữ VHDL cho phép sử dụng các thư viện và liên kết các hợp phần phụ của thiết kế với các phần tử của thư viện khác
III MỐI QUAN HỆ GIỮA NGÔN NGỮ VHDL VÀ PHẦN CỨNG
Trong phần này trình bày hai vấn đề là các thành phần của ngôn ngữ VHDL để thực hiện việc mô tả phần cứng và sự thể hiện phần cứng bằng ngôn ngữ VHDL
Phần 1 trình bày các kiểu của VHDL, các đối tượng của VHDL, các toán tử, các lệnh tuần tự
Phần 2 các vấn đề về mạch tổ hợp và mạch đồng bộ được trình bày
1 Các thành phần của VHDL để mô tả phần cứng
1.1 Các kiểu của VHDL (xem [2, 4])
Trong ngôn ngữ VHDL có các kiểu sau:
- Kiểu liệt kê được định nghĩa bằng cách liệt kê danh sách các giá trị, mỗi thành phần của danh sách là một tên dành riêng hoặc là một ký tự số
Trang 10Ví dụ: Type STD_LOGIC is (‘U’,’X’,’0’,’1’,’H’,’-’);
Type STATE_TYPE is (HALT, READY, RUN, ERROR);
- Kiểu nguyên có hai loại:
+ Kiểu nguyên được định nghĩa như vùng con của kiểu tổng quát đã được cài sẵn và các giới hạn phải được khai báo
Type BYTE_INT is range -128 to 127;
+ Kiểu nguyên được định nghĩa bởi người sử dụng
Signal MY_INT: MY_INTEGER;
- Kiểu mảng dùng để định nghĩa một tập chỉ số
- Kiểu record dùng để định nghĩa tập các kiểu khác nhau
Type ITEM_TYPE is record
1.2 Các đối tượng của ngôn ngữ VHDL (xem[1])
Trong ngôn ngữ VDHL có một số đối tượng như hằng, biến, tín hiệu
- Hằng: là giá trị được xác định trong suốt thời gian khởi tạo, các giá trị này không đổi trong suốt quá trình thực thi
- Biến: Giá trị của biến được cập nhật tức thời khi được gán
Có 2 loại biến, biến cục bộ và biến toàn cục
+ Biến cục bộ có thể được khai báo trong các chương trình con hoặc trong các quá trình và quan trọng là trong quá trình tổng hợp nơi mà chúng có thể suy ra các phần tử nhớ
+ VHDL đồng thời ràng buộc thu hẹp sự sử dụng các biến toàn cục đối với sự miêu tả cấp hệ thống
-Tín hiệu:
Trang 11Trên board mạch in hoặc các mạch tích hợp thông tin được lan truyền xuyên qua các dây dẫn Trong ngôn ngữ VHDL các dây dẫn này gọi là “tín
hiệu”
Các tín hiệu hiện hữu từ khi bắt đầu đến khi kết thúc của quá trình tái tạo Không tạo ra tín hiệu mới hoặc không nối kết vật lý với các tín hiệu được cho phép trong thời gian tái tạo
Các tín hiệu không có chứa đựng như các biến Các tín hiệu như là những đối tượng và có các kết nối được cố định với các tín hiệu khác
1.3.1 Các toán tử luận lý: or, and, nor, nand, xor, nor nhận các toán hạng kiểu: bit, boolean, vector
Ví dụ : Signal s, x,y: bit_vector(1 downto 0);
1.3.2 Các toán tử quan hệ: =, >, <, >=, < =
Toán tử quan hệ luôn luôn trả về giá trị boolean được mã hoá ‘0’ hoặc
‘1’ Kết quả là true nếu hai toán hạng có cùng giá trị
Ví dụ: ‘0’< ‘1’ .là true
‘A’ < ‘BC’ là true
‘10’ < ‘101’ là also true
1.3.3 Các toán tử cộng: +, -, &
Các toán tử cộng và trừ được định nghĩa cho các toán hạng số nguyên
Ví dụ: R < = a+b+c+1;
T<= [(a+b) +c) +1];
S< = (a+ b) + (c+2);
1.3.4 Các toán tử dịch: sll, srl, sla, sra, rol, ror
Ví dụ: Signal S, R1, R2, R3, R4, T1, T2, T3, T4: Bit_Vector (1 To 4);
BEGIN
R1 <= ’SLL’(S, 1);
Trang 12T2 <= S (2 TO 4) & ‘0’;
R2 <= ‘ROL’(S, 2);
Ví dụ: SIGNAL R, A:INTEGER –4 TO 3;
R<=-A;
1.3.6 Các toán tử nhân: /, *, mod, rem
Phép chia “/”, phép nhân “*”, lấy phần nguyên “mod”, lấy số dư
“rem” được xem là trong nhóm toán tử nhân
Ví dụ: Signal MEM: NATURAL range 0 to 3;
MEM <= (MEM + 1) mod 4;
1.4.1 Phép gán biến số
Phép gán biến được thực hiện bởi toán tử “:=” và thao tác này xảy ra ngay lập tức khi tính toán Do đó giá trị của biến chỉ thay đổi bởi lệnh gán tiếp theo nếu giá trị mới khác với giá trị cũ
WORD (3 to 4):= “10”;
1.4.2 Phép gán tín hiệu
Phép gán tín hiệu tương tự như phép gán biến nhưng hiệu quả của lệnh chỉ xảy ra sau lệnh đồng bộ Phép gán tín hiệu được thực hiện bởi toán tử “<=”
Ví dụ: signal <= A and B;
1.4.3 Lệnh điều kiện
* Phát biểu if: một phát biểu if bao gồm cả các nhánh elsif và else
ELSIF biểu thức THEN câu lệnh;
ELSE câu lệnh;
END IF;
* Phát biểu case: phát biểu case có thể dùng để thay thế cho phát biểu
if và nhiều phát biểu elsif
Cú pháp: CASE Biểu thức IS
WHEN giá trị hằng=> câu lệnh;
Trang 13WHEN giá trị hằng => câu lệnh;
WHEN OTHERS => câu lệnh;
END CASE;
1.4.4 Lệnh lặp
• Phát biểu lặp: có 2 kiểu phát biểu lặp, đó là vòng lặp for và while
* Vòng lặp For
Cú pháp: For i in giá_trị to/downto giá_trị loop
End loop;
* Vòng lặp while
Cú pháp: loop_label:
WHILE boolean_expression LOOP
Câu lệnh ;
END LOOP loop_label;
2 Sự thể hiện phần cứng bằng VHDL (xem [4])
2.1.1 Các cổng luận ly ù : and, nand, or, xor, nor, not
Ví dụ mô tả cổng nor có 2 cổng vào như sau:
2.1.2 Các toán tử số học: Gồm 4 toán tử cơ bản cộng, trừ, nhân và chia
Các toán tử này thường thực hiện trên kiểu dữ liệu số nguyên (INTEGER). Trong ngôn ngữ VHDL các toán tử ‘+’, ‘-‘, ‘* ‘, ‘/’ đã được định nghĩa trước vì vậy có thể sử dụng mà không cần khai báo
Ví dụ: Signal l1, l2 SUM_l: INTEGER range –16 to 15;
SUM_l <= l1+l2;
Trang 142.1.3 Các toán tử dịch và quay
Các toán tử dịch và quay được thực hiện trên các đối tượng được biểu diễn theo kiểu bit_vector Toán tử dịch và quay có thể phân biệt tính luận lý và tính số học
Ví dụ: Giá trị ban đầu 10100110
Ví dụ: Giá trị ban đầu 10100101
2.1.4 Bộ dồn kênh
Chức năng cơ bản của bộ dồn kênh là để chọn lựa một đầu ra trong nhiều đầu vào, trong khi đó mạch phân kênh thực hiện thao tác ngược lại, một đầu vào được truyền đến một trong những đầu ra, các giá trị đầu ra khác giữ giá trị trước của chúng
Ví dụ: Entity MUX2 is
Port (A, B: in bit; Select_A: in bit; Z: out bit);
Trang 15Sơ đồ phần cứng mô tả bộ dồn kênh
Các phần tử đồng bộ tạo thành một họ rất lớn, nó chứa các mạch cài và các thanh ghi là các phần tử nhớ
Các cấu trúc tương đương của các mạch đồng bộ
Hình 3
2.2.1 Mạch cài
Mạch cài là tài nguyên bộ nhớ đơn giản nhất, đầu vào D được truyền đến đầu ra Q khi tín hiệu điều khiển G tích cực nếu không thì giá trị trước đó của D giữ nguyên trên Q
Ví dụ: ENTITY LATCH IS
Port (G: in BIT; D: in BIT; Q: out BIT);
Architecture A of LATCH IS Begin
Trang 162.2.2 Thanh ghi
Thanh ghi cũng tương tự như mạch cài nhưng dữ liệu được nhớ tại sườn của lệnh thay vì mức của nó Sự mô tả mạch cài và thanh ghi gần giống nhau
IV CÔNG NGHỆ FPGA(xem [4, 9])
Công nghệ FPGA (FPGA là từ viết tắt của Field Programmable Gate Arrays) là công nghệ chế tạo mạch tích hợp mật độ cao FPGA là một thiết
bị cấu trúc luận lý có thể lập trình được bởi người sử dụng mà không cần đến một công cụ chế tạo mạch tích hợp
Người thiết kế muốn tạo ra FPGAs tốt phải sử dụng công cụ thiết kế được trợ giúp bởi máy tính gọi là CAD (computer -Aided - Design) Đầu tiên thiết kế mạch luận lý ban đầu đòi hỏi một sơ đồ biểu diễn mạch hay một mô tả VHDL hoặc đặc tả các biểu thức luận lý (Boolean) Từ các ngõ vào ban đầu mô tả mạch được chuyển thành dạng chuẩn như các biểu thức boolean sau đó được xử lý bằng công cụ tối ưu luận lý, chúng rút gọn các biểu thức, sau đó các biểu thức Boolean đã tối ưu được truyền tới các khối luận lý của FPGA thông qua chương trình ánh xạ công nghệ (technology mapping) Bộ ánh xạ thực hiện tối thiểu số khối được dùng, tiếp theo chương trình sắp xếp (Placement) thực hiện đặt mỗi khối vào trong dãy FPGAs Bước cuối cùng trong hệ thống CAD được thực hiện bằng phần mềm điều khiển luồng (routing) chúng ấn định các đoạn dây FPGA và chọn các chuyển mạch có thể lập trình phù hợp với các kết nối trong khối luận lý Sau khi thực hiện thành công các bước sắp xếp và tuyến ngõ ra của hệ thống CAD được nạp vào đơn vị lập trình tạo ra chíp FPGA
Trang 17Mô hình hệ hống CAD của FPGA
Đơn vị lập trình Routing Placement Ánh xạ công nghệ Tối ưu logic
Mạch logic ban đầu V
V
V
V V
V Configured FPGA
Hình 4
1 Các loại FPGA
Các loại FPGA của nhiều công ty khác nhau có các đặc tính riêng chúng có thể được chia làm 4 loại chính:
Divice)
PLD phân cấp
Đa cổng
Nối kết
Nối kết PLD
Block
Logic Block
Logic Block
Logic Block
Nối kết
Kết nối phủ lên Logic Block
Hình 5
Trang 181.1 Các công nghệ lập trình chíp
Có nhiều cách hiện thực các phần tử lập trình, các công nghệ lập trình
đang sử dụng hiện nay là: RAM tĩnh, cầu chì nghịch (anti-fuse), EPROM transistor và EEPROM transistor Mặc dù các công nghệ lập trình khác
nhau nhưng chúng có chung tính chất là có thể cấu hình ở một trong hai
trạng thái làø: ON hoặc OFF Các phần tử lập trình dùng để hiện thực các kết
nối lập trình giữa các khối luận lý của FPGA, một FPGA thông thường có thể có hơn 100.000 phần tử lập trình Do đó các phần tử lập trình phải có các tính chất sau:
+ Chiếm càng ít diện tích của chíp càng tốt
+ Có kháng trở thấp khi ở trạng thái ON và kháng trở cao khi ở trạng thái OFF
+ Có điện dung ký sinh thấp khi kết nối các đoạn dây
+ Có thể chế tạo một cách tin cậy số lượng lớn phần tử lập trình trên một chíp
1.1.1 Công nghệ lập trình dùng RAM tĩnh
Công nghệ lập trình SRAM được sử dụng trong các FPGAs của nhiều
công ty như: Algotronix concurrent Logic, Plessey semiconductors, Xilinx Trong các FPGAs này, các kết nối lập trình được làm bằng transistor truyền (pass-transistor) các cổng cho phép truyền (pass-gates) hay các bộ dồn kênh (multiplexer), tất cả điều được điều khiển bằng ô nhớ (cell) SRAM
Ram cell
call inpu MultiplexerHình 6 Công nghệ lập trình ram tĩnh
Trong trường hợp pass-transistor và pass-gates ở hình 6 SRAM cell điều
khiển cổng truyền ON hoặc OFF Khi off giữa hai dây nối với pass-gates có
một trở kháng rất cao Khi ON nó sẽ tạo ra một trở kháng thấp kết nối giữa hai dây nối Đối với bộ dồn kênh, SRAM cell điều khiển ngõ nhập nào của các bộ dồn kênh sẽ được kết nối với ngõ ra của nó
Trang 191.1.2 Công nghệ lập trình dùng cầu chì nghịch (anti-fuse)
Công nghệ lập trình anti-fuse được sử dụng trong các FPGA của Actel Corp, QuickLogic và CrossPoint Solution Tuy anti-fuse được sử dụng trong các loại FPGA có cấu tạo khác nhau, nhưng chức năng là như nhau Một anti-fuse bình thường sẽ ở trạng thái trở kháng cao, nhưng có thể bị nóng chảy thành trạng thái trở kháng thấp khi được lập trình ở điện thế cao
a Cấu tạo anti-fuse của Actel
Anti-fuse của Actel được gọi là PLICE Nó có cấu trúc hình chữ nhật gồm 3 lớp: lớp dưới cùng chứa silic mang nhiều điện tích dương (n+diffusion), lớp giữa là lớp điện môi (Oxy-Nitơ-Oxy cách điện) và lớp trên cùng là Poly-Silic
metal 1 wire Poly-Si
metal 2 wire anti-fuse n+diffusion
Poly-Si dielectric oxide
silicon substrate n+diffusion
Hình 7 công nghệ lập trình cầu chì nghịch PLICE
Anti-fuse PLICE được lập trình bằng cách đặt một điện thế cao thích hợp (18v) giữa hai đầu của anti-fuse và dòng điều khiển khoảng 5mA qua thiết bị Dòng và áp này tạo ra một nhiệt lượng đủ nóng bên trong lớp điện môi làm nó nóng chảy và tạo ra một liên kết giữa poly-silic và n+diffusion Hai lớp dưới cùng và trên cùng của anti-fuse được nối với các dây kim loại để khi lập trình anti-fuse sẽ tạo ra một kết nối có trở kháng thấp (300 đến
500 ohm) giữa hai dây kim loại
b Cấu tạo anti-fuse của QuickLogic
Anti-fuse của QuickLogic gọi là ViaLink Nó tương tự như PLICE, cũng có 3 lớp kim loại Tuy nhiên Vialink sử dụng kim loại mức 1 cho lớp dưới cùng, một hợp kim vô định hình cho lớp giữa và kim loại mức hai cho lớp trên cùng Vialink được lập trình bằng cách đặt điện thế 10v giữa các đầu của nó Khi dòng được cấp đủ trạng thái của silic vô định hình sẽ thay đổi và tạo ra một liên kết dẫn điện giữa hai lớp kim loại
Trang 20metal1 metal2 silic vô định hình
Hình 8 Công nghệ lập trình cầu chì nghịch ViaLink
1.1.3 Công nghệ lập trình EPROM và EEPROM
Công nghệ lập trình EPROM được sử dụng trong các FPGA của Altera Corp và Plus Logic Công nghệ này giống như sử dụng trong bộ nhớ EPROM Không giống MOS Transistor, một EPROM Transistor gồm hai cổng, một cổng treo (floating-gate) và một cổng chọn (select-gate) Cổng treo được đặt giữa cổng chọn và kênh của transistor
Điện trở lên nguồn +5V
GND word line
floaling gate
select gate bit line
EPROM transistor
Hình 9 Công nghệ lập trình EPROM
Ở trạng thái bình thường không có điện tích giữa cổng treo và transistor có thể chuyển sang trạng thái ON một cách bình thường bằng cổng chọn Khi transistor được lập trình bằng một dòng điện lớn chạy giữa nguồn và kênh thì một điện tích được giữ lại ở cổng treo Điện tích này làm cho
transistor chuyển sang trạng thái OFF Bằng cách này, EPROM transistor có
thể được tái lập trình bằng cách hủy bỏ lớp điện tích được giữ lại ở cổng treo
Trong hình 9 EPROM transistor được sử dụng trong FPGA theo cách khác với SRAM và anti-fuse Thay vì dùng cho lập trình kết nối hai dây EPROM transistor được sử dụng để kéo xuống các ngõ nhập của logic
block Như hình vẽ trên một đường dây gọi là word line được nối với cổng
chọn của EPROM transistor khi transistor chưa được lập trình ở trạng thái
block và bị kéo về mức logic 0 Nhiều EPROM transistor ứng với nhiều
Trang 21word line khác nhau được nối với cùng một bit line , khi một điện trở kéo lên nguồn nối với bit line mô hình này không những cho EPROM transistor
hiện thực các kết nối mà còn hiện thực các chức năng luận lý AND nối dây
Nhược điểm của phương pháp này là các điện trở tiêu tốn năng lượng cố định
Một ưu điểm của EPROM transistor là chúng có thể tái lập trình mà không cần bộ nhớ bên ngoài Không giống như SRAM, EPROM transistor
không thể tái lập trình ngay trên bộ mạch
Phương pháp dùng EEPROM tương tự như EPROM nhược điểm của nó
là tốn gấp đôi diện tích chíp so với EPROM transistor và cần nhiều nguồn điện thế mà các loại khác không cần
Hiện nay trên thị trường có một số họ FPGA của các hãng như Xilinx,
Actel, Altera v.v trong phần này trình kiến trúc của hãng Altera
PLD trong cấu trúc này sử dụng mảng hai chiều và một cấu trúc routing lập trình được Kiến trúc cơ bản của Altera FPGA dựa trên công nghệ lập trình
EPROM nó gồm một mảng lớn các khối lập trình được gọi là những khối
mảng luận lý (logic array Blocks) được kết nối với nhau bởi các nguồn tài
nguyên routing gọi là mảng lập trình nối liền nhau (Programmable Interconnect Array) Có hai thế hệ Altera FPGA là FPM5000 và FPM7000
Kiến trúc tổng quát của Altera
I/O I/O
Array LAB= Logic Array Block
Hình 10 Kiến trúc tổng quát của Altera FPGAs
Altera FPGA có cấu trúc nhóm phân cấp gồm 2 mức một khối luận lý
là Macrocell mức này gọi là LAB và một block gọi là bộ mở rộng đường dây
Trang 22tích (expander product terms), số lượng macrocell trong mỗi LAB thay đổi
tuỳ theo loại Altera FPGA, mỗi macrocell gồm 3 cổng AND nối vào cổng
macrocell Các ngõ nhập của macrocell xem như các cổng AND một ngõ nhập vì chúng được tạo ra như các cổng AND nối dây của các tín hiệu
Đường dây tích có thể là một tín hiệu trong PIA hay là từ bộ mở rộng đường
dây tích của LAB hoặc ngõ xuất của bất kỳ Macrocell nào, các tín hiệu ở
dạng thực hoặc bù nghĩa là phép đảo có thể lập trình được (programmable
inversion) với mô hình này thì chức năng của LAB giống chức năng của
này sẽ làm cho LAB hiệu quả hơn bởi vì hầu hết các hàm logic không cần
có số đường dây tích lớn như trong PLD và LAB hỗ trợ mở rộng chức năng
bằng bộ mở rộng đường dây tích
Cấu trúc của Altera LAB
Expander Product Tern Array
P I A
Hình 11 Altera LAB
2 Một số ứng dụng của FPGA
FPGA có thể được sử dụng trong hầu hết các ứng dụng mà hiện tại đang dùng trong các chíp MPGA, PLD và SSI (Small Scale Integrated) Các ứng dụng của FPGA có thể được liệt kê ra như sau:
Mạch tổ hợp là ứng dụng đặc biệt (Application-Specific Integrated
Circuit): FPGA là một công cụ có tính tổng quát, và hoàn toàn có thể hiện
thực được mạch logic số Nó đặc biệt thích hợp cho việc hiện thực ASIC
Một vài ứng dụng đã được ghi nhận như:1 megabit FIFO controller, kênh
giao tiếp IBM PS/2, DRAM controller, graphic engine, mạch nhận biết ký tự qua hình ảnh, …
Ứng dụng trong các máy tính dựa trên nền các FPGA: một loại máy
tính mới hoàn toàn được ra đời nhờ vào các FPGA có thể tái lập trình được ngay trên mạch của nó Những máy tính này bao gồm các mạch được thiết kế từ các FPGA Ý tưởng này xuất phát từ việc dùng một chương trình phần mềm để “dịch” vào phần cứng thay vì vào phần mềm theo cách thông
Trang 23thường Phần cứng này sau đó được hiện thực bằng cách lập trình các board
mạch FPGA Phương pháp mới này có 2 thuận lợi cơ bản là:
Không yêu cầu quá trình lấy lệnh như là các bộ vi xử lý truyền thống bởi vì chính bản thân phần cứng là sự thể hiện của các lệnh đó Ưu thế này có thể giúp cho tốc độ của mạch tăng lên đến hàng trăm lần
Loại thiết bị mới này còn có thể hỗ trợ các quá trình xử lý song song ở mức độ rất cao, dẫn đến tốc độ xử lý tăng vọt
Ưùng dụng vào việc tái cấu hình phần cứng (On-Site Re- Configuration
đổi được cấu trúc các máy đã sản xuất hoàn chỉnh hay đã được sử dụng Ngay cả đối với các máy ở xa cũng có thể được thay đổi, bổ sung cho thích ứng hoặc ngay cả chỉnh sửa lại sự sai sót của công việc thiết kế mạch đó Loại FPGA thích hợp nhất cho việc tái cấu hình này là loại chứa những công tắc có thể tái lập trình được
3 Thiết bị Max, Flex
Công ty Altera là một nhà chế tạo hàng đầu về PLD, Altera tạo ra PLD trong phạm vi từ các thiết bị có thể được dùng để thay thế tương đương
300 cổng TTL đến các thiết bị có thể thay thế 250000 cổng
Một board mạch in lớn về các chíp có thể được thay thế bằng một PLD đơn, điều này sẽ làm giảm được kích thước của hệ thống số và cũng làm giảm được giá thành chế tạo và chạy thử PLDs cũng phổ biến vì chúng có thể xóa được Các PLD có thể xóa được cho phép nhà thiết kế lập trình một PLD, và chạy thử chúng trên một hệ thống thực, và làm thay đổi khi cần thiết Lập trình lại cho một con chíp thì nhanh hơn nhiều so với việc viết lại một bread-board hoặc làm lại một board với nhiều dây dẫn chằn chịt Cuối cùng một thiết kế được thực thi trong một PLD có thể dễ dàng được vận chuyển Thiết kế này có thể được thực thi trong nhiều PLD khác nhau Một PLD tiêu biểu chứa một dãy các tài nguyên logic như là các cổng,
các flipflop, các thanh ghi and/or, với các kết nối bên trong giữa các tài
nguyên logic có thể lập trình được Các kết nối bên trong này có thể được bổ sung với các đường fusible (nấu chảy được), mà trong trường hợp này thiết bị chỉ có thể được lập trình một lần Chế độ kết nối này thì phổ biến trong các PLD ban đầu như là 16L8 và 22L10 PAL's (chúng phổ biến trong nhiều năm) Trong các PLD, gần đây các kết nối bên trong có thể được bổ sung bằng các mạch chuyển đổi CMOS được điều khiển bằng RAM tĩnh, trong trường hợp này thiết bị có thể được lập trình lại bằng điện, mà không tách ra khỏi mạch, các PLD khác bao gồm các PLD mà bạn sẽ dùng trong
Trang 24lớp (class) này sẽ có các kết nối bên trong mà có thể được lập trình bằng điện và xóa bằng đèn tử ngoại UV (UV là viết tắt của ultraviolet)
Có nhiều thiết bị lập trình được của các hãng khác nhau ở đây chỉ giới thiệu một vài thiết bị lập trình thông dụng của hãng Altera
Altera MAX gồm có MAX9000, MAX7000, MAX5000
- Họ MAX9000 là thế hệ thứ 3 của kiến trúc nhiều ma trận mảng (Multiple Array Matrix) bao gồm Max9000 và MAX9000A là những EEPROM cơ bản gồm những thiết bị có khả năng lập trình logic và xoá (EPLD) : EPM9320, EPM9320A, EPM9400, EPM9480, EPM9560A MAX9000 EPLDs phù hợp cho những kế hoạch đòi hỏi khả năng hiện thực giá trị xuất nhập ở mức cao, có mật độ từ 320 đến 560 Macrocells khoảng
6000 đến 12000 cổng, họ MAX9000 có thời gian trễ từ 10ns đến 20ns và hiệu xuất tiêu biểu là 145MHz, MAX9000 cho phép người thiết kế kết hợp những thiết bị có dung lượng nhỏ vào trong một thiết bị MAX900, điều này giúp tiết kiệm không gian quí giá trên board mạch làm giảm giá thành sản phẩm và giảm thời gian chậm trễ cho việc hoàn thành sản phẩm
-Họ MAX7000 là thế hệ thứ 2 của kiến trúc ma trận mảng gồm có MAX7000, MAX7000A, MAX7000B, MAX7000E, MAX7000S và MAX7000AE là những EEPROM được chế tạo theo công nghệ CMOS, MAX7000 có mật độ từ 32 đến 512 macrocells, có thời gian delay 3,5ns Thiết bị MAX7000 thường hoạt động với điện thế 5v, 3.3v, 2.5v
Altera FLEX gồm có FLEX10K, FLEX8000 và FLEX6000
-FLEX10K có kiến trúc cơ bản Flexible Logic Element Matrix Họ FLEX10K gồm có FLEX10K, FLEX10KA, FLEX10KB, FLEX10KE là những SRAM gồm có EPF10K10, EPF10K20, EPF10K30, EPF10K40, EPF10K50, EPF10K70, EPF10K100 Altera FLEX10K được nhúng vào trong họ lập trình logic nó mở ra tính linh động, tính mềm dẻo của lối lập trình luận lý theo kiểu lập trình truyền thống Nó là hai cấu trúc logic đầy đủ duy nhất nhúng vào mảng và mảng logic Nó có khoảng 10000 đến 250000 cổng tiêu biểu FLEX10K mở ra 3 quá trình, mỗi một thế hệ tiếp theo cung cấp sự thực thi cao hơn, hạ giá thành, làm giảm sự thiệt hại
Trang 25Phần 2 THIẾT KẾ CPU
Các khái niệm về ngôn ngữ VHDL, cú pháp và ngữ nghĩa của nó đã được trình bày ở phần 1 Phần này sử dụng cấu trúc của phần 1 để mô tả CPU 8 bit
Phần I nêu nhiệm vụ của CPU, phần II mô tả tổ chức bộ nhớ của CPU, phần III trình bày tập lệnh CPU, phần IV trình bày chế độ địa chỉ của CPU, phần V mô tả hành vi của CPU, phần VI trình bày các thành phần của CPU
I NHIỆM VU Ï
Thiết kế một CPU 8 bit, CPU này có một thanh ghi tích luỹ, một bus
dữ liệu 8 bit và một bus địa chỉ 12 bit Nó thực hiện được một số phép tính luận lý và số học cơ bản CPU có một số lệnh nhảy và rẽ nhánh với các chế độ địa chỉ trực tiếp và gián tiếp CPU cũng có một số lệnh gọi chương trình con đơn giản, có một tín hiệu đồng hồ CLK, một tuyến ngõ ra 8 bit và hai
tuyến ngõ vào 8 bit có địa chỉ là FFEh, FFFh
II TỔ CHỨC BỘ NHỚ CỦA CPU
CPU có khả năng định vị địa chỉ 4096 byte nhớ thông qua bus địa chỉ
12 bit Bộ nhớ này phân chia thành 16 trang mỗi trang là 256 byte, trang đầu tiên nằm trong CPU, 4 bit có trọng số cao nhất của tuyến địa chỉ thiết lập địa chỉ trang (page), 8 bit có trọng số thấp nhất của nó chỉ độ dời (offset) Bộ nhớ được phân thành 16 trang (page0 ->page15), nhưng bộ nhớ của CPU vẫn được xử lý như bộ nhớ 4K liên tiếp nhau Để đơn giản cho việc thiết kế
ta lấy địa chỉ xuất nhập của CPU chính là địa chỉ của ô nhớ FFEh và FFFh
là 2 cổng nhập và xuất của CPU
Hình 12 mô tả trang và độ dời của CPU
1
0
Offset
0 5 Page
Trang 26III TẬP LỆNH CỦA CPU
CPU có tổng cộng 23 lệnh CPU này có một thanh ghi tích luỹ để thực
hiện tất cả các lệnh Ngoài ra, CPU còn có các cờ overflow, carry, negative
và zero (v, c, n và z) Các cờ này có thể được thay đổi bởi các lệnh liên
quan đến cờ hoặc bởi các lệnh làm thay đổi nội dung của thanh ghi tích lũy
Lệnh lda nạp vào thanh ghi tích lũy với nội dung của bộ nhớ có địa chỉ trong hàng lệnh, còn lệnh and, adc và sbc truy cập bộ nhớ để lấy toán hạng
và thực hiện các tính toán (and, cộng và trừ) và lưu kết quả trong thanh ghi
tích lũy Các cờ z và n được thiết lập hoặc xoá dựa trên kết quả của lda,
and, adc và sbc Các lệnh adc và sbc cũng ảnh hưởng đến cờ v và cờ c phụ
thuộc vào kết quả tương ứng
- Bảng tóm tắt các lệnh của CPU
Lệnh gợi
nhớ
Mô tả chức năng tóm tắt Bit
địa chỉ
Chế độ địa chỉ
Định vị gián tiếp
Sử dụng cờ
Thiết lập cờ
Add AC với (loc)
Sub AC với (loc)
Nhảy tới adr
Cất AC vào loc
Gọi chương trình con tại loc
Rẽ nhánh tới adr nếu V
Rẽ nhánh tới adr nếu C
Rẽ nhánh tới adr nếu Z
Rẽ nhánh tới adr nếu N
Không làm gì
Xoá AC
Lấy bù 1 AC
Lấy bù
Dịch trái số học AC
Dịch phải số học AC
Có Có Có Có Có Có Không Không Không Không Không Không Không Không Không Không Không
-c -c v - -c z- -n -c
zn zn vczn vczn zn -c vczn zn Bảng 1
Lệnh sta cất nội dung của thanh ghi tích lũy vào vị trí nhớ được ghi trong hàng lệnh Việc thực hiện lệnh jmp là làm cho lệnh kế tiếp được thực hiện từ địa chỉ được chỉ ra trong hàng lệnh Các lệnh lda, and, adc, sbc, jmp và sta sử dụng địa chỉ 12 bit và có thể được dùng với chế độ địa chỉ gián
tiếp
Lược đồ địa chỉ của lệnh jsr và các lệnh rẽ nhánh là địa chỉ trang Các lệnh này chỉ ra trang mà chúng thực hiện lệnh Lệnh jsr với địa chỉ 8 bit chỉ
Trang 27tới chương trình con (tos), những lệnh kế tiếp thực hiện từ vị trí độ dời tos +
1 của trang hiện hành Ở cuối chương trình con để quay lại chương trình
chính thì dùng lệnh nhảy gián tiếp đến địa chỉ tos Bốn lệnh rẽ nhánh jv, jc,
jz và jn làm cho lệnh kế tiếp được thực hiện tại địa chỉ của trang hiện hành
với độ dời do lệnh cung cấp nếu các cờ tương ứng v, c, z hoặc n được thiết
lập
Các lệnh nop, cla, cma, asl và asr là lệnh không cần địa chỉ và thực hiện các thao tác trên các thanh ghi bên trong CPU Lệnh nop không thực hiện thao tác chỉ tăng bộ đếm chương trình lên 1, cla để xoá thanh ghi acc về 0, cma lấy bù nội dung của acc, cmc bù nội dung cờ c, als và asl dùng để dịch chuyển số học trái hay phải thanh ghi acc Khi dịch trái, bit có trọng số cao nhất của acc được chuyển vào cờ carry, các bit có trọng số thấp hơn dịch sang trái 1 bit Lệnh asr giữ nguyên bit dấu của thanh ghi acc và dịch
chuyển các bit có trọng số thấp hơn sang bên phải Cả 2 lệnh dịch chuyển
đều ảnh hưởng đến các cờ zero và negative
IV CHẾ ĐỘ ĐỊA CHỈ CỦA LỆNH
Trong tập lệnh có 3 nhóm lệnh, nhóm thứ nhất có địa chỉ đầy đủ cần 2 byte và có thể truy cập tới địa chỉ bất kỳ của bộ nhớ của CPU và có thể dùng địa chỉ trực tiếp hay gián tiếp, nhóm thứ 2 là nhóm lệnh dùng định vị trang yêu cầu 2 byte có thể truy cập vùng nhớ ở trang hiện hành mà không thể sử dụng địa chỉ gián tiếp, nhóm thứ 3 là nhóm lệnh không địa chỉ vì không dùng bộ nhớ cho toán hạng
• Các lệnh địa chỉ đầy đủ :
Mã tác vụ chỉ thao tác của lệnh địa chỉ đầy đủ được tạo ra bởi 3 bit có trọng số cao nhất của byte lệnh đầu tiên Bit 4 chỉ chế độ địa chỉ trực tiếp hoặc gián tiếp (0: trực tiếp, 1: gián tiếp) và 4 bit có trọng số thấp nhất chứa địa chỉ trang toán hạng của lệnh Byte thứ 2 của lệnh địa chỉ đầy đủ chỉ ra địa chỉ độ dời và cùng với địa chỉ trang để tạo ra địa chỉ 12 bit cho toán hạng
Mã tác vụ của lệnh
Lệnh gợi nhớ Các bit mã tác vụ
765
T/G Bit 4
Địa chỉ trang Địa chỉ trang Địa chỉ trang Địa chỉ trang Địa chỉ trang Địa chỉ trang
Trang 28• Các lệnh địa chỉ trang
Các lệnh này sử dụng địa chỉ trang nhớ mà lệnh đang ở đó Mã tác vụ của jsr là 110 và 5 bit còn lại của byte lệnh đầu tiên bị bỏ qua Vùng mã tác vụ của lệnh rẽ nhánh chứa 111, còn bit 4 luôn là 1 và các bit có trọng số
thấp hơn của nó chỉ ra điều kiện để rẽ nhánh Byte thứ 2 của jsr và các lệnh
rẽ nhánh xác định địa chỉ nhảy tới ở trang hiện hành
Định vị địa chỉ trong lệnh địa chỉ trang
.
33 Lệnh sau JSR
.
00000000 Mã lệnh chương trình con
.
JMP gián tiếp 33
.
lệnh JSR Trước khi thực hiện
PC->5:11
5:13 5:12
.
5:33 5:34 5:56 5:57
Trang 29Lệnh jsr bắt đầu thực hiện tại vị trí 5:11, ở vị trí 5:12 chỉ ra chương trình con bắt đầu thực hiện tại vị trí 33 của trang 5:33, đây là vị trí đầu tiên của chương trình con dùng để lưu trữ địa chỉ trở về khi lập trình thì không được dùng nó cho chương trình, khi lập trình thì sử dụng một lệnh nhảy gián tiếp tại cuối chương trình con để trở về chương trình chính Như trong hình vẽ trên thì lệnh nhảy gián tiếp đặt tại vị trí 5:55 và 5:56, sau khi thực hiện lệnh jsr đặt ở vị trí đầu tiên của chương trình con (vị trí 5:33), lệnh nhảy gián tiếp ở vị trí 5:55 làm cho chương trình chạy trở về vị trí 5:33 sau khi thực hiện hoàn tất chương trình con
• Lệnh không địa chỉ
Lệnh không địa chỉ là nhóm lệnh cuối cùng của tập lệnh Các lệnh này
chiếm 1 byte, trong đó 4 bit có trọng số cao nhất của chúng là 1110, 4 bit
còn lại để phân biệt các lệnh nop, cla, cma, cmc, asl và asr
• Địa chỉ gián tiếp trong CPU
Nếu bit thứ 4 của byte đầu tiên của lệnh địa chỉ đầy đủ là ‘1’ thì địa chỉ
này là địa chỉ gián tiếp của toán hạng Địa chỉ gián tiếp sử dụng địa chỉ 12 bit gồm có 12 trang và độ dời Độ dời cùng với giá trị trang của địa chỉ gián tiếp tạo địa chỉ đầy đủ cho toán hạng thực của lệnh
V HÀNH VI CPU(xem [2, 4])
Trong phần này mô tả hành vi của CPU 8 bit phần mô tả giao diện của CPU ở mức phần cứng bằng việc sử dụng các bit cho những tín hiệu điều khiển bên ngoài, bộ nhớ và truyền dữ liệu
1.Định thời và đồng hồ
Giao diện mô tả hành vi gồm có một tín hiệu đồng hồ được dùng để đồng bộ Dựa trên tín hiệu đồng hồ, các giản đồ định thời được trình bày như sau:
1.1 Giản đồ định thời đáp ứng ngắt quãng
.
.
pc=066h
clk interrupt
Adbus (PC)
< - S1 ->< - S2 ->
Hình 15
Trang 30Trong giản đồ định thời xử lý tín hiệu ngắt quãng với 2 nhịp đồng hồ S1 và S2 thì bộ đếm chương trình của CPU được gán giá trị 066 Chương trình bắt đầu thực hiện từ địa chỉ 066 trở đi
.
.
.
clk
< - S1 ->< - S2 ->
pc Adbus
.
databus read-mem
.
Hình 16
Tại sườn lên của xung clock S1, tuyến địa chỉ xuất hiện nội dung của
PC, tín hiệu đọc bộ nhớ cũng tích cực Tại sườn lên của xung S2, khi dữ liệu đã sẳn sàng trên tuyến dữ liệu, CPU đọc dữ liệu đưa vào thanh ghi lệnh (byte1) để thực hiện lệnh
ở chế độ trực tiếp
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Trang 311.4 Giản đồ định thời chu kỳ thực hiện lệnh lda, adc, sbc (chế độ trực
tiếp) và lệnh jmp (chế độ gián tiếp)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
< - S5 >< - S6 >
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
read-mem
.
.
.
.
.
.
.
.
.
.
.
.
byte 2
.
.
.
write-mem
pc(7-0) PC(3-0)&byte2
Hình 19
Giản đồ này từ trạng thái S1 đến S4 giống như mục 3, đến chu kỳ 5 tín hiệu write_mem tích cực cho phép CPU thực hiện thao tác ghi nội dung PC (7-0) vào ô nhớ địa chỉ PC (3-0) & byte2
.
.
.
.
.
.
.
.
.
.
.
< - S1 >
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Hình 20
Trang 32Giản đồ này từ trạng thái S1 đến S4 giống như mục 3, tại chu kỳ S5 CPU thực hiện thao tác ghi nội dung ac vào ô nhớ địa chỉ byte1 (3-0) & byte2
gián tiếp)
.
.
< - S3 >
.
.
.
.
.
.
.
.
.
.
adbus
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
byte 2
< - S2 >
byte1(3-0)&byte2 pc
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
write-mem
Hinh 22
Từ chu kỳ S1 đến S6 thực hiện giống với giản đồ ở mục 7, đầu chu kỳ S7 phát địa chỉ trong byte1 (3-0) & byte2 để ghi nội dung acc vào bộ nhớ
Trang 33Từ 8 giản đồ trạng thái trên vẽ được sơ đồ trạng thái mô tả hành vi của CPU như sau:
S8
S5
Reset = 0
Reset = 1 Lệnh 1 byte và đáp ứng int
interrupt
lệnh jn, jz, jc,jv và jmp (trực tiếp)
Lệnh lda, adc,and,sbc,
sta(gián tiếp)
lệnh lda,and,adc, sbc,sta(trực tiếp), jmp(gián tiếp),jsr.
Hình 23
2 Khối phục vụ chương trình(xem[ 2, 4] )
Khối utility này khai báo kiểu con byte độ dài 8 bit kiểu STD_LOGIC_VECTOR, kiểu con ten độ dài 10 bit kiểu STD_LOGIC_VECTOR Ngoài ra khai báo các hằng số có giá trị là các vector bit của các lệnh Tên của các lệnh được gán cho các mã tác vụ của lệnh đó Khối utilities trình bày hai hàm add_cv và sub_cv Hai hàm này thực hiện cộng và trừ hai toán hạng kiểu std_logic_vector có độ dài 8 bit Kết quả trả về là kiểu bit vector có chiều dài 8 + 2 Trong đó, bit có vị trí 8+1 chỉ thị cờ nhớ, bit có vị trí 8+2 chỉ thị cờ tràn Hai giá trị ADDR_WIDTH và DATA_WIDTH là chiều dài bit của hai tuyến địa chỉ và dữ liệu
PACKAGE UTILITY IS
CONSTANT ADDR_WIDTH: INTEGER := 2;
CONSTANT DATA_WIDTH: INTEGER :=8;
SUBTYPE byte IS std_logic_vector (7 DOWNTO 0);
Trang 34SUBTYPE 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 thân khối utility trình bày hai giải thuật thực hiện hai phép toán cộng và trừ Trong hàm cộng, kết quả phép cộng bit và cờ nhớ của nó được tính như sau:
Sum := a XOR b XOR carry
Carry := ((a xor b) and carry) or ( a and b)
Trang 35Vòng for thực hiện 8 phép cộng liên tiếp để tạo ra kết quả và cờ nhớ Để xác định bit tràn, kiểm tra hai ngõ vào cùng dấu và kết quả khác dấu thì phép tính đã bị tràn
Nếu dấu_a bằng dấu_b và kết quả khác dấu_a thì tràn ngược lại thì không tràn
Đối với phép trừ cũng tương tự như phép cộng chỉ khác là trước khi thực hiện thì lấy số bù của b và cờ tràn
PACKAGE BODY utility IS
FUNCTION add_cv (a, b: byte; cin: std_logic) RETURN ten IS
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
c(i) := ((a(i) XOR b(i)) AND c(i-1)) OR (a(i) AND b(i));
FUNCTION sub_cv (a, b: byte; cin: std_logic) RETURN ten IS
VARIABLE not_b: byte := zero_8;
VARIABLE not_c: std_logic;
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));
Trang 36FOR 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));
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 sub_cv;
END utility;
3 Mô tả hành vi cpu (xem[4] )
Mô tả hành vi của CPU bằng lệnh
cpu: PROCESS (clk_cpu)
Khai báo các biến cần thiết cho chương trình
BEGIN
Wait UNTIL clk_cpu = ‘0’;
IF reset =’0’ THEN Đặt các trạng thái ban đầu
ELSE
CASE state IS
WHEN S0 | S10 =>
IF interrup = ‘1’ THEN Xử lý ngắt quãng ELSE
END IF;
IF interrup =’1’ THEN Trở về trạng thái S10 ELSE
IF byte1 (7 downto 4) = lệnh một byte THEN
ELSE Đặt trạng thái S2;
Đọc dữ liệu vào byte 2, tăng PC + 1
IF byte1 (7 downto 4) = rẽ nhánh THEN