Hệ thống nhúng - Thanh ghi

Thanh ghi được sử dụng trong CPU để lưu trữ thông tin tạm thời có thể là dữ liệu được xử lý hoặc địa chỉ trỏ đến dữ liệu sẽ được tìm nạp. Trong 8051, có một kiểu dữ liệu là 8 bit, từ MSB (bit quan trọng nhất) D7 đến LSB (bit quan trọng nhất) D0. Với kiểu dữ liệu 8 bit, bất kỳ kiểu dữ liệu nào lớn hơn 8 bit phải được chia thành các phần 8 bit trước khi nó được xử lý.

Các thanh ghi được sử dụng rộng rãi nhất của 8051 là A (bộ tích lũy), B, R0-R7, DPTR (con trỏ dữ liệu) và PC (bộ đếm chương trình). Tất cả các thanh ghi này là 8-bit, ngoại trừ DPTR và PC.

Thanh ghi lưu trữ trong 8051

Chúng ta sẽ thảo luận về các loại thanh ghi lưu trữ sau đây:

  • Accumulator
  • R đăng ký
  • B đăng ký
  • Con trỏ dữ liệu (DPTR)
  • Bộ đếm chương trình (PC)
  • Con trỏ ngăn xếp (SP)

Tích lũy

Bộ tích lũy, thanh ghi A, được sử dụng cho tất cả các phép toán số học và logic. Nếu bộ tích lũy không có mặt, thì mọi kết quả của mỗi phép tính (cộng, nhân, dịch, v.v.) sẽ được lưu vào bộ nhớ chính. Truy cập vào bộ nhớ chính chậm hơn so với truy cập vào một thanh ghi như bộ tích lũy vì công nghệ được sử dụng cho bộ nhớ chính lớn chậm hơn (nhưng rẻ hơn) so với công nghệ được sử dụng cho một thanh ghi.

Thanh ghi "R"

Thanh ghi "R" là một tập hợp tám thanh ghi, cụ thể là, R0, R1 đến R7. Các thanh ghi này có chức năng như các thanh ghi phụ trợ hoặc lưu trữ tạm thời trong nhiều hoạt động. Hãy xem xét một ví dụ về tổng của 10 và 20. Lưu trữ một biến 10 trong bộ tích lũy và một biến khác 20 trong thanh ghi R4. Để xử lý thao tác thêm, hãy thực hiện lệnh sau:

ADD A,R4

Sau khi thực hiện lệnh này, bộ tích lũy sẽ chứa giá trị 30. Vì vậy, các thanh ghi "R" là phụ trợ rất quan trọng hoặc helper registers. Chỉ riêng Accumulator sẽ không hữu ích lắm nếu nó không có các thanh ghi "R" này. Thanh ghi "R" được dùng để lưu trữ tạm thời các giá trị.

Hãy để chúng tôi lấy một ví dụ khác. Chúng tôi sẽ cộng các giá trị trong R1 và R2 với nhau và sau đó trừ các giá trị của R3 và R4 khỏi kết quả.

MOV A,R3   ;Move the value of R3 into the accumulator 
ADD A,R4   ;Add the value of R4 
MOV R5,A   ;Store the resulting value temporarily in R5 
MOV A,R1   ;Move the value of R1 into the accumulator 
ADD A,R2   ;Add the value of R2 
SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)

Như bạn thấy, chúng tôi đã sử dụng R5 để tạm thời giữ tổng của R3 và R4. Tất nhiên, đây không phải là cách hiệu quả nhất để tính toán (R1 + R2) - (R3 + R4), nhưng nó minh họa việc sử dụng các thanh ghi "R" như một cách lưu trữ các giá trị tạm thời.

Đăng ký "B"

Thanh ghi "B" rất giống với Accumulator theo nghĩa là nó có thể chứa giá trị 8 bit (1 byte). Thanh ghi "B" chỉ được sử dụng bởi hai lệnh 8051:MUL ABDIV AB. Để nhân hoặc chia A với một số khác một cách nhanh chóng và dễ dàng, bạn có thể lưu số còn lại trong "B" và sử dụng hai hướng dẫn này. Ngoài việc sử dụng các lệnh MUL và DIV, thanh ghi "B" thường được sử dụng như một thanh ghi lưu trữ tạm thời khác, giống như thanh ghi R thứ chín.

Con trỏ dữ liệu

Con trỏ dữ liệu (DPTR) là thanh ghi 16-bit (2 byte) duy nhất mà người dùng có thể truy cập được của 8051. Các thanh ghi Accumulator, R0 – R7 và thanh ghi B là các thanh ghi giá trị 1 byte. DPTR được dùng để trỏ tới dữ liệu. Nó được 8051 sử dụng để truy cập bộ nhớ ngoài bằng địa chỉ được chỉ ra bởi DPTR. DPTR là thanh ghi 16 bit duy nhất có sẵn và thường được sử dụng để lưu trữ các giá trị 2 byte.

Bộ đếm chương trình

Bộ đếm chương trình (PC) là một địa chỉ 2 byte cho 8051 biết nơi có thể tìm thấy lệnh tiếp theo để thực thi trong bộ nhớ. PC bắt đầu lúc 0000h khi 8051 khởi tạo và được tăng lên mỗi lần sau khi một lệnh được thực thi. PC không phải lúc nào cũng tăng thêm 1. Một số hướng dẫn có thể yêu cầu 2 hoặc 3 byte; trong những trường hợp như vậy, PC sẽ được tăng thêm 2 hoặc 3.

Branch, jumpinterrupthoạt động tải Bộ đếm chương trình với một địa chỉ khác với vị trí tuần tự tiếp theo. Kích hoạt thiết lập lại khi bật nguồn sẽ làm mất tất cả các giá trị trong thanh ghi. Nó có nghĩa là giá trị của PC là 0 khi đặt lại, buộc CPU phải tìm nạp opcode đầu tiên từ vị trí ROM 0000. Điều đó có nghĩa là chúng ta phải đặt byte đầu tiên của mã upcode vào vị trí ROM 0000 vì đó là nơi CPU mong đợi tìm thấy hướng dẫn đầu tiên.

Con trỏ ngăn xếp (SP)

Con trỏ ngăn xếp, giống như tất cả các thanh ghi ngoại trừ DPTR và PC, có thể giữ giá trị 8 bit (1 byte). Con trỏ ngăn xếp cho biết vị trí từ đó giá trị tiếp theo sẽ được xóa khỏi ngăn xếp. Khi một giá trị được đẩy vào ngăn xếp, giá trị của SP được tăng lên và sau đó giá trị được lưu trữ tại vị trí bộ nhớ kết quả. Khi một giá trị được bật ra khỏi ngăn xếp, giá trị được trả về từ vị trí bộ nhớ được chỉ ra bởi SP, và sau đó giá trị của SP sẽ giảm đi.

Thứ tự hoạt động này là quan trọng. SP sẽ được khởi tạo đến 07h khi 8051 được khởi tạo. Nếu một giá trị được đẩy vào ngăn xếp cùng một lúc, giá trị sẽ được lưu trong địa chỉ RAM bên trong 08h vì 8051 trước tiên sẽ tăng giá trị của SP (từ 07h đến 08h) và sau đó sẽ lưu giá trị được đẩy tại bộ nhớ đó. địa chỉ (08h). SP được 8051 sửa đổi trực tiếp bằng sáu lệnh: PUSH, POP, ACALL, LCALL, RET và RETI.

Không gian ROM trong 8051

Một số thành viên gia đình của 8051 chỉ có 4K byte ROM trên chip (ví dụ: 8751, AT8951); một số có ROM 8K như AT89C52, và có một số thành viên gia đình có 32K byte và 64K byte ROM trên chip như Dallas Semiconductor. Điểm cần nhớ là không thành viên nào của họ 8051 có thể truy cập nhiều hơn 64K byte opcode vì bộ đếm chương trình trong 8051 là một thanh ghi 16 bit (địa chỉ 0000 đến FFFF).

Vị trí đầu tiên của ROM chương trình bên trong 8051 có địa chỉ là 0000H, trong khi vị trí cuối cùng có thể khác nhau tùy thuộc vào kích thước của ROM trên chip. Trong số các thành viên họ 8051, AT8951 có $ k byte ROM trên chip có địa chỉ bộ nhớ từ 0000 (vị trí đầu tiên) đến 0FFFH (vị trí cuối cùng).

8051 Flag Bits và Thanh ghi PSW

Thanh ghi từ trạng thái chương trình (PSW) là thanh ghi 8-bit, còn được gọi là flag register. Nó có độ rộng 8 bit nhưng chỉ có 6 bit của nó được sử dụng. Hai bit không sử dụng làuser-defined flags. Bốn trong số các lá cờ được gọi làconditional flags, có nghĩa là chúng chỉ ra một điều kiện dẫn đến sau khi một lệnh được thực thi. Bốn cái này làCY (Mang), AC (mang phụ trợ), P (chẵn lẻ), và OV(tràn ra). Các bit RS0 và RS1 được sử dụng để thay đổi các thanh ghi ngân hàng. Hình dưới đây cho thấy thanh ghi trạng thái từ chương trình.

Thanh ghi PSW chứa các bit trạng thái phản ánh trạng thái hiện tại của CPU.

C Y CA F0 RS1 RS0 OV - P

C Y PSW.7 Mang cờ
AC PSW.6 Cờ mang phụ trợ
F0 PSW.5 Cờ 0 có sẵn cho người dùng cho mục đích chung.
RS1 PSW.4 Đăng ký bộ chọn ngân hàng bit 1
RS0 PSW.3 Đăng ký bộ chọn ngân hàng bit 0
OV PSW.2 Cờ tràn
- PSW.1 CỜ người dùng định nghĩa
P PSW.0 CỜ Chẵn lẻ. Đặt / xóa bởi phần cứng trong chu kỳ lệnh để chỉ ra số chẵn / lẻ của 1 bit trong bộ tích lũy.

Chúng ta có thể chọn bit Ngân hàng thanh ghi tương ứng bằng cách sử dụng bit RS0 và RS1.

RS1 RS2 Đăng ký ngân hàng Địa chỉ
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10 giờ-17 giờ
1 1 3 18H-1FH
  • CY, the carry flag- Cờ thực hiện này được đặt (1) bất cứ khi nào có thực hiện từ bit D7. Nó bị ảnh hưởng sau một phép toán cộng hoặc trừ 8 bit. Nó cũng có thể được đặt lại trực tiếp về 1 hoặc 0 bằng một lệnh như "SETB C" và "CLR C" trong đó "SETB" là viết tắt của set bit carry và "CLR" là viết tắt của clear carry.

  • AC, auxiliary carry flag- Nếu có một chuyển động từ D3 và D4 trong một hoạt động ADD hoặc SUB, bit AC được đặt; nếu không, nó được xóa. Nó được sử dụng cho lệnh thực hiện số học thập phân được mã hóa nhị phân.

  • P, the parity flag- Cờ chẵn lẻ chỉ đại diện cho số 1 trong thanh ghi bộ tích lũy. Nếu thanh ghi A chứa số lẻ của 1 thì P = 1; và đối với số chẵn của 1, P = 0.

  • OV, the overflow flag- Cờ này được đặt bất cứ khi nào kết quả của phép toán số có dấu quá lớn khiến bit bậc cao tràn vào bit dấu. Nó chỉ được sử dụng để phát hiện lỗi trong các phép toán số học có dấu.

Thí dụ

Hiển thị trạng thái của cờ CY, AC và P sau khi thêm 9CH và 64H trong hướng dẫn sau.

MOV A, # 9CH

THÊM A, # 64H

Solution:  9C   10011100 
          +64   01100100 
          100   00000000 
			 
CY = 1 since there is a carry beyond D7 bit  
AC = 0 since there is a carry from D3 to D4 
P  = 0 because the accumulator has even number of 1's