CHƯƠNG II: CẤU TRÚC VÀ HOẠT ĐỘNG CỦA VI XỬ LÝ.
2.1. SƠ ĐỒ CẤU TRÚC TỔNG QUÁT CỦA VI XỬ LÝ.
Sơ đồ khối của một bộ vi xử lý truyền thống 8 bit được trình bày trên hình 2.1. Sơ đồ
khối này đặc trưng cho hầu hết các bộ vi xử lý 8 bit đã có trên thị trường như 8085,
8088/8086 và Z80… Các bộ vi xử lý các thế hệ sau sẽ có cấu trúc bên trong khác đi
nhưng vẫn giữ được một số nguyên tắc hoạt động cơ bản của sơ đồ này.
Vi xử lý là một mạch số có thể thực hiện nhiều chức năng số khác nhau. Nó sẽ thực
hiện một bài toán, một công việc khi được cung cấp một chương trình. Một chương
trình là một chuỗi các tín hiệu nhị phân nối tiếp nhau, mỗi chuỗi nhị phân sẽ yêu cầu
(cho phép) một chức năng của vi xử lý hoạt động. Quá trình làm việc của vi xử lý bao
gồm hai chu kỳ chính lặp lại một cách liên tục đó là:
15
Acc
ALU
Cờ
BIU
Data Register
MARs
SP
PC
Queue
CU
Các tín hiệu điều khiển
và định thời
External
BUS
Hình 2.1. Sơ đồ khối của một bộ vi xử lý 8 bit truyền thống
Internal BUS
- Chu kỳ lấy các mã lệnh.
- Chu kỳ thực hiện các chức năng mà lệnh yêu cầu.
Tương ứng với hai chu kỳ trên có thể chia vi xử lý ra hai phần chính: Đơn vị thực hiện
lệnh mà CU nhận được.
- Dữ liệu được truyền ra ngoài từ một thanh ghi dữ liệu, lấy vào một thanh ghi dữ
liệu, hoặc lấy trực tiếp vào ALU trong các lệnh số học và logic.
- Các tín hiệu điều khiển sẽ được định thời trong bộ điều khiển BUS tùy theo lệnh cụ
thể.
Riêng các trường hợp lấy mã lệnh, địa chỉ được BIU cung cấp từ bộ đếm chương trình
PC (Program Counter), và lấy mã lệnh từ bộ nhớ vào thanh ghi lệnh (hoặc hàng đợi
lệnh).
Khi bắt đầu hoạt động PC = 0,
khi lấy vào 1 byte lệnh PC tăng lên 1. PC sẽ được thiết
lập giá trị mới, khi có các lệnh rẽ nhánh chuyển điều khiển chương trình
Trong một số vi xử lý bộ đếm chương trình còn được gọi là con trỏ lệnh IP (Instruction
Pointer).
16
Để làm việc được VXL phải hoạt động chung với thiết bị khác như là bộ nhớ và ngoại
vi, để tạo thành hệ thống VXL. Khi đó bộ vi xử lý được gọi là đơn vị xử lý trung tâm
CPU (Central Processing Unit ). Phần kế tiếp sẽ miêu tả cấu trúc và hoạt động cụ thể,
của các bộ phận chính trong một CPU.
2.2. CHỨC NĂNG, HOẠT ĐỘNG CỦA CÁC THÀNH PHẦN BÊN TRONG
VI XỬ LÝ.
2.2.1. Các thanh ghi (Registers).
Các thanh ghi là một bộ phận rất quan trọng trong một CPU. Chúng là một số ít các ô
nhớ có tốc độ truy xuất rất nhanh, cách đánh địa chỉ đơn giản để CPU có thể truy xuất
dữ liệu một cách nhanh chóng. Các thanh ghi được cho phép hoạt động từ các bộ chọn
MUX (Multiplex) được điều khiển từ đơn vị điều khiển CU. Chúng được chọn nhờ số ít
các bit nhị phân trong mã lệnh.
CPU có càng nhiều thanh ghi, thì tốc độ thực hiện một chương trình càng cao, do giảm
được thời gian truy xuất các hằng, biến ngoài bộ nhớ. Giảm được số byte lệnh do không
phải cung cấp địa chỉ các dữ liệu toán hạng. Nhưng tất nhiên khi số lượng thanh ghi
Chuyển dữ liệu
thanh ghi ra BUS
BUS nội của CPU
0
1
n
Hình 2.2. Nối ghép của thanh ghi tới Bus nội.
Quá trình đổi địa chỉ trong CPU:
CPU được chế tạo để hoạt động theo các chương trình định sẵn. Trong các hệ thống
CPU 8 bit (8 đường dữ liệu), chương trình đơn giản bao gồm các byte (8 bit) xếp lần
lượt trong các vùng nhớ có thể địa chỉ hóa được. Khi hệ thống bắt đầu hoạt động, bộ
đếm chương trình sẽ được khởi động một giá trị qui định trước trỏ tới lệnh đầu tiên mà
hệ thống sẽ thực hiện. Khi không có các cơ chế điều khiển chương trình, thì sau khi đọc
xong một byte lệnh PC sẽ được tự động tăng lên 1, và như vậy chu kỳ đọc lệnh tiếp theo
sẽ lấy lệnh tại địa chỉ kế tiếp trong bộ nhớ.
Có thể có các chương trình được thực hiện từ tuần tự từ đầu đến cuối, lúc đó PC sẽ
tuần tự tăng lên sau mỗi lần lấy vào 1 byte lệnh như một bộ đếm bình thường. Các
chương trình như vậy rất ít xảy ra trong thực tế, do các bài toán thực tế luôn phải có
phương hướng giải quyết khác nhau với các điều kiện khác nhau. Có rất nhiều lệnh gây
ra việc thay đổi địa chỉ không theo qui luật tuần tự. Sự thay đổi tuần tự này không gây
nên một sự rối loạn nào, BUS địa chỉ của CPU dễ dàng đưa ra ngay một địa chỉ bất kỳ,
dù cách xa bước nhảy tuần tự bình thường như thế nào đi nữa. Và các bộ nhớ bán dẫn
với nguyên tắc truy cập ngẫu nhiên cũng sẽ chấp nhận cơ chế này.
Có ba cách để đổi địa chỉ chương trình không theo qui luật tăng tuần tự là:
- Đổi địa chỉ bằng lệnh nhảy và rẽ nhánh.
- Đổi địa bằng chương trình con.
- Đổi địa chỉ bằng ngắt.
Đổi địa chỉ bằng lệnh nhảy và rẽ nhánh: Đổi địa chỉ bằng lệnh nhảy được chia ra hai
loại: Nhảy tuyệt đối (Jump) và nhảy tương đối (Jump Relative)
Khi CPU nhận được mã của lệnh nhảy tuyệt đối thì hai byte tiếp theo sẽ được gửi đến
ngắt, và được phục hồi khi có lệnh quay về. Khác biệt ở chỗ phục vụ ngắt được gọi
bằng xung phần cứng, mà không phải bằng lệnh gọi như trong chương trình con. Địa chỉ
chương trình phục vụ ngắt có thể là một địa chỉ cố định được qui định trước, hoặc được
lấy từ vùng nhớ gọi là bảng vector ngắt.
Có hai loại ngắt: ngắt không che, và ngắt có thể che được bằng phần mềm: Với ngắt
không che, chương trình ngắt luôn được thực hiện khi có tín hiệu yêu cầu. Còn với ngắt
che, khi có tín hiệu yêu cầu CPU sẽ kiểm tra cờ ngắt, nếu cờ ngắt =1 chương trình ngắt
thực hiện, cờ ngắt bằng 0 chương trình ngắt sẽ bị bỏ qua. Cờ ngắt có thể thiết lập hay
xóa bằng lệnh phần mềm. Các cơ chế ngắt sẽ được mô tả kỹ trong phần hệ thống ngắt
của vi xử lý.
• Thanh ghi lệnh IR (Instruction Pointer).
Thanh ghi lệnh nằm ở ngõ vào của bộ giải mã lệnh. Trong bộ nhớ, các lệnh của 1
chương trình bao gồm hai phần: mã hoạt động (Op Code) và phía sau là các toán hạng
(Operand). Op Code sẽ phân biệt các lệnh: Số học, logic, di chuyển dữ liệu, bit, nhảy,
chương trình con ….Còn các toán hạng sẽ chỉ ra dữ liệu cần xử lý trong lệnh nằm ở đâu
hoặc bằng bao nhiêu. Thanh ghi lệnh sẽ là nơi các mã lệnh đi qua (từ ngoài bộ nhớ vào
bộ giải mã lệnh). Còn các toán hạng sẽ đi tới các khối khác nhau của vi xử lý tùy theo
mã lệnh. Ví dụ một lệnh cộng sẽ có 1 byte Op Code để phân biệt với các lệnh khác, và
các byte tiếp theo sẽ chỉ ra toán hạng của phép cộng. Nó có thể là 1 giá trị sẽ được đưa
thẳng tới ALU, hoặc có thể là 1 địa chỉ để lấy dữ liệu từ bộ nhớ cung cấp cho ALU, khi
đó địa chỉ này sẽ được đưa tới BIU để truy cập dữ liệu, cũng có thể phần toán hạng chỉ
thị dữ liệu cho lệnh nằm trong một thanh ghi dữ liệu ngay bên trong CPU.
19
Trong mã lệnh của vi xử lý 8 bit thường phần Op code có kích thước giống nhau
(1byte). Với 8 bit sẽ phân biệt 256 tổ hợp, có nghĩa là CPU 8 bit có khả năng xử lý dễ
dàng 256 lệnh. Trong thực tế số lệnh của CPU 8 bit ít hơn con số này mà vẫn đủ cho tất
cả các công việc. Có rất nhiều sự trùng lặp trong các mã lệnh, chúng bao gồm nhiều
công việc giống nhau nhưng sử dụng các toán hạng khác. Trong thực tế thường chỉ có
khoảng hơn 20 nhiệm vụ khác nhau cho 1 CPU, còn lại là các kiểu khác nhau của cùng
một nhiệm vụ.
Hình 2.3: Giải thuật di chuyển 10 ô nhớ từ địa chỉ 1000 qua địa chỉ 2000
địa chỉ bộ nhớ bao gồm ít byte lệnh và được thực hiện nhanh chóng hơn các lệnh chỉ ra
trực tiếp địa chỉ của ô nhớ. Đặc biệt trong các lệnh thao tác chuỗi dữ liệu các thanh ghi
này đóng một vai trò rất quan trọng. Nhờ những thanh ghi này mà CPU có thể di
chuyển, so sánh một khối dữ liệu bằng một lệnh đơn giản với độ dài chỉ 1 hoặc 2 byte.
Ví dụ lưu đồ hình 2.3 sử dụng một chương trình chuyển 10 byte từ vùng nhớ 1000H
qua vùng nhớ 2000H. Trong đó vòng lặp kể từ bước thứ ba trở đi là của một lệnh di
chuyển chuỗi.
• Thanh ghi con trỏ ngăn xếp (SP-Stack Pointer).
Tất cả các CPU đều có một vùng nhớ RAM làm nhiệm vụ ngăn xếp. Vùng nhớ này
hoạt động theo nguyên tắc LIFO (Last Input Fist Output- vào trước ra sau), dữ liệu nào
đưa vào trước tiên sẽ được lấy ra sau cùng. Để thực hiện chức năng này CPU sử dụng
thanh ghi con trỏ ngăn xếp. Vào đầu chương trình thanh ghi này sẽ được gán một giá trị
trỏ tới một địa chỉ của vùng nhớ RAM. Ngăn xếp sẽ được truy cập bằng những lệnh đặc
biệt là PUSH (nạp dữ liệu vào) và POP (lấy dữ liệu ra). Khi có dữ liệu nào được nạp
vào ngăn xếp SP tự động giảm đi, ngược lại khi lấy dữ liệu ra khỏi ngăn xếp SP sẽ được
tự động tăng lên.
Ví dụ vào đầu chương trình SP được gán 0100H, giá trị của SP sẽ trỏ đến ô nhớ có địa
chỉ 0100H (hình 2.4a). Khi CPU lệnh nạp thanh chứa Acc vào ngăn xếp(PUSH Acc),
giá trị của Acc sẽ được cất vào ô nhớ có địa chỉ SP-1 =00FFH (hình 2.4b), và giá trị của
SP bây giờ sẽ là 00FFH. Nếu lấy giá trị ra một thanh ghi đa năng, SP sẽ tăng lên 1 trở lại
như cũ (hình 2.4c).
Khi gặp các lệnh gọi chương trình con hoặc yêu cầu ngắt, giá trị của bộ đếm chương
trình sẽ được nạp vào đỉnh của ngăn xếp, SP sẽ tự động giảm đi 2. Khi có lệnh quay về
(Return), thanh ghi PC sẽ được phục hồi từ đỉnh ngăn xếp. Vì vậy chương trình sẽ quay
về chỗ đã gọi nó, nếu trong chương trình con không còn dữ liệu nào nạp vào mà chưa
lấy được ra. Vậy trong chương trình con nếu nạp vào ngăn xếp cái gì, thì trước khi có
lệnh quay về phải lấy hết ra. Nếu không thanh PC phục hồi từ đỉnh ngăn xếp sẽ chuyển
điều khiển của chương trình tới địa chỉ không được quản lý, mà không phải về nơi đã
Các thanh ghi này thông thường chiếm một số lượng lớn trong các CPU. Các CPU 8 bit
thông thường cũng có các thanh ghi đa năng 8 bit, các thanh ghi này cũng có thể ghép
chung từng cặp để tạo thành các thanh ghi 16 bit . Tuy không có các chức năng chuyên
dụng như các thanh ghi khác, nhưng chúng có thể thực hiện hầu hết các chức năng mà
các thanh ghi khác đảm nhiệm . Thường thì các thanh ghi đa năng được sử dụng lưu trữ
dữ liệu vào ra CPU, hoặc làm các biến tạm thời trong một chương trình. Ngoài ra khi
sử dụng chung từng cặp chúng có thể là nơi lưu trữ dữ liệu, và làm các biến 16 bit, hoặc
giữ địa chỉ của ô nhớ mà chương trình cần truy cập. Trong các lệnh về chuỗi thì chúng
có thể được sử dụng làm các bộ đếm số lần lặp, địa chỉ trong các lệnh về chuỗi dữ
liệu….
• Thanh ghi chứa: (Accumulator Register).
Thanh ghi chứa thường được các CPU sử dụng làm nơi chứa một toán hạng trong các
lệnh số học và logic, tức là nó thường án ngữ một đầu vào của đơn vị số học và logic
ALU. Đồng thời thanh chứa còn được sử dụng để lưu kết quả cuối cùng của phép tính
mà ALU vừa thực hiện. Với các chức năng này chiều dài các lệnh tính toán sẽ được
giảm ngắn, do không phải chỉ thị cả hai toán hạng và nơi lưu trữ kết quả. Ngoài ra thanh
chứa còn được sử dụng trong các phép quay dịch, và hầu hết các lệnh về di chuyển và
xử lý dữ liệu như một thanh ghi đa năng thông thường. Các CPU trước đây chỉ có một
22
Internal Bus
Index Register
Bộ cộng
Bus địa chỉ
Hình 2.5: Cung cấp địa chỉ bằng thanh ghi chỉ số.
thanh ghi chứa, nên các lệnh logic và số học bắt buộc phải di chuyển dữ liệu tới thanh
ghi chứa. Càng ngày CPU càng có nhiều thanh chứa hơn, nên chương trình được thực
hiện nhanh chóng hơn, do giảm bớt được các lệnh di chuyển dữ liệu đến thanh chứa.
• Thanh ghi cờ (Flag Register).
Thanh ghi cờ còn được gọi là thanh ghi mã trạng thái CCR (Condition Code Register)
bao gồm các bit độc lập. Mỗi bit chỉ có hai trạng thái 0 hoặc 1 được gọi là các cờ. Các
Cờ tràn V (overflow) .
Cờ tràn VF sẽ được thiết lập mức 1 khi có sự tràn bit 1 từ D6 sang D7, tức là khi dấu
của số 7 bit thay đổi từ (+) sang (-). Cờ VF luôn được thiết lập khi có tràn, nó được
dùng cho các số được biểu diễn theo cách 7 bit hay cách 8 bit. Vì thế cần phải chú ý để
nó không ảnh hưởng gì đến chương trình. Cờ tràn sẽ bị xóa khi D7 trở về mức 0
Cờ ZERO ZF.
Khi ALU thực hiện các phép tính có kết quả trong thanh ghi chứa bằng 0, lúc đó cờ Z
sẽ được thiết lập lên mức 1. Còn ngược lại cờ Z=0. Thông thường cờ Z để thông báo
trạng thái so sánh bằng, kết quả của phép trừ = 0 , các phép logic = 0. Khi thực hiện các
phép cộng, mặc dù kết quả có dư ra bit thứ 9 nhưng nếu thanh chứa có giá trị 0 thì cờ
23
ZF vẫn = 1. Ví dụ cộng FF+01 kết quả là 100 thì số 1 ở cờ CF còn thanh chứa có giá trị
00 do đó cờ ZF =1.
Cờ Z đặc biệt tiện lợi cho các vòng lặp sử dụng bộ đếm xuống. Vòng lặp có thể giảm
một thanh ghi nào đó, cho đến khi nó trở về 0 thì ngưng. Với các công dụng như trên ZF
cùng với CF được sử dụng rất nhiều trong các chương trình.
Cờ nửa nhớ HF (Half Carry Flag ).
Cờ nửa nhớ trong một số CPU còn được gọi là cờ phụ AF (Auxiliary Flag) không giống
như CF, đóng vai trò bit thứ 9 của thanh chứa. Nó giống cờ tràn nhiều hơn, cờ nửa nhớ
sẽ được thiết lập mức 1 khi có sự tràn bit 1 từ D3 qua D4.
Tám bit của bộ chứa bao gồm 2 nibble riêng biệt, các bit 7-4 gọi là nibble trọng số lớn
MS(Most Significant) và 3-0 là nibble trong số nhỏ LS(Least Significant). Mỗi nibble là
mã số thập phân hoặc HEXA đơn. Khi thực hiện các phép tính với số BCD (tức số thập
phân) cần phải ghi nhận số nhớ của 4 bit thấp trong đơn vị 8 bit. Ta gọi số nhớ này là số
nửa nhớ. Một số CPU cờ nữa nhớ được gọi là cờ nhớ phụ AF (Auxiliary Flag ) nó sử
dụng như cờ tràn như trong các phép tính 16 bit.
Cờ chẵn lẻ PF (Parity Flag).
Cờ chẵn lẻ được sử dụng thông báo số các bit 1 trong kết quả của phép tính logic là
chẵn hoặc lẻ tùy theo từng loại CPU. Cờ chẵn lẻ thường được sử dụng trong các chương
trình truyền các dữ liệu nối tiếp, trạng thái của cờ có thể được phát ra để bên thu có thể
Chương trình con giám sát được thực hiện bởi người sử dụng để kiểm tra lại kết quả
của lệnh vừa thực hiện ở các ô nhớ, các thanh ghi, các cờ. Sau đó CPU lại quay về thực
hiện lệnh tiếp theo của chương trình chính. Chương trình con giám sát sẽ được đặt tại
một địa chỉ xác định tùy theo loại CPU.
2.2.2. Đơn vị điều khiển CU: (Control Unit).
Đơn vị điều khiển còn được gọi là bộ giải mã lệnh, nó là nơi cung cấp các tín hiệu điều
khiển, cho phép tất cả các bộ phận khác trong CPU làm việc. Đơn vị điều khiển nhận
các mã lệnh từ hàng đợi lệnh, mã lệnh này sẽ được hệ thống các mạch điện tử giải mã,
tạo ra một dãy các tín hiệu cho phép. Tùy theo từng lệnh cụ thể mà các khối khác nhau
trong CPU sẽ được cho phép hoạt động. Các bộ vi xử lý khác nhau cơ bản ở cấu trúc
của đơn vị điều khiển. Một lệnh của họ vi xử lý này có thể là một lệnh hoàn toàn khác
trong một họ vi xử lý khác. Do cấu trúc các mạch điện tử bên trong của đơn vị điều
khiển khác nhau, mà CPU của các hãng khác nhau sẽ có các tập lệnh khác nhau. Vì thế
một chương trình viết cho hệ thống vi xử lý, sử dụng CPU của hãng nào thì phải tuân
theo tập lệnh , và trình biên dịch của hãng đó, nếu không chương trình sẽ không thể thực
hiện mặc dù cấu trúc bộ nhớ và I/O tương đương nhau.
Đơn vị điều khiển của các CPU truyền thống có thể thực hiện bằng hai phương pháp
chính là: Thực hiện bằng cách nối ghép cứng hệ thống các cổng logic, hoặc sử dụng bộ
nhớ. Đối với loại thứ nhất tập lệnh sẽ không thể thay đổi. Đối với loại sử dụng bộ nhớ,
mã lệnh lấy từ ngoài bộ nhớ sẽ đóng vai trò là địa chỉ của bộ nhớ, còn các đường dữ liệu
của bộ nhớ này sẽ đóng vai trò là các tín hiệu cho phép. Nếu cho phép lập trình lại bộ
nhớ này có thể tạo ra các lệnh mới cho vi xử lý, hoặc có thể thay đổi tập lệnh cho nó.
Nhờ có đơn vị điều khiển mà mã lệnh sẽ được giảm, vì nếu cung cấp các tín hiệu cho
phép ngay trong mã lệnh thì mỗi khối chức năng trong CPU sẽ phải được cho phép hoặc
không cho phép bằng một bit của mã lệnh. Nhưng khi có đơn vị điều khiển, mỗi lệnh
của chương trình đều phải tốn thời gian giải mã. Để khắc phục nhược điểm này người ta
chế tạo ra các CPU không có đơn vị điều khiển, các tín hiệu cho phép các khối chức
năng bên trong CPU hoạt động sẽ được lấy trực tiếp từ mã lệnh. Khi đó để đảm bảo mã
lệnh không quá dài số lệnh thực hiện được của CPU loại này ít hơn loại truyền thống rất
nhiều, tuy nhiên nó vẫn đủ để thực hiện tất cả các công việc, các lệnh phức tạp sẽ được
Or
Xor
Not
Dịch trái
Dịch phải
Quay trái
Quay phải
Dịch phải số học
ADD M
SUB M
MUL M
DIV M
AND M
OR M
XOR M
NOT
SHL
SHR
RRL
RRR
ASR
Cộng số M với Acc
Trừ Acc đi M
Nhân Acc với M
Chia Acc cho M
And Acc với M
Or Acc với M
Xor Acc với M
Đảo Acc
Dịch trái Acc
Xoá
LDA M
EX M
CLA
Nạp giá trị M vào Acc.
Chuyển đổi giá trị giữ M và Acc.
Xoá Acc
Trong thực tế các loại CPU của các hãng khác nhau, sẽ có các lệnh với cách viết gợi
nhớ khác nhau.
• Cấu trúc ALU.
Trong các bài toán các phép toán cần thực hiện, có thể bao gồm hai toán hạng (như
cộng ) hoặc một toán hạng (not). Phép toán một số còn gọi là phép toán đơn (monadic
operation), phép toán hai số gọi là phép toán hai ngôi (dyadic operation). Để thực hiện
các phép toán trên ALU có cấu trúc như hình vẽ 2.6.
ALU nối với BUS hệ thống bằng hai nhóm đường. Nhóm bên phải chỉ sử dụng để nhập
dữ liệu vào ALU, nhóm này thường được sử dụng để đưa một toán hạng vào ALU trong
các phép toán. Nhóm bên trái được nối với thanh chứa Acc và từ thanh chứa nối ra
BUS hệ thống. Nhóm tín hiệu này có thể là vào hoặc ra. Thanh chứa được sử dụng cho
các công việc:
- Giữ toán hạng thứ hai trong các phép toán hai ngôi.
- Giữ toán hạng duy nhất trong các phép toán đơn .
- Giữ kết quả của các phép toán .
Một số CPU không có thanh chứa mà sử dụng bộ nhớ tạm thời là một thanh ghi ngoài
ALU, các loại này không phổ biến lắm nên ta xem xét Acc như một phần của ALU.
2.3. CẤU TRÚC CỦA CÁC BỘ VI XỬ LÝ CÔNG NGHỆ CAO.
Trong thập kỷ 90 và cho tới ngày nay việc cải tiến về tốc độ và cấu trúc vi xử lý có các
bước tiến vượt bậc. Để nâng cao tốc độ tính toán với nhu cầu đa phương tiện, đa nhiệm
hàng loạt bộ vi xử lý mới ra đời với công nghệ cao, các kỹ thuật mới và có thêm các
khối chức năng chuyên dụng. Sơ đồ khối tổng quát cho các bộ vi xử lý này có thể biểu