Luận văn sẽ bắt ñầu với việc tìm hiểu về xu hướng cũng như những loại thiệt bị lôgic lập trình ñược hiện nay, tìm hiểu, thiết kế tập lệnh, datapath và bộ ñiều khiển cho một vi xử lý 8 bí
Trang 1MỤC LỤC
DANH MỤC BẢNG 3
DANH MỤC HÌNH VẼ 4
LỜI NÓI ðẦU 6
CHƯƠNG 1 TỔNG QUAN VỀ FPGA 7
1.1 Giới thiệu chung 7
1.2 Tổng quan về thiết bị logic khả trình – PLD 7
1.3 Thiết bị logic khả trình ñơn giản – Simple PLD 9
1.4 Thiết bị logic khả trình phức tạp – Complex PLD 12
1.5 FPGA – Field Programmable Gate Arrays 15
CHƯƠNG 2 THIẾT KẾ TẬP LỆNH 22
2.1 Mô tả chung về tập lệnh 22
2.2 Thiết kế chi tiết tập lệnh 23
CHƯƠNG 3 THIẾT KẾ KIẾN TRÚC VI XỬ LÍ 27
3.1 Giới thiệu 27
3.2 Thiết kế datapath và ñiều khiển cho RICS 28
3.4 Xây dựng module ñiều khiển 45
3.5 Tổ chức bộ nhớ 45
CHƯƠNG 4: THIẾT KẾ TESTBENCH VÀ PHƯƠNG PHÁP MÔ PHỎNG TRÊN MODELSIM 51
4.1 Giới thiệu 52
4.2 Thiết kế hệ mô phỏng 53
4.3 Mô phỏng ñể kiểm tra thiết kế 55
CHƯƠNG 5: THIẾT KẾ CHI TIẾT CHỨC NĂNG CỦA VI ðIỀU KHIỂN VÀ MÔ PHỎNG TRÊN MODELSIM 58
5.1 Giới thiệu chung 58
Trang 25.2 Thiết kế và mô phỏng chức năng của các module cơ bản trong vi xử lý 59
5.3 Thiết kế bộ mô phỏng hệ thống tự ñộng 68
5.4 Mô phỏng vi ñiều khiển thực hiện một ñoạn chương trình ñơn giản, kiểm tra chức năng các module trong vi ñiều khiển 72
CHƯƠNG 6 TRIỂN KHAI TRÊN KÍT DE2 VÀ MỘT ỨNG DỤNG ðƠN GIẢN 79
6.1 Tổng quan về Kit DE2 79
6.2 Triển khai và chạy thử trên kít DE2 80
6.3 Một ứng dụng nhỏ sử dụng vi ñiều khiển 8 bít 81
KẾT LUẬN 83
TÀI LIỆU THAM KHẢO 85
Phụ lục 1: Các chương trình test bench dùng ñể mô phỏng và kiểm tra chức năng của vi ñiều khiển 86
Phụ lục 2 Mã nguồn Verilog của nhân vi ñiều khiển 88
Trang 3DANH MỤC BẢNG
Bảng 1 - 1: Tóm tắt về các thiết bị PLD 8
Bảng 1 - 2 Altera CPLD 14
Bảng 1 - 3 Xilinx CPLD 14
Bảng 2- 1: Các lệnh hướng byte của vi ñiều khiển 24
Bảng 2- 2: Các lệnh hướng bít của vi ñiều khiển 25
Bảng 2- 3: Các lệnh rẽ nhánh của vi ñiều khiển 26
Bảng 3 - 1: Các thanh ghi chức năng ñặc biệt 47
Bảng 3 - 2: Thanh ghi trạng thái của vi ñiều khiển 48
Bảng 5 - 1: Lối vào ñiều khiển của ALU 61
Bảng 5 - 2: Mã nguồn chương trình ñược mô phỏng 73
Bảng 5 - 3: Các testbench ñược dùng ñể mô phỏng và kiểm tra chức năng của vi ñiều khiển 78
Trang 4DANH MỤC HÌNH VẼ
Hình 1 - 1 Cấu trúc một thiết bị PAL 10
Hình 1 - 2 Cấu trúc một thiết bị PLA 10
Hình 1 - 3: Cấu trúc chip GAL 16V8 11
Hình 1 - 4: Cấu trúc chung của một CPLD 12
Hình 1 - 5 Cấu trúc CPLD XC9500 của Xilinx 13
Hình 1 - 6: Cấu trúc chung của FPGA 16
Hình 1 - 7: Cấu trúc một CLB trong FPGA họ XC40000E 17
Hình 1 - 8: Cấu trúc một Logic Cell trong Spartan-IIE 18
Hình 1 - 9 Cấu trúc IOB trong Spartan-IIE 18
Hình 1 - 10: Liên kết trong một chuyển mạch 19
Hình 1 - 11 Mạng liên kết giữa các CLB 19
Hình 1 - 12 Các kết nối trực tiếp giữa các khối trong FPGA 20
Hình 1 - 13 FPGA Spartan IIE của Xilinx 20
Hình 2- 1: ðịnh dạng các lệnh hướng byte 23
Hình 2- 2 ðịnh dạng các lệnh hướng bít 24
Hình 2- 3: ðịnh dạng các lệnh rẽ nhánh 25
Hình 2- 4: ðịnh dạng của lệnh goto 25
Hình 3- 1: Một datapath ñơn giản và mô ñun ñiều khiển tương ứng 28
Hình 3- 2: Tổng quan về kiến trúc của vi ñiều khiển 30
Hình 3- 3: Mô hình ñiều khiển datapath 31
Hình 3- 4: Bộ nhớ chương trình, PC và module tính PC+1 ñược kết nối với nhau tạo thành datapath ñơn giản 33
Hình 3- 5: Tệp thanh ghi (register file) 33
Hình 3- 6: Bộ logic và số học ALU 34
Hình 3- 7: Kết nối bộ logic và số học với register file 34
Hình 3- 8: Datapath ñơn giản sau khi ñã kết nối các thành phần của vi ñiều khiển với nhau 35
Hình 3- 9: Datapath của vi ñiều khiển sau khi ñã ñược thêm vào các thanh ghi pipeline ñể có thể thực hiện ñược kĩ thuật xử lý ñường ống 39
Hình 3- 10: Trạng thái của datapath khi thực hiện pha ñầu tiên, tìm và nạp lệnh 40
Hình 3- 11: Trạng thái của datapath khi thực hiện bước giải mã lệnh và ñọc dữ liệu từ register file 41
Hình 3- 12: Trạng thái của datapath khi thực hiện bước thực thi lệnh 42
Trang 5Hình 3- 13: Datapath sau khi ñã thêm khối ñiều khiển 43
Hình 3- 14: Tổ chức bộ nhớ chương trình của vi ñiều khiển 46
Hình 3- 15: Tiến trình thực hiện lệnh GOTO 48
Hình 3- 16: Tiến trình thực hiện lệnh CALL 49
Hình 3- 17: Tổ chức bộ nhớ dữ liệu, bao gồm cả thanh ghi chức năng ñặc biệt và thanh ghi chức năng chung 49
Hình 3- 18: Sơ ñồ kiến trúc của vi xử lý 50
Hình 4 - 1 Môi trường ñồng mô phỏng ñồng nhất 54
Hình 4 - 2 Môi trường ñồng mô phỏng không ñồng nhất 55
Hình 5 - 1: Bộ lô gic và số học ALU 60
Hình 5 - 2 MUX lựa chọn lối vào cho S1 của bộ ALU 60
Hình 5 - 3: Bộ nhớ RAM single port ñược dùng làm bộ nhớ chương trình 62
Hình 5 - 4: Sơ ñồ khối của bộ nhớ chương trình 63
Hình 5 - 5: Sơ ñồ khối của bộ chia tần số 64
Hình 5 - 6: Sơ ñồ khối của bộ nhớ chương trình 64
Hình 5 - 7: IP core ñược dùng ñể làm bộ nhớ chương trình 66
Hình 5 - 8: Sơ ñồ bên trong của register file 67
Hình 5 - 9: Bộ nhớ Stack 68
Hình 5 - 10: Kết quả mô phỏng PC và bộ nhớ chương trình của vi ñiều khiển 74
Hình 5 - 11: Kết quả mô phỏng khối ALU 75
Hình 5 - 12: Kết quả mô phỏng register file 76
Hình 6 - 1 Sơ ñồ các thành phần trên kít phát triển DE2 80
Hình 6 - 2: Lưu ñồ thuật toán thực hiện chạy chữ trên LCD 82
Trang 6LỜI NÓI ðẦU Với xu hướng phát triển rất nhanh của các bộ vi xử lý cũng như yêu cầu ngày càng cao của người dùng, việc phát triển một một bộ vi xử lý với tốc ñộ tính toán thật mạnh ñã
và ñang là yêu cầu khẩn thiết ñối với những nhà phát triển công nghệ Việc thiết kế các bộ
vi xử lý có khả năng tính toán cao không còn là một vấn ñề mới mẻ trên thế giới, nhưng với Việt Nam nó vẫn ñòi hỏi phải vượt qua những khó khăn nhất ñịnh Trong luận văn này tác giả không có tham vọng thiết kế một bộ vi xử lý có khả năng tính toán cao mà chủ yếu tập trung vào phân tích kiến trúc và thiết kế một vi xử lý ñơn giản Mục ñích chính của tác giả là nắm ñược kiến trúc, quy trình thiết kế, triển khai và kiểm ñịnh một vi xử lý Trên cơ sở ñó tác giả sẽ mở rộng, cải tiến một vài mô ñun, chức năng của vi xử lý ñể nâng cao dần hiệu suất tính toán của vi xử lý Kết quả của luận văn sẽ là tiền ñề ñể tác giả có thể phát triển những vi xử lý mới có tốc ñộ xử lý cao hơn
Luận văn sẽ bắt ñầu với việc tìm hiểu về xu hướng cũng như những loại thiệt bị lôgic lập trình ñược hiện nay, tìm hiểu, thiết kế tập lệnh, datapath và bộ ñiều khiển cho một vi xử lý 8 bít ñơn giản dựa trên kiến trúc RISC với 33 lệnh trong tập lệnh, tiến hành triển khai bằng ngôn ngữ Verilog và mô phỏng kiểm tra chức năng của vi xử lý bằng phần mềm ModelSim Mục ñích chính của phần ñầu này là hiểu về quy trình thiết kế và xây dựng môi trường phát triển Sau ñó tác giả sẽ cải tiến dần vi xử lý ñể có thể có khả năng tính toán tốt hơn, như áp dụng kĩ thuật ñường ống pipeline, nâng ñộ sâu của bộ nhớ stack,
mở rộng không gian nhớ của bộ nhớ chương trình và bộ nhớ dữ liệu dùng kĩ thuật banking Cuối cùng thực hiện tổng hợp thiết kế trên kít FPGA DE2 của Altera và chạy thử các chương trình nhỏ Phần cuối cùng tác giả sẽ trình bày về một ứng dụng nhỏ sử dụng
vi ñiều khiển vừa ñược thiết kế Kết quả cho thấy, vi ñiều khiển có thể thực hiện ñúng ñược những chức năng cơ bản
Trang 7Chương 1 TỔNG QUAN VỀ FPGA
1.1 Gii thi u chung
Ngày nay việc sử dụng một hệ FPGA ñang là một ñề tài rất ñược quan tâm trên thế giới, sở dĩ như vậy là do các lý do cơ bản sau:
- Do sự phát triển rất nhanh của công nghệ bán dẫn, giá thành của chip FPGA ngày càng rẻ
- Việc sử dụng chip FPGA ñể phát triển sản phẩm sẽ rút ngắn ñược rất nhiều thời gian thiết kế cũng như thời gian ñưa sản phẩn ra thị trường so với một số phương pháp thiết kế truyền thống như ASIC
- Sử dụng công nghệ FPGA ñể verification một thiết kế ASIC cũng rút ngắn ñược rất nhiều thời gian simulation cũng như giảm ñược nhiều giá thành và công sức thiết kế
Dưới ñây trình bày sơ lược về các thiết bị logic khả trình cũng như quy trình thiết
kế dựa trên công nghệ FPGA, sở dĩ tác giả chỉ tập trung vào giới thiệu quy trình thiết kế dựa trên công nghệ FPGA là do tác giả sẽ sử dụng chip FPGA của Altera ñể thử Prototype thiết kế của tác giả Phần ñầu tiên của chương này sẽ giới thiệu về các thiết bị PLD: khái niệm PLD, quá trình phát triển của các thiết bị PLD, cấu trúc của một vài loại thiết bị PLD và FPGA, công nghệ chế tạo cũng như tính năng và ứng dụng
1.2 Tng quan v thit b logic kh trình – PLD
Field Programmable Device (FPD) – Một thuật ngữ chung ñể chỉ bất cứ loại mạch tích hợp nào ñược sử dụng ñể thực thi một phần cứng số, mà ở ñó con chip có thể ñược cấu hình lại bởi người dùng cuối nhằm thu ñược một thiết kế mới Người dùng có thể cấu hình lại cho thiết bị ngay tại nơi thiết bị ñược sử dụng mà không cần ñem thiết bị cho nhà sản xuất thực hiện việc cấu hình Lập trình cho các thiết bị trên bao gồm việc ñưa con chip vào một thiết bị lập trình ñặc biệt (nạp cấu hình), nhưng một số khác có thể cấu hình ngay trên hệ thống (ISP – In System Programming) Một tên gọi khác của FPD là Programmable Logic Devices (PLD) Sau ñây ta sẽ ñi tìm hiểu kỹ hơn về các thiết bị PLDs cụ thể
PLD – Programable Logic Device là thiết bị logic số lập trình ñược, PLD ñược ñưa ra giới thiệu vào khoảng giữa thập kỷ 70, bắt nguồn từ ý tưởng chế tạo ra một mạch logic tổ hợp có khả năng tái lập trình lại phần cứng (khả trình), nhằm phục vụ cho việc thử nghiệm, tạo mẫu, phát triển ứng dụng, sản xuất ở quy mô nhỏ
Trang 8Khác với vi xử lý, vi ñiều khiển hay các loại IC số ñã có trước ñây là chạy chương trình lập trình nhưng trên một phân cứng cố ñịnh, khả năng tái lập trình của PLDs nhằm ñạt ñến sự thay ñổi ở mức phần cứng Nói theo cách khác, một PLDs là một chip ña mục ñích, có thể tái cấu hình lại phần cứng nhiều lần tùy theo ứng dụng khác nhau
PLDs ñầu tiên là các thiết bị PAL – Programmable Arrays Logic (Mảng logic khả trình) hay PLA Các thiết bị này chỉ sử dụng các cổng logic số AND, OR (không có các flip-flop), cho phép thực hiện các mạch logic tổ hợp và không thực hiện ñược logic dãy
ðể khắc phục nhược ñiểm này, các thanh ghi cho PLD ñã ñược ñưa ra nhằm thêm vào mỗi ñầu ra một flip-flop, do ñó có thể thực hiện ñược các hàm logic dãy ñơn giản
ðầu thập niên 1980s, một mạch logic mới ñược ñưa vào các ñầu ra của PLD Cấu trúc tế bào ñầu ra mới gọi là Macro Cell, chứa ñựng các flip-flop, cổng logic và bộ dồn kênh (MUX) Sự cải tiến này ñem lại cho PLDs khả năng linh hoạt hơn trong các thiết kế Kiến trúc mới của PLDs ñược gọi là GAL – generic PAL
Các PLA, PAL, GAL ñược gọi chung là thiết bị logic khả trình ñơn giản – Simple PLDs (SPLD) ðến các thế hệ tiếp sau, một vài GAL ñược chế tạo ra, có cấu trúc phức tạp hơn, sử dụng công nghệ bán dẫn tiên tiến và nhiều tính năng hơn (như chuẩn JTAG, giao diện logic với nhiều chuẩn logic khác nhau …) Một thế hệ các thiết bị PLD mới ra ñời và ñược biết tới là thiết bị logic số khả trình phức tạp - Complex PLD (CPLD) CPLD
có mật ñộ tích hợp cao, hiệu suất cao, giá thành thấp (có CPLD giá dưới 1USD)
ðến giữa thập kỷ 80, FPGAs (Field Programmable Gate Arrays) ñược ñưa ra giới thiệu FPGA có nhiều ñiểm khác biệt với CPLD về kiến trúc, công nghệ, tính năng ñi kèm
và về giá thành FPGA nhắm tới những thiết bị mạch logic cỡ lớn, hiệu suất cao
FPGA (Field Programmable Gate Arrays)
Bảng 1 - 1: Tóm tắt về các thiết bị PLD
Trang 9Trong các phần tiếp theo ta sẽ ñi tìm hiểu về 2 loại thiết bị PLD ñó là các thiết bị PLD ñơn giản (SPLD) và thiết bị PLD phức tạp (CPLD, FPGA)
1.3 Thit b logic kh trình ñ$n gin – Simple PLD
Như ñã ñề cập ở trên, các thiết bị PAL, PLA và GAL ñược gọi chung là các thiết bị logic khả trình ñơn giản – Simple PLD Dưới ñây sẽ trình bày cụ thể cấu trúc của mỗi loại SPLDs
1.3.1 Thiết bị PAL
PAL – Programmable Array Logic chip ñược ñưa ra giới thiệu bởi Monolithic Memories khoảng giữa thập kỷ 70 Cấu trúc của PAL: Mảng cổng AND khả trình, theo sau là các cổng OR cố ñịnh Các ñầu vào ñược nối ñến các cổng AND thông qua ma trận các ñiểm nối lập trình ñược, ñầu ra của các cổng AND ñưa ñến cổng OR và ñến ñầu ra Hình dưới ñây mô tả cấu trúc của một PAL (Hình 2.1)
Với cấu trúc phần cứng ñó, khả năng của PAL là chỉ cho phép thực hiện các hàm
M
mm
m
x= 1+ 2+ + với m = fi(a1,a2, aN) lấy ví dụ:
5 4 3 2 1 4 3 2 2
Một ví dụ ñiển hình cho các thiết bị PAL thông dụng là chíp PAL16L8 có 16 ñầu vào, 8 ñầu ra nhưng với kiểu ñóng vỏ PDIP-20 nên chỉ có 10 chân là vào cho tín hiệu, 2 chân ra cho tín hiệu và 6 chân vào/ra
1.3.2 Thiết bị PLA
ðưa ra giới thiệu vào giữa những năm 70 bởi hãng Signetics Cấu trúc PLA khác với PALs ở chỗ, các thiết bị PLAs có mảng kết nối AND và OR ñều lập trình ñược, ñem lại cho PLA tính linh hoạt hơn PAL trong các thiết kế logic số
Nhược ñiểm: Số ñiểm nối nhiều dẫn ñến tốc ñộ chậm
Một PLA ñiển hình là Signetics PLS161 với 12 vào và 8 ra Công nghệ chế tạo ra PLA giống với công nghệ chế tạo PAL Mặc dù ngày nay các thiết bị PLA ñã cũ, xong chúng lại ñược xuất hiện trở lại gần ñây như là một khối kiến trúc trong họ CPLDs tiêu thụ năng lượng thấp, họ CoolRunner (Xilinx)
Trang 10Hình 1 - 1 Cấu trúc một thiết bị PAL.
Hình 1 - 2 Cấu trúc một thiết bị PLA
Kết nối lập trình ñược
Trang 111.3.3 Thiết bị GAL
ðược giới thiệu bởi Lattice vào ñầu những năm 1980
Thiết bị GAL ra ñời có nhiều cải tiến quan trọng trong cấu trúc so với 2 loại PLD trước ñó là PAL, PLA ở các ñiểm sau:
Mỗi MC chứa 1 FF, một vài cổng và một bộ MUX
Hình dưới trình bày cấu trúc của GAL (Hình 1.3)
Hình 1 - 3: Cấu trúc chip GAL 16V8
Trang 12GAL16V8 có 16 ñầu vào và 8 ñầu ra ñược bố trí ñóng vỏ 20 chân, 8 vào và 8 vào/ra Mỗi ñầu ra có một MC
GAL sử dụng công nghệ CMOS, EEPROM hay Flash và tốc ñộ có thể lên tới 250MHz
Một số nhà sản xuất GAL: Lattice, Atmel, TI…
1.4 Thit b logic kh trình ph*c t+p – Complex PLD
Sự ra ñời của các thiết bị số khả trình phức tạp – CPLD và FPGA là một cuộc cách mạng trong ngành công nghiệp ñiện tử Một thiết kế logic phức tạp với hàng chục, hàng trăm các loại cổng logic cùng với ñó là các vấn ñề về nguồn tiêu thụ, trễ truyền ñạt, tính
ổn ñịnh của hệ thống…tất cả sẽ ñược tích hợp trong một linh kiện số duy nhất
CPLDs là thiết bị PLD có cấu trúc phức tạp hơn các SPLDs khác Bên trong mỗi CPLD chứa ñựng nhiều PLDs khác ( thường thuộc loại GAL ) ñược chế tạo như là một chip ñơn Ngoài ra, CPLD còn một ma trận chuyển mạch ñể kết nối các PLDs với các ñầu vào ra Chức năng của CPLD bao gồm:
Mỗi ñầu ra có kết nối ñến các Macrocells
Có thêm tính năng như JTAG
Hỗ trợ chuẩn giao tiếp với các mức logic khác nhau: 1V8, 2V5, 3V3, 5V
Hình 1 - 4: Cấu trúc chung của một CPLD
ðể làm rõ hơn, ta ñi vào phân tích thêm cấu trúc CPLD họ XC9500 của hãng Xilinx Mỗi một CPLD gồm có nPLD mà ở ñây mỗi PLD chính là GAL36V18 (giống như kiến trúc của GAL16V8, nhưng có 36 ñầu vào và 18 ñầu ra, thay vì 16 ñầu vào và 8 ñầu ra của GAL16V8, do ñó GAL36V18 có 18 Macrocells cho mỗi ñầu ra) Khối I/O
Trang 13Blocks quản lý các chân vào/ra dữ liệu của PLD Khối kết nối giữa các I/O Blocks và GAL36V18 là một ma trận chuyển mạch tốc ñộ cao (Fast CONNECT II Switch Matrix) Chính nhờ cấu trúc linh hoạt và tốc ñộ kết nối cao (Trễ truyền ñạt chỉ cỡ 5nS), các thiết bị CPLD là một giải pháp thay thế cho các mạch số cồng kềnh, tốc ñộ chậm, làm tăng hiệu năng hệ thống và tăng tốc ñộ xử lý thông tin
Hình 1 - 5 Cấu trúc CPLD XC9500 của XilinxMột số nhà cung cấp các linh kiện PLD và CPLD
Trang 14Dưới ñây là bảng liệt kê một số loại CPLDs do 2 hãng cung cấp lớn trên thế giới là Xilinx và Altera
Bảng 1 - 2 Altera CPLD
Bảng 1 - 3 Xilinx CPLD
Trang 151.5 FPGA Ờ Field Programmable Gate Arrays
1.5.1 Giới thiệu về FPGA
FPGA ựược ựưa ra giới thiệu lần ựầu tiên giữa những năm 1980 bởi Xilinx FPGA
là từ viết tắt của Field Programmable Gate Arrays Ờ Mảng cổng khả trình FPGA cũng là một thiết bị FPD mà ta ựã ựề cập ở trên Từ ỘFieldỢ trong thuật ngữ FPGA bao hàm ý nghĩa về khả năng tái cấu hình lại phần cứng cho FPGA bởi người dùng cuối (enduser) ngay tại nơi sử dụng mà không cần mang trở lại cho nhà sản xuất cấu hình đó chắnh là một ựiểm mạnh của FPGA cũng như các thiết bị PLD khác
Ross Freeman, người ựồng sáng lập ra hãng Xilinx, phát minh ra FPGA vào năm
1984 FPGA bắt nguồn từ sự phát triển của thiết bị logic khả trình phức tạp (CPLD_Complex Programmable Devices) có từ giữa những năm 80 của thế kỉ 20 CPLD
và FPGA ựều chứa một số lượng lớn các thành phần logic khả trình có liên quan ựến nhau Trong khi mật ựộ cổng logic trong CPLD chỉ có vài nghìn ựến vài chục nghìn thì trong FPGA có khoảng từ vài chục nghìn ựến vài triệu cổng
FPGA có nhiều khác biệt so với CPLDs về cấu trúc, công nghệ lưu trữ, tắnh năng
hỗ trợ và giá thành, hiệu suất cao, cho phép thực hiện những mạch tắch hợp cỡ lớn FPGA
là một vi mạch chứa các logic cells Mỗi logic cells thực hiện chức năng của các mạch logic và ựược kết nối với nhau bởi ma trận kết nối và chuyển mạch lập trình ựược FPGA
là tập hợp các phần tử rời rạc ựược kết nối theo một cách chung
Một ựiểm khác biệt cần chú ý giữa FPGA và CPLD là sự có mặt của các hệ nhúng trong hầu hết các sản phẩm FPGA Sự khác biệt quan trọng là có nhiều FPGA hiện ựại hỗ trợ ựầy ựủ hoặc một phần khả năng cấu hình lại trong hệ thống, cho phép thiết kế có thể ựược thay ựổi cũng như nâng cấp hệ thống hoặc cho việc cấu hình ựộng trở lại như là một phần bình thường của hệ ựiều hành Một vài FPGA có khả năng cấu hình riêng cho phép một phần của thiết bị ựược lập trình lại trong khi những phần khác vẫn hoạt ựộng bình thường
Xu hướng phát triển gần ựây là việc kết hợp các khối logic, các liên kết trong FPGA truyền thống với vi xử lý nhúng và những ngoại vi có liên quan ựể tạo nên một Ộhệ thống trên một chip khả trìnhỢ hoàn thiện Ta có thể tìm thấy những thiết kế ựó trong một
số thiết bị Xilinx Virtex-II PRO và Virtex-4 có chứa một hoặc nhiều lõi xử lý nhúng Power PC trong phạm vi kết cấu logic của FPGA Atmel FPSLIC là một thiết bị tương tự cũng có lõi vi xử lý AVR kết hợp với cấu trúc logic khả trình của Atmel Ngoài các lõi vi
xử lý cứng còn có các lõi vi xử lý mềm là một thành phần trong phạm vi tài nguyên logic của FPGA Những lõi này bao gồm: Xilinx MicroBlaze và Pico Blaze, vi xử lý Altera
Trang 16Nios và Nios II, và nguồn mở LatticeMicro32 và LatticeMicro 8, giống như là lõi xử lý thứ 3
Nhiều FPGA hiện ñại có khả năng ñể lập trình lại trong khi ñang hoạt ñộng, và ñiều này rất quan trọng cho ý tưởng của việc tính toán cấu hình lại hoặc hệ thống cấu hình lại ñể tự cấu hình lại phù hợp với hoạt ñộng sắp tới Những công cụ FPGA hiện nay chưa hoàn toàn hỗ trợ ñầy ñủ cho phương thức này Hiện nay FPGA không có cấu trúc ñang bắt ñầu xuất hiện Vi xử lý cấu hình phần mềm như Stretch S5000 chọn hướng tiến ñến
hệ lai bằng cách cung cấp một mảng các lõi xử lý và FPGA giống như lõi khả trình trên cùng một chip Các thiết bị khác cung cấp các mảng của các ñối tượng khả trình cấp cao nằm giữa khỗi logic của FPGA và các xử lý phức tạp
1.5.2 Kiến trúc của FPGA
Hình dưới trình bày cấu trúc cơ bản của một FPGA (Hình 1 - 6)
Hình 1 - 6: Cấu trúc chung của FPGA
Kiến trúc cơ bản của một FPGA gồm có:
Trang 17Khối CLB: Cấu trúc bên trong của các CLBs rất khác biệt so với PLD ðầu tiên, thay vì sử dụng các cổng logic AND và OR như trong các SPLD, mỗi CLB hoạt ñộng dựa trên một LUT (Lookup Table) – Bộ tạo hàm Nhiệm vụ của LUT là xác ñịnh giá trị các ñầu ra dựa trên giá trị của các ñầu vào
Trang 18Hình 1 - 8: Cấu trúc một Logic Cell trong Spartan-IIEKhối vào ra – IOB: Tín hiệu vào ñi qua 1 bộ ñệm, tín hiệu ra qua bộ ñệm 3 trạng thái, theo các chuẩn, bộ nhớ/giao tiếp Bus Mỗi IOB gồm 3 Flip-Flop chia chung 1 tín hiệu Clock và các tín hiệu CE (Clock Enable), ñiều khiển ñộc lập cho từng Flip-Flop
Hình 1 - 9 Cấu trúc IOB trong Spartan-IIE
Ma trận chuyển mạch: Như ta thấy trên hình 1-11, ma trận chuyển mạch bao gồm vô số các dây nối, các kênh liên kết ñan chéo ngang dọc bên trong FPGA bao quanh
Trang 19các CLB (kênh ngang và kênh dọc) Các CLB thông qua mạng chuyển mạch và thuật toán ñịnh tuyến có thể kết nối ñến bất kỳ một CLB nào khác
Tại ñiểm phân cắt của kênh ngang và kênh dọc ñều có một hộp chuyển mạch Trong cấu trúc này, khi một dây ñi vào một hộp chuyển mạch, có 6 công tắc khả trình cho phép nó kết nối ñến các dây còn lại trong các ñoạn liền kề Mô hình topology của chuyển mạch sử dụng trong cấu trúc này là phẳng hoặc trong phạm vi cấp cơ sở của topology hộp chuyển mạch Trong topology hộp chuyển mạch này, một dây trong track số một chỉ nối với dây trong track số một của các ñoạn liền kề, những dây trong track 2 chỉ nối với những dây trong track 2, và cứ tiếp tục như vậy Hình 1-10 dưới ñây sẽ mô tả những liên kết trong một hộp chuyển mạch:
Hình 1 - 10: Liên kết trong một chuyển mạch
Hình 1 - 11 Mạng liên kết giữa các CLB
Các kết nối trực tiếp: Trong FPGA, việc kết nối giữa các CLB thông qua mạng chuyển mạch, còn có các kết nối trực tiếp khác ñó là:
Trang 20- Kết nối giữa CLB liền kề
Hình 1 - 12 Các kết nối trực tiếp giữa các khối trong FPGA
Hình 1 - 13 FPGA Spartan IIE của Xilinx
1.5.3 Các khối chức năng của FPGA và ứng dụng FPGA
Các khối chức năng của FPGA:
Trang 21- FPGA có số lượng flip-flop gấp nhiều lần so với CPLDs, cho phép FPGA thực hiện ñược các hàm logic dãy phức tạp
FPGA sử dụng công nghệ nhớ SRAM (với CPLDs là EEPROM và Flash) ñể lưu cấu hình do ñó giảm giá thành và tăng khả năng kết nối, nhưng cũng vì vậy mà dữ liệu bị mất khi mất ñiện FPGA cần có một PROM ngoài ñể lưu trữ cấu hình Khi khởi ñộng, các cấu hình trong ROM sẽ ñược nạp trở lại vào RAM của FPGA và thực thi chức năng ñã ñược lập trình
Ứng dụng FPGA
Thiết kế mạch logic số hiện ñại theo nhu cầu của người thiết kế
Tạo mẫu trước khi chế tạo vi mạch
Thiết kế các bộ vi xử lý, vi ñiều khiển, thiết kế hệ thống nhúng
Xử lý tín hiệu số DSP
Xử lý ảnh số, Video
Xử lý âm thanh
Truyền thông: Ethernet, mã Turbo, mã Viterbi,Reed – Solomon …
Các giao tiếp PCI, USB
ðiều khiển tự ñộng
Các ứng dụng khác …
Qua chương này ta ñã tìm hiểu về cấu trúc chức năng và hoạt ñộng của một số loại PLD ñơn giản là PAL, PLA và GAL Ta cũng ñã tìm hiểu về kiến trúc của CPLD, một loại PLD có kiến trúc phức tạp hơn so với GAL, là sự tổng hợp của rất nhiều các thiết bị GAL cùng mới ma trận chuyển mạch và các khối vào/ra Sự vượt trội về công nghệ của CPLD ñem lại nhiều lợi ích và tính linh hoạt trong các thiết kế logic số Cũng là một loại PLD, FPGA có nhiều khác biệt so với CPLDs về cấu trúc, công nghệ lưu trữ, tính năng hỗ trợ, giá thành hiệu suất cao, cho phép mạch tích hợp cỡ lớn
Trang 22Chương 2 THIẾT KẾ TẬP LỆNH Tập lệnh có thể ñược hiểu như tập hợp những từ vựng của lệnh ñược hiểu bởi một kiến trúc máy tính nhất ñịnh Nói một cách ñơn giản ñể có thể ra lệnh ñược cho phần cứng máy tính chúng ta cần phải nói chuyện bằng ngôn ngữ của máy tính, có thể hiểu một cách nôm na rằng ngôn ngữ của máy tính chính là các lệnh
2.1 Mô t chung v t6p l nh
Mỗi một lệnh của vi xử lý dài 12 bít, ñược chia thành phần OPCODE, dùng ñể xác ñịnh kiểu lệnh và OPERAND dùng ñể xác ñịnh toán hạng ứng với lệnh ñó Bài toán ñầu tiên ñặt ra với một người thiết kế vi ñiều khiển là thiết kế tập lệnh như thế nào, ñộ dài của mỗi lệnh bằng bao nhiêu, trong một lệnh có bao nhiêu trường, có bao nhiêu kiểu lệnh Trong luận văn này tác giả dựa vào kiến trúc RISC ñể thiết kế vi ñiều khiển, như vậy tập lệnh của vi ñiều khiển cũng phải tuân theo kiến trúc RISC Cụ thể như sau:
vi ñiều khiển 8 bít của MICROCHIP, số lệnh của vi ñiều khiển là 33 lệnh, như vậy ta cần tối thiểu là 6 bít ñể mã hóa trường OPCODE của lệnh
khác nhau gọi là thanh ghi làm việc (Working register) W, toán hạng ñược chọn
có thể thanh ghi này hoặc bất kì một thanh ghi nào ñó trong register file, do ñó cần thêm một bit nữa ñể mã hóa tập lệnh
mã hóa ñịa chỉ register file ñược dùng làm toán hạng trong các lệnh
lệnh có 12 bít
Trong thiết kế này, tất cả các lệnh ñược thực hiện trong một chu kì lệnh (instruction cycle) nhờ vào thực thi kĩ thuật pipeline Chỉ có một trường hợp ngoại lệ là khi thực hiện lệnh rẽ nhánh (branch instruction), nếu ñiều kiện của lệnh ñúng (lệnh rẽ nhánh ñược thực hiện), trong trường hợp này sẽ cần tới hai chu kì lệnh ñể hoàn thành lệnh rẽ nhánh ñó
cần qua bốn chu kì xung nhịp khác nhau, sở dĩ có ñiều này là vì với kiến trúc RISC, một lệnh thường ñược chia ra làm bốn bước: Tìm và nạp lệnh (Innstruction fetch), giải mã lệnh (Instruction Decode), thực hiện lệnh (Execution) và ghi kết quả (Write Back) Bởi vậy nếu với bộ tạo xung nhịp có ñầu ra là 4MHz ñược làm clock cho vi xử lý thì vi xử lý
sẽ thực hiện ñược một lệnh trong 1micro giây Trong trường hợp lệnh rẽ nhánh, vi xử lý
sẽ mất 2µs ñể thay ñổi bộ ñếm chương trình và thực hiện lệnh Như vậy có thể nói rằng ở
Trang 23xung nhịp 4MHz, vi ñiều khiển có thể thực hiện ñược một triệu lệnh trong một giây, nếu như không sử dụng kiến trúc ñường ống Trong trường hợp sử dụng kiến trúc ñường ống, mỗi một lệnh chỉ cần một chu kì xung nhịp ñầu vào ñể hoàn thành lệnh, riêng với các lệnh rẽ nhánh sẽ ñòi hỏi 2 chu kì xung nhịp ñể hoàn thành Do ñó nếu sử dụng kiến trúc pipeline ở xung nhịp 4MHz vi ñiều khiển sẽ thực hiện ñược bốn triệu lệnh trong một giây
2.2 Thit k chi tit t6p l nh
Tập lệnh của vi xử lý ñược chia ra làm ba kiểu ñịnh dạng (ba lớp lệnh) gồm các lệnh hướng byte (byte – oriented), các lệnh hướng bít (bit-oriented) và các lệnh ñiều khiển
- Các lệnh hướng byte gồm toàn bộ những lệnh mà toán hạng của nó là 1 byte và lệnh sẽ ñược thực hiện trên một byte (ñầu vào và ñầu ra của lệnh ñều là một byte) Lệnh hướng byte thường là những lệnh ñể thực hiện các tính toán ñối với những toán hạng có ñộ rộng là 1 byte ðịnh dạng của các lệnh hướng byte như sau:
o d: 1 bít dùng ñể chỉ toán hạng ñích, khi d = 0 toán hạng ñích sẽ là thanh ghi
W (working register), khi d = 1 ñích sẽ là thanh ghi trong register file ñược xác ñịnh bởi 5 bít trong trường f
o f: 5 bít dùng ñể xác ñịnh ñịa chỉ của thanh ghi toán hạng trong register file
- Có tất cả 18 lệnh hướng byte trong tập lệnh của vi ñiều khiển ñược chỉ ra như bảng dưới 2-1
- Các lệnh hướng bít: Là các lệnh dùng ñể thay ñổi các bít trong thanh ghi W hoặc thay ñổi các bít trong register file f Các lệnh hướng bít thường rất hay ñược sử dụng trong các ứng dụng vi ñiều khiển do phần lớn các ứng dụng của vi ñiều khiển là những ứng dụng ñơn giản, ñầu vào cũng như ñầu ra thường chỉ là một bít ðịnh dạng của các lệnh hướng bít như sau:
Trang 2411 8 7 5 4 0
Hình 2- 2 ðịnh dạng các lệnh hướng bít
Bảng 2- 1: Các lệnh hướng byte của vi ñiều khiển
- OPCODE: 6 bít là trường ñể xác ñịnh opcode của các lệnh tương ứng
- OPERAND: gồm hai trường:
o b: 3 bít dùng ñể xác ñịnh 1 bít xác ñịnh trong một byte cần thay ñổi
o f: 5 bít dùng ñể xác ñịnh ñịa chỉ của register file, chính là byte mà lệnh hướng bít này muốn thay ñổi giá trị một bít trên ñó
- Có 4 lệnh hướng bít ñược chỉ ra như trong bảng dưới ñây
Trang 25STT Mnemonic Operand Mô tả Cycles Opcode Cờ
Bảng 2- 2: Các lệnh hướng bít của vi ñiều khiển
- Các lệnh ñiều khiển: Là các lệnh dùng ñể ñiều khiển chương trình như các lệnh
rẽ nhánh, gọi chương trình con… Các lệnh ñiều khiển có một ñịnh dạng chung, trừ lệnh goto như ñược mô tả dưới ñây
Trang 26STT Mnemonic Operand Mô tả Cycle Opcode Cờ
NOR một giá trị với thanh ghi
W và lưu trữ kết quả trong
thanh ghi W
Bảng 2- 3: Các lệnh rẽ nhánh của vi ñiều khiểnNhư vậy chương này ñã mô tả khái quát cách thiết kế tập lệnh và mô tả tổng quan toàn bộ 33 lệnh của vi ñiều khiển Việc thiết kế tập lệnh là bước ñầu tiên trong tiến trình thiết kế một vi ñiều khiển, bước này rất quan trọng vì nó sẽ quyết ñịnh tới toàn bộ những bước tiếp theo như thiết kế luồng dữ liệu và ñiều khiển, thiết kế các thể hiện của bộ nhớ
Trang 27Chương 3 THIẾT KẾ KIẾN TRÚC VI XỬ LÍ
3.1 Gii thi u
Thiết kế một hệ thống máy tính, trong trường hợp này là một vi ñiều khiển thường rất phức tạp Cũng giống như thiết kế các hệ thống khác, việc ñầu tiên sau khi ñã hiểu rõ ñược yêu cầu của hệ thống và tập lệnh của nó ta phải thiết kế kiến trúc của nó Chương này sẽ trình bày kiến trúc của vi ñiều khiển ñược sử dụng Kiến trúc của vi ñiều khiển sử dụng kiến trúc rất thông dụng, kiến trúc RISC Chúng ta có thể thấy ñược kiểu kiến trúc này trong rất nhiều cuốn sách kinh ñiển về hệ thống máy tính cũng như kiến trúc máy tính Trong chương này, tác giả sẽ tập trung mô tả kiến trúc máy tính ñược sử dụng cho
vi ñiều khiển ñã ñược thiết kế Có thể hiểu nôm na kiến trúc của máy tính gồm hai phần, kiến trúc của các luồng dữ liệu (datapath) và kiến trúc của bộ ñiều khiển (Control) Chương này sẽ mô tả cả hai khối cơ bản này
Datapath bao gồm các ñơn vị chức năng khác nhau và thành phần lưu trữ Các ñơn vị chức năng như bộ cộng, bộ trừ và khối logic và toán học (ALU) thực hiện một hoạt ñộng logic hoặc toán học [1] Thành phần lưu trữ ( register và register file) là thành phần cần thiết ñể lưu trữ dữ liệu trong datapath, ñặc biệt là với kiến trúc pipleline, sau mỗi pha của quá trình thực hiện lệnh, kết quả tạm thời lại phải lưu trữ ñể dùng cho những pha sau ñó Datapath cho ta thấy ñược luồng dữ liệu bên trong CPU ví dụ như làm thế nào ñể ghi dữ liệu vào registers và xử lý bởi các ñơn vị chức năng, tại thời ñiểm nào, chu kì xung nhịp thứ bao nhiêu, dữ liệu sẽ ñược ghi hoặc ñược ñưa tới mộ bộ phận chức năng trong datapath
Phần ñiều khiển ñược dùng ñể ñiều khiển luồng dữ liệu hoặc ñiều khiển cách dữ liệu ñược xử lý trên datapath [1] ðầu vào của mô ñun ñiều khiển chính là các lệnh (OPCODE, OPERAND) Dựa vào các trường trong lệnh, mô ñun ñiều khiển phải quyết ñịnh những hành ñộng cụ thể của các thành phần chức năng trên datapath cũng như ñường ñi dữ liệu trên datapath ở các xung nhịp tiếp theo
Ví dụ hình 3-1 Chỉ ra datapath chứa hai thanh ghi R0, R1 và bộ cộng/trừ Datapath này có thể cộng (trừ) nội dung của R0 với R1 và chứa kết quả vào R0 Bộ Controller ñiều khiển datapath ñể thực hiện cộng hoặc trừ thông qua tín hiệu add_sub
Trang 28Hình 3- 1: Một datapath ñơn giản và mô ñun ñiều khiển tương ứng
3.2 Thit k datapath và ñiu khi8n cho RICS
3.2.1 Giới thiệu chung
Phần này chúng ta sẽ tiếp cận một phương pháp thiết kế datapath và ñiều khiển cho các vi xử lý có kiến trúc giống RISC ðể ñơn giản chúng ta chỉ thiết kế một mô hình cho một số lệnh cơ bản của kiến trúc RISC, lệnh cộng và trừ, các lệnh di chuyển dữ liệu Các lệnh khác ñược thiết kế dựa trên mô hình cơ bản này Hầu hết toàn bộ những gì chúng ta cần làm ñể thực thi những lệnh ñược nêu ra ở chương trước là như nhau, không phụ thuộc vào lớp (kiểu) lệnh ðể thực hiện một lệnh của vi ñiều khiển, lệnh ñược chia ra làm nhiều bước thực hiện lệnh khác nhau, thường là chia ra làm bốn bước, mỗi một bước thực hiện một nhiệm vụ xác ñịnh Việc chia nhỏ một lệnh ra làm nhiều bước khác nhau rất có lợi, vì như vậy sẽ làm cho quá trình thiết kế trở nên ñơn giản và ñặc biệt là chia nhỏ các lệnh làm nhiều bước sẽ rất dễ dành áp dụng kĩ thuật pipeline ñể nâng cao hiệu suất của vi xử lý Số bước ñể hoàn thành một lệnh chính là ñộ sâu của pipeline và cũng chính
là số lệnh có thể thực hiện ñồng thời Ví dụ với vi ñiều khiển này ñược chia ra làm 4 bước khác nhau như ñược trình bày trong chương trước, như vậy nếu không có lệnh rẽ nhánh, kiến trúc pipeline sẽ cho phép hệ thống thực hiện ñược bốn lệnh trong cùng một thời ñiểm
Cụ thể về vấn ñề này sẽ ñược trình bày trong phần sau Dưới ñây ta sẽ phân tích nhiệm vụ của vi ñiều khiển tương ứng với bốn bước thực hiện lệnh ðối với toàn bộ các lệnh của vi
xử lý, hai bước ñầu tiên thực hiện lệnh là giống nhau hoàn toàn
bước này là gửi bộ ñếm chương trình (Program Counter) PC ñến bộ nhớ chứa mã lệnh (bộ nhớ chương trình) và lấy lệnh từ trong bộ nhớ ñó, nạp giá trị vừa nạp ñược vào thanh ghi lệnh và tăng ñịa chỉ của lệnh (PC) lên
1
Trang 29- Bước hai: Giải mã lệnh và ñọc thanh ghi ðọc một hoặc hai thanh ghi, sử
dụng các trường trong lệnh ñể lựa chọn thanh ghi ñể ñọc ðối với một số lệnh ta cần chỉ ñọc một thanh ghi như lệnh goto, call nhưng hầu hết các lệnh ñều ñòi hỏi phải truy cập tới hai thanh ghi trong register file Ví dụ lệnh movwf PORTB sẽ truy cập tới hai thanh ghi W và thanh ghi chứa giá trị cổng B
Sau hai bước trên, những bước tiếp theo ñể hoàn thành một lệnh phụ thuộc vào lớp lệnh Một ñiều rất may mắn là ñối với những lớp lệnh này ( các lệnh hướng byte, hướng bit, lệnh ñiều khiển) thì số lượng bước ñể hoàn thành là giống nhau, không phụ thuộc vào opcode của lệnh, ñiều này rất quan trọng vì nó làm cho thiết kế ñơn giản ñi rất nhiều
Thậm chí ñối với những lớp lệnh khác nhau vẫn có một số ñiểm tương ñồng, ví dụ hầu hết các lệnh khác nhau ngoại trừ lệnh goto ñều sử dụng bộ logic và số học ALU sau khi ñọc các thanh ghi từ register file Tới ñây chúng ta thấy rằng việc thiết kế tập lệnh là rất quan trọng bởi với một thiết kế tập lệnh phù hợp sẽ làm ñơn giản quá trình thiết kế bằng việc làm cho quá trình thực thi của rất nhiều lệnh là tương tự nhau
Sau khi sử dụng ALU ñể tính kết quả ñầu ra, bước tiếp theo ñể hoàn thành một lệnh là rất khác nhau ở những lớp lệnh khác nhau, ví dụ các lệnh về số học ñòi hỏi truy cập tới các thanh ghi trong register file ñể ghi dữ liệu lên ñó, trong khi các lệnh ñiều khiển như lệnh goto lại thay ñổi giá trị của bộ ñếm chương trình tới một ñịa chỉ nào ñó, các lệnh
rẽ nhánh có ñiều kiện lại phải kiểm tra ñiều kiện, nếu ñiều kiện ñúng thì sẽ nhảy tới ñịa chỉ xác ñịnh, nếu không giá trị của bộ ñếm chương trình sẽ nhận giá trị tăng lên 1
Hình 3-2 chỉ ra hình ảnh tổng quan của một kiến trúc vi ñiều khiển, tập trung vào các khối chức năng khác nhau và kết nối giữa chúng Mặc dầu hình này chỉ ra hầu hết các luồng dữ liệu trong bộ vi xử lý, nó ñã loại bỏ hai khía cạnh quan trọng của việc thực thi một lệnh ñó là:
cụ thể như là từ hai nguồn khác nhau Ví dụ giá trị ghi tới bộ ñếm chương trình PC có thể ñược tới từ bộ cộng hoặc tới từ giá trị thanh ghi ñọc ra từ
bộ nhớ chương trình, hai ñầu vào của bộ ALU cũng có thể ñến từ nhiều nguồn khác nhau Trong thực tế những ñường dữ liệu này không thể ñơn giản nối với nhau như vậy, chúng ta cần phải dùng thêm một thành phần khác ñể lựa chọn ñầu vào cho chúng, việc lựa chọn này thường ñược thực hiện bởi một thiết bị ñó là bộ hợp kênh (Multiplexer) Bộ hợp kênh này sẽ lựa chọn ñầu vào thích hợp từ nhiều ñầu vào khác nhau dựa vào tín hiệu ñiều khiển Những ñường ñiều khiển này ñược thiết lập cơ bản là dựa vòa những thông tin ñược lấy ra từ lệnh ñang ñược thực hiện Chi tiết về việc
Trang 30sử dụng các bộ hợp kênh này trong việc thiết kế vi xử lý có thể xem trong chương mô tả về thiết kế và mô phỏng vi ñiều khiển
lệnh rẽ nhánh phải ghi dữ liệu từ thanh ghi lệnh lên thanh ghi bộ ñếm chương trình trong khi các lệnh logic và số học phải ghi giá trị kết quả lên thanh ghi trong register file tương ứng Cũng giống như bộ hợp kênh, ta cũng cần phải có các ñường ñiều khiển mà tín hiệu của nó ñược suy ra từ nhiều trường khác nhau của lệnh hiện thời ðể làm ñược nhiệm vụ ñó ta cần phải có một bộ ñiều khiển, trong luận văn này ta gọi là bộ ñiều khiển
Hình 3- 2: Tổng quan về kiến trúc của vi ñiều khiểnHoạt ñộng của một bộ vi xử lý ñơn giản có thể ñược mô tả như sau: Toàn bộ các lệnh ñược bắt ñầu bằng cách sử dụng bộ ñếm chương trình PC ñược dùng như ñịa chỉ của lệnh, ñưa giá trị này vào làm ñịa chỉ cho bộ nhớ chương trình Sau khi lệnh ñã ñược nạp các toán hạng thanh ghi ñược sử dụng bởi lệnh và ñược xác ñịnh bằng các trường ở trong lệnh ,ví dụ trường d trong lệnh xác ñịnh toán hạng là thang ghi W hay các thanh ghi khác trong register file, trường f trong lệnh xác ñịnh thanh ghi nào trong 32 thanh ghi ñược chọn làm toán hạng
Ngay khi các thanh ghi toán hạng ñược nạp từ register file, chúng có thể ñược sử dụng ñể tính toán một kết quả số học, logic hoặc sử dụng ñể so sánh trong các lệnh rẽ nhánh Nếu như lệnh là các lệnh số học thì kết quả của ALU phải ñược ghi vào một thanh
Data
Registers Address Instruction
instruction memory
Trang 31ghi xác ñịnh trong register file Các lệnh rẽ nhánh sẽ sử dụng ALU ñể thực hiện so sánh, kết quả của lệnh so sánh sẽ ñặt hoặc xóa cờ Z của ALU, nếu cờ Z ñược ñặt thì khối ñiều khiển sẽ ñiều khiển ñể ghi giá trị tiếp theo của PC là trường k trong các lệnh rẽ nhánh thay
vì ghi giá trị PC+1 như bình thường
Hình 3- 3: Mô hình ñiều khiển datapathHình 3-3 Chỉ ra ñường dữ liệu của hình 3-2 với hai bộ hợp kênh ñược thêm vào cũng như những ñường ñiều khiển chính cho những khối chức năng cơ bản Khối ñiều khiển sẽ lấy lệnh hiện thời làm ñầu vào ñể xác ñịnh làm thế nào ñể thiết lập các giá trị trên ñường ñiều khiển cho những khối chức năng (Register file, ALU) và các bộ hợp kênh
Các ñơn vị chức năng trong RISC bao gồm 2 thành phần logic: thành phần xử lý giá trị dữ liệu và thành phần chứa trạng thái Thành phần mà xử lý trên các giá trị dữ liệu
là tổ hợp (combinational), có nghĩa là các giá trị thu ñược chỉ phụ thuộc vào các giá trị ñầu vào ðối với các tín hiệu vào giống nhau thì kết quả ra là giống nhau Thành phần còn lại trong thiết kế không phải là tổ hợp nhưng chứa trạng thái (state) Một thành phần có khả năng ghi nhận trạng thái thì có khả năng lưu trữ bên trong Chúng ta gọi chúng là các thành phần trạng thái Nếu chúng ta ghi và khôi phục lại các thành phần trạng thái thì chúng hoạt ñộng giống như khi chưa mất ñiện Vì vậy các thành phần trạng thái mô tả
Data
Register
s
Address Instruction instruction memory
Trang 32hoàn toàn hoạt ñộng của máy Trong hình dưới ñây, bộ nhớ chương trình, bộ nhớ dữ liệu cũng như tất cả các thanh ghi là những ví dụ cơ bản về thành phần trạng thái
3.2.2 Thiết kế cụ thể datapath cho vi ñiều khiển
Một cách hợp lý ñể thiết kế một datapath là tìm kiếm các thành phần quan trọng cần thiết ñể thực hiện các lớp lệnh của vi xử lý, phân tích hoạt ñộng của từng thành phần này Chúng ta hãy bắt ñầu bằng việc tìm kiếm các phần tử cơ bản của datapath dùng cho cho các lệnh và xây dựng datapath từ những phần tử ñó
Phần tử ñầu tiên là bộ nhớ ñể lưu trữ các lệnh của chương trình (Program Memory) Mỗi một từ nhớ trong bộ nhớ chương trình là một phần tử trạng thái ñược dùng
ñể lưu trữ và cung cấp các lệnh tại một ñịa chỉ cho trước Như ñã ñược trình bày trong kiến trúc về tập lệnh của vi ñiều khiển, mỗi một lệnh của vi ñiều khiển có ñộ dài là 12 bít bao gồm Opcode và Operand, do ñó mỗi một từ nhớ trong bộ nhớ chương trình sẽ có ñộ dài là 12 bít ðịa chỉ của lệnh phải ñược lưu trong một phần tử trạng thái ñược gọi là bộ ñếm chương trình (PC – Program counter) Như vậy ta cần phải có một thanh ghi ñể lưu trữ ñịa chỉ của lệnh tiếp theo, thanh ghi PC Tiếp theo chúng ta cần một bộ cộng ñể tăng gia trị của PC ñến ñịa chỉ của lệnh tiếp theo trong chương trình Bộ cộng này là tổ hợp, ñược xây dựng từ ALU, bộ cộng này có chức năng tăng giá trị của thanh ghi PC lên một ñơn vị ñể vi xử lý có thể tự ñộng nạp ñược lệnh tiếp theo sau mỗi chu kì xung nhịp
ðể thực hiện lệnh chúng ta phải bắt ñầu bằng việc tìm kiếm lệnh trong bộ nhớ chương trình ðể chuẩn bị thực hiện lệnh tiếp theo, chúng ta phải tăng bộ ñếm chương trình ñể nó chỉ vào lệnh tiếp theo, ñây là yêu cầu cần thiết ñể thực thi ñược kiến trúc ñường ống
Các thanh ghi của vi ñiều khiển ñược lưu trong một cấu trúc gọi là tệp thanh ghi (register file) Tệp thanh ghi là tập hợp các thanh ghi mà bất kỳ thanh ghi nào cũng có thể ñọc, ghi bằng số của thanh ghi (register number) trong tệp Tệp thanh ghi lưu trạng thái của máy, lưu trữ các giá trị tính toán, các giá trị của các cổng vào ra, giá trị của các thanh ghi chức năng ñặc biệt Thêm vào ñó, chúng ta cần có một bộ xử lý toán học (ALU) ñể thực hiện các phép toán trên các giá trị ñọc ñược từ các thanh ghi
Do các lệnh loại hướng byte có 2 toán tử là thanh ghi, chúng ta phải ñọc hai toán hạng dữ liệu từ tệp thanh ghi và ghi một từ dữ liệu vào tệp thanh ghi ðối với mỗi từ dữ liệu ñược ñọc từ tệp thanh ghi chúng ta phải chỉ ra số của thanh ghi ñược ñọc ðể ghi một
từ nhớ vào tệp thanh ghi chúng ta cần phải có hai tín hiệu vào, một tín hiệu chỉ ra số của thanh ghi ñược ghi dữ liệu (ñịa chỉ của thanh ghi) và tín hiệu còn lại cung cấp dữ liệu cần ghi Các tín hiệu cần ñọc luôn sẵn sàng khi các số của thanh ghi ñược ñặt vào Tuy nhiên, các lệnh ghi thì ñược ñiều khiển bởi một tín hiệu ñiều khiển ghi, ñược ñặt ở mức cao mỗi
Trang 33khi ghi tại một sườn clock Vì vậy chúng ta phải cần 4 giá trị ñầu vào (3 cho số của các thanh ghi và 1 cho dữ liệu) và 2 giá trị ra (cả hai ñều cho dữ liệu)
Hình 3- 4: Bộ nhớ chương trình, PC và module tính PC+1 ñược kết nối với nhau tạo
thành datapath ñơn giản
Hình 3- 5: Tệp thanh ghi (register file)
PC ðịa chỉ lệnh
Bộ nhớ chương trình
ADD
1
Read register 1
Read data 1 Read
Trang 34Hình 3- 6: Bộ logic và số học ALU
Ta ñã có các thành phần cơ bản nhất của luồng dữ liệu của vi xử lý, như vậy thôi thì chưa ñủ, ta còn cần phải có thêm khối ñiều khiển ñể ñiều khiển hoạt ñộng của datapath Khối ñiều khiển sẽ ñược trình bày ở cuối chương này sau khi ñã trình bày xong
về datapath
Tới ñây ta ñã xây dựng xong các thành phần cơ bản nhất của một vi ñiều khiển, bước tiếp theo là ta cần phải kết nối chúng với nhau ñể tạo thành data path của vi ñiều khiển
Chúng ta sẽ bắt ñầu với việt kết nối register file và khối số học và logic (ALU) Hình dưới mô tả sự liên kết giữa các thành phần ñể tạo lên datapath cho lệnh add và sub với lệnh ñã ñược ñọc từ bộ nhớ chương trình ðịa chỉ thanh ghi ñưa vào tệp thanh ghi ñược lấy từ các trường trong mã lệnh cũng như trường d ñể xác ñịnh thanh ghi toán hạng
là thanh ghi W hoặc một thanh ghi nào ñó trong register file, 5 bit trường f ñể xác ñịnh thanh ghi trong tổng số 32 thanh ghi của register file
Hình 3- 7: Kết nối bộ logic và số học với register file
Zero ALU ALU Result
Registers
Write data Instruction Register 1
Register 2
Trang 35Tiếp theo ta sẽ kết nối với các thành phần khác trong vi xử lý ñể tạo ñược một datapath như sau:
Hình 3- 8: Datapath ñơn giản sau khi ñã kết nối các thành phần của vi ñiều khiển với
nhau
Như vậy sau khi kết nối các thành phần cơ bản với nhau ta có ñược datapath ñơn giản của một vi xử lý Từ hình vẽ này ta cũng thấy ñược ñể thực hiện một lệnh của vi xử
lý, lệnh ñược chia ra làm bốn bước khác nhau, ta cũng thấy ñược các thành phần của vi xử
lý sẽ ñược sử dụng trong mỗi bước này Cụ thể như sau:
o Nạp lệnh, bước này sẽ dùng giá trị của bộ ñếm chương trình PC làm ñịa chỉ lệnh ñể chọn giá trị cần ñọc ra từ bộ nhớ chương trình (bộ nhớ chứa các lệnh của chương trình)
o Giá trị của bộ ñếm PC sẽ ñược lựa chọn từ hai nguồn dựa vào bộ Mux Một là giá trị PC+1 chính là ñầu ra của bộ cộng PC, hoặc cũng có thể lựa chọn là giá trị của trường k trong các lệnh rẽ nhánh, chính là ñịa chỉ của lệnh rẽ nhánh
Data
Register
s
Address Instruction instruction memory
Trang 36o Bước này sẽ dựa vào các trường trong lệnh vừa ñược ñọc từ bộ nhớ chương trình trong bước trước ñể quyết ñịnh ñọc thanh ghi nào trong register file, ñịa chỉ của thanh ghi trong register file ñược dựa vào trường f hoặc trường d trong lệnh
o ðọc dữ liệu, thanh ghi tương ứng trong register file và ñưa tới ñầu vào của khối số học và logic ALU
o Bước này sẽ thực hiện tính toán dựa vào hai toán hạng ñầu vào của bộ ALU Trong thiết kế này, bộ ALU thực hiện 16 chức năng cơ bản ñể từ
ñó có thể hoàn thành ñược tập lệnh gồm 33 lệnh của vi ñiều khiển
o Toán hạng thứ nhất của ALU luôn ñược lấy ra từ một thanh ghi trong register file
o Toán hạng thứ hai có thể ñược lựa chọn từ thanh ghi trong register file hoặc trường k trong lệnh Việc lựa chọn này dựa vào một bộ hợp kênh MUX
o Sau khi một lệnh hoàn thành bước 3, kết quả của lệnh ñã có ở ñầu ra của ALU, hầu hết các lệnh sẽ yêu cầu ghi giá trị ñầu ra này vào register file
ñể còn dùng trong các lệnh tiếp theo
o Quá trình Write back sẽ thực hiện ghi kết quả của các phép toán vào thanh ghi tương ứng
Tới ñây ta ñã xây dựng ñược datapath cơ bản của vi ñiều khiển, datapath này ñược chia ra làm bốn bước khác nhau cho phép hoàn thành một lệnh trong bốn chu kì xung nhịp Trong luận văn này tác giả sử dụng kiến trúc ña chu kì ñể thiết kế vi xử lý dựa trên một số ưu ñiểm sau:
ALU có thể ñược dùng nhiều hơn một lần ðiều này cho phép chúng ta có thể giảm số lượng các module phần cứng thực hiện cùng một chức năng ñược dùng trong các bước khác nhau của lệnh vì dụ bộ ALU có thể dùng chung cho bước nạp lệnh ñể tính PC+1 và bước thực thi ñể tính kết quả của phép toán logic và số học
ví dụ trong trường hợp này có thể chia thành nhiều hơn 4 bước ñể thực
Trang 37hiện lệnh, cho phép tăng ñộ sâu của pipeline, nâng cao hiệu quả của vi xử
lý
3.2.3 Pipeline – kĩ thuật nâng cao hiệu suất của CPU
Kĩ thuật ñường ống là một kĩ thuật thực thi cho phép nhiều lệnh của vi xử ñược thực hiện một cách ñồng thời, ngày nay thì kĩ thuật ñường ống chính là chìa khóa ñể thiết kế các bộ vi xử lý chạy với tốc ñộ cao hơn
Ý tưởng của kĩ thuật pipeline như sau:
- Với kiến trúc bình thường các lệnh ñược thực hiện tuần tự, một lệnh chỉ ñược thực hiện khi lệnh trước ñó kết thúc ðiều này rất tốn thời gian của vi xử lý do có những thời ñiểm các khối chức năng của vi xử lý không phải làm gì Ví dụ ñơn giản như khối chức năng thực hiện nạp lệnh, khối này chỉ hoạt ñộng trong chu kì xung nhịp ñầu tiên của vi xử
lý, toàn bộ ba chu kì sau ñó các khối chức năng này không thực hiện nhiệm vụ nào
- ðể nâng cao hiệu xuất của vi xử lý, ta cần phải tối ưu thiết kế sao cho có thể làm cho các khối chức năng của vi xử lý ñược sử dụng trong tất cả các chu kì xung nhịp
- Kĩ thuật pipeline cho phép vi xử lý không cần ñợi lệnh trước ñó hoàn thành mà trong khi thực hiện lệnh trước ñó, vẫn tiến hành nạp lệnh, giải mã lệnh và thực hiện lệnh tiếp theo
Kĩ thuật này cho phép thực hiện ñược một lệnh trong một chu kì xung nhịp nếu như các lệnh thực hiện không phụ thuộc giữ liệu vào nhau hoặc các lệnh thực hiện không phải là lệnh rẽ nhánh
Tập lệnh ñược thiết kế ñể có thể thực hiện ñược kĩ thuật ñường ống
- Trong kĩ thuật ñường ống, thường thì vi xử lý sẽ nạp lệnh mới ở mỗi xung nhịp, do vậy tập lệnh cần phải thiết kế ñơn giản ñể vi xử lý có thể không cần thêm một thông tin nào khác ngoài bộ ñếm lệnh PC mà vẫn nạp lệnh ở mỗi chu kì xung nhịp Mỗi lệnh ở ñây ñều dài 12bit do ñó rất dễ dàng nạp lệnh ở mỗi chu kì xung nhịp và giải mã lệnh ở chu kì xung nhịp tiếp theo
- Tập lệnh ñược thiết kế là tập lệnh rút gọn (kiến trúc RICS) với từng trường trong tập lệnh (opcode, operand) ñược ñịnh nghĩa trước trong những bit xác ñịnh, kiểu ñịnh nghĩa ñối xứng này cho phép pha thứ hai (giải mã lệnh) có thể ñọc register file ở cùng một thời ñiểm mà vi xử lý ñang giải mã xem lệnh nào vừa mới ñược nạp
- Các lệnh liên quan tới bộ nhớ chỉ có hai lệnh là load và store, ñiều này cho phép chúng ta tính toán ñịa chỉ vùng nhớ cần truy cập và ngay sau ñó có thể truy cập bộ nhớ ở ngay pha sau
Trang 38Như ta ñã thảo luận trong phần trên, tập lệnh của kiến trúc RISC ñã ñược thiết kế ñể
có thể dễ dàng thực hiện ñược kĩ thuật ñường ống
Hiện tại trong thiết kế này, tác giả không sử dụng các khối xử lý ñể thực hiện data forwarding ñó khi gặp các lệnh mà dữ liệu của chúng phụ thuộc vào nhau, lệnh tiếp theo buộc phải ñợi lệnh trước ñó hoàn thành rồi mới ñược thực hiện tiếp
ðể có thể thực hiện ñược kĩ thuật pipeline, datapath cũng cần phải cải tiến Yêu cầu cụ thể như sau:
- ðối với kiến trúc pipeline, sau mỗi một bước thực hiện (sau mỗi một chu kì xung nhịp) thì kết quả thực hiện ở khối ñó cần phải lưu vào một thanh ghi ñể dùng cho bước ngay sau ñó Nếu không thực hiện như vậy, kết quả này sẽ bị ghi ñè bởi lệnh ngay sau ñó do mỗi một chu kì xung nhịp bộ vi xử lý sẽ nạp một lệnh ñể xử lý
- Như vậy ta cần phải thêm vào các thanh ghi tạm sau mỗi một bước trong quá trình thực hiện một lệnh ðiều này sẽ làm cho thiết kế hệ thống phức tạp hơn, ñòi hỏi nhiều phần tử phần cứng hơn nhưng bù lại sẽ có ñược một hệ thống hoạt ñộng hiệu quả hơn, thực hiện ñược nhiều lệnh hơn trong một giây
- Một ñiều rất ñáng chú ý là ta cần bao nhiêu thanh ghi ñể ghi một giá trị sau mỗi một bước thực hiện lệnh Nếu suy nghĩ bình thường thì ta cần hai thanh ghi, sau mỗi một chu kì xung nhịp ta sẽ dịch thanh ghi hiện tại sang thanh ghi tiếp theo Như thế thanh ghi hiện tại sẽ lưu trữ giá trị hiện tại của bước ñó, một thanh ghi nữa
ñể lưư trữ giá trị của bước kế tiếp ðiều này ñảm bảo thanh ghi tạm không bị ghi
ñè Tuy nhiên, trong thiết kế phần cứng, bằng cách sử dụng kĩ thuật cloking ñược thiết kế hợp lý cho phép ta ñọc và ghi dữ liệu lên một thanh ghi trong cùng một chu kì xung nhịp
- Datapath sau khi ñã có thêm các thanh ghi tạm ñược chỉ ra như trên hình…
Như vậy ta cần phải thêm một tập hợp các thanh ghi, các thanh ghi này ñược gọi là các thanh ghi pipeline, sau mỗi một bước thực hiện lệnh cụ thể như sau:
- IF/ID: Tập hợp các thanh ghi ñể lưu lại giá trị của PC, của lệnh vừa mới nạp ñược
từ bộ nhớ lệnh
- ID/EX: Tập hợp các thanh ghi ñể lưu giá trị của PC sau khi thực hiện bước giải mã lệnh (instruction decode), lưu giá trị hai thanh ghi ñọc ñược từ register file và một thanh ghi ñể lưư giá trị của trường k trong những lệnh rẽ nhánh hoặc các lệnh số học mà giá trị trực tiếp ñược ñưa vào lệnh
- EX/WB: Tập hợp các thanh ghi ñể lưu giá trị của PC và một thanh ghi ñể lưu giá trị tính toán của ALU