Làm thế nào bộ xử lý 8 bit có thể hỗ trợ hơn 256 byte RAM?


14

Nếu bộ xử lý 32 bit có thể xử lý khoảng 4 GiB RAM (tức là ) byte, tại sao Arduino Mega 2560 của tôi có 8 KiB SRAM, nếu là bộ xử lý 8 bit cho phép xử lý chỉ 256 byte ( )? Hay tôi đang đọc trang sau sai?232=42949672962 828

http://www.atmel.com/devices/atmega2560.aspx?tab=parameter


5
Chắc chắn bất kỳ máy hoàn chỉnh nào cũng có khả năng giải quyết hầu hết mọi kích cỡ của ram, với đủ thời gian.
John U

1
Trên thực tế, số lượng bit trong tên bộ xử lý chỉ có thể được sử dụng để ước tính trước về độ rộng dữ liệu bên trong. 8088 là bộ xử lý 16 bit vì các thanh ghi 16 bit của nó nhưng có bus dữ liệu 8 bit và bus địa chỉ 20 bit. 68000 là bộ xử lý 32 bit, chủ yếu được gọi là 16/32 bit vì các thanh ghi 32 bit của nó nhưng có bus dữ liệu 16 bit và bus địa chỉ 24 bit. Các triển khai ARM nhỏ là bộ xử lý 32 bit (thanh ghi 32 bit và bus dữ liệu) nhưng ngay cả khi chúng sử dụng 32 bit cho các địa chỉ, chúng không thể xử lý tổng cộng 4 GB.
bận rộn

Tôi đã thêm tiền tố SI chính xác cho các đơn vị này. là gibi (Gi) và 2 10 là kibi (Ki). 230210
Elliot Alderson

Câu trả lời:


18

Hầu hết các CPU 8 bit có các bus địa chỉ 16 bit cho phép chúng giải quyết 64kbyte, chính xác là vì 256 byte thực sự không đủ để làm rất nhiều! Điều đó chỉ có nghĩa là họ cần tải hai byte thay vì một, mỗi lần họ cần tải một địa chỉ. Hơi chậm nhưng có thể chấp nhận được khi xem xét kích thước của chúng.

(Và vâng, có nhiều trường hợp ngoại lệ, chủ yếu được phát triển khi 64k trở nên quá nhỏ, nhưng chúng ta đang nói về ý tưởng cơ bản ở đây).


Trong thực tế, hầu hết các bộ vi điều khiển 8 bit mà tôi gặp không có địa chỉ 16 bit
phuclv

@Brian Drumond Tôi có đúng không: Bộ điều khiển sẽ ghi 8 bit thấp hơn trước sau đó là 8 bit trên và sau đó Chốt bus địa chỉ. Đây là cách nó sẽ truy cập xe buýt địa chỉ 16 bit!
Swanand

Hoặc 8 bit trên rồi 8 bit thấp hơn, nhưng về cơ bản là có, đó là ý tưởng.
Brian Drumond

7

Các bus địa chỉbus dữ liệu được tách ra để họ có thể có kích thước khác nhau. Đối với bất kỳ kích thước bus địa chỉ cụ thể nào, có rất nhiều kỹ thuật để giải quyết nhiều bộ nhớ hơn độ rộng bit đăng ký

  • Cách phổ biến nhất là tăng chiều rộng bus địa chỉ bằng cách nào đó

    • sử dụng nhiều thanh ghi cho địa chỉ

      • AVR có R26..R31 có thể được ghép nối vào 16-bit X, YZdữ liệu giải quyết đăng ký để cho phép 64KB tối đa của RAM. Những lần lượt có thể được ghép nối với RAMPX, RAMPY, RAMPZtruy cập vào địa chỉ RAM cao hơn trong các phiên bản lớn hơn. Nó cũng có SPHcác byte cao của con trỏ ngăn xếp ngoài SPLcác biến thể có hơn 256 byte RAM 1
      • Intel 8080Zilog Z80 là các CPU 8 bit, nhưng chúng có các cặp đăng ký như H& L, B& C, DEcó thể được sử dụng cùng nhau như một thanh ghi địa chỉ 16 bit
    • sử dụng một thanh ghi đặc biệt lớn duy nhất lớn hơn kích thước tự nhiên để đánh địa chỉ

      • Intel 8051 là một vi điều khiển 8 bit, tức là nó có địa chỉ dữ liệu 8 bit. Tuy nhiên, nó sử dụng địa chỉ lệnh 16 bit và có 2 thanh ghi 16 bit: PC và DPTR để đánh địa chỉ trong không gian lệnh.
      • AVR có thanh ghi PC 16 hoặc 22 bit
    • sử dụng một thanh ghi đặc biệt cho phần cao của địa chỉ . Khi đánh địa chỉ một số bộ nhớ, theo mặc định, 8 bit thấp của địa chỉ sẽ được lấy từ thanh ghi 8 bit ngay lập tức hoặc 8 bit trên vi điều khiển 8 bit, trong khi các bit cao sẽ được thay thế bằng giá trị của thanh ghi địa chỉ khác.

      • Một trường hợp đặc biệt của điều này là bộ nhớ được phân đoạn , được sử dụng bởi x86 16 bit . Trong kỹ thuật này, bộ nhớ được chia thành nhiều phân đoạn có kích thước 64KB (2 16 byte). Truy cập bình thường nằm trong một phân đoạn theo mặc định để họ có thể sử dụng địa chỉ 16 bit cho dữ liệu gần . Dữ liệu cách xa nhau hơn phải được giải quyết cụ thể theo giá trị phân khúc, do đó, 2 thanh ghi phải được sử dụng để đánh địa chỉ xa.
      • Bộ vi điều khiển PIC , có chuỗi cơ sở và tầm trung có thể có địa chỉ 13 hoặc 14 bit, là một ví dụ khác. Khi sử dụng callhoặc gotochỉ dẫn, 8 hoặc 9 bit thấp của địa chỉ được chỉ định ngay lập tức và phần còn lại được lấy từ bộ đếm chương trình hiện tại. Vì vậy, việc truy cập mọi thứ không xa xung quanh phân khúc hiện tại chỉ sử dụng 1 lệnh, trong khi các địa chỉ tiếp theo sẽ cần 2 hướng dẫn (để đặt các bit cao).
      • Một ví dụ khác là kiến trúc MIPS cũng kết hợp địa chỉ tức thời 26 bit thấp hơn với 6 bit cao PCtrong khi nhảy vô điều kiện.
  • Một cách khác để đạt được điều này là ngân hàng bộ nhớ . Đây là một phương pháp hữu ích vẫn được sử dụng trong một số kiến ​​trúc ngày nay. Trong mô hình này, bộ nhớ được chia thành nhiều ngân hàng . Mỗi lần bạn chỉ có thể giải quyết một ngân hàng cụ thể. Thường có một ngân hàng toàn cầu hoặc phạm vi địa chỉ luôn hiển thị bất cứ lúc nào, nhưng đối với các bộ phận khác, bạn phải chuyển đổi ngân hàng khi cần.

    • Intel 8051 sử dụng ngân hàng bộ nhớ cho các thanh ghi. Nó có 32 thanh ghi nhưng chỉ có 8 trong số chúng hiển thị tại một thời điểm.
    • x86 PAEARM LPAE , với không gian địa chỉ vật lý lớn hơn được ánh xạ tới một không gian địa chỉ ảo nhỏ
    • Một ứng dụng khác cho điều này là Tiện ích mở rộng cửa sổ địa chỉ trên Windows, có thể được sử dụng bởi các ứng dụng x86 32 bit ở chế độ PAE để truy cập hơn 2/3 GB bộ nhớ. Nó không chính xác giống như một ngân hàng bộ nhớ trên vi điều khiển nhưng có thể được nhìn thấy như vậy, bởi vì phạm vi địa chỉ lớn có thể nghĩ về các cửa sổ / ngân hàng nhỏ đủ nhỏ để vừa với không gian địa chỉ của ứng dụng. Nếu ứng dụng cần sử dụng dữ liệu trong một số cửa sổ, nó sẽ ánh xạ cửa sổ đó vào không gian địa chỉ hiện tại của nó.
    • DOS cũng có một số loại chuyển đổi ngân hàng như bộ nhớ mở rộng hoặc bộ nhớ mở rộng do phạm vi bộ nhớ có thể định địa chỉ giới hạn.
  • Ngoài ra còn có một kỹ thuật không phổ biến nhưng có thể được tìm thấy trong Intel 8051 . Là một vi điều khiển có địa chỉ dữ liệu 8 bit, nó có thể có tối đa 256 địa chỉ. Một nửa dung lượng (phần cao) được sử dụng cho các thanh ghi chức năng đặc biệt ( SFR ), giới hạn RAM thực có thể đánh địa chỉ chỉ còn 128 byte. Tuy nhiên, các nhà sản xuất dòng 8051 hiện đại đã tìm ra một cách thông minh để khắc phục điều này bằng cách tách biệt quyền truy cập bộ nhớ . Địa chỉ trực tiếp sẽ truy cập SFR trong khi đánh địa chỉ gián tiếp mặc dù các thanh ghi sẽ truy cập vào phần cao của RAM, điều đó có nghĩa là bây giờ bạn có 256 + 128 = 384 byte có thể định địa chỉ.


1 https://en.wikipedia.org/wiki/Atmel_AVR_in cản_set # Memory_addressing_in cản

Các lõi nhỏ nhất có ≤256 byte không gian địa chỉ dữ liệu (nghĩa là ≤128 byte RAM sau khi các cổng I / O và các địa chỉ dành riêng khác bị loại bỏ) và ≤8192 byte (8 KiB) của ROM chương trình. Chúng chỉ có một con trỏ ngăn xếp 8 bit (trong SPL) và chỉ hỗ trợ các lệnh nhảy / gọi tương đối 12 bit RJMP / RCALL. (Vì bộ đếm chương trình AVR đếm các từ 16 bit, không phải byte, nên độ lệch 12 bit là đủ để xử lý 213 byte ROM.)

Các khả năng đánh địa chỉ bộ nhớ bổ sung được trình bày theo yêu cầu để truy cập các tài nguyên có sẵn:

  1. Các mô hình có> 256 byte không gian địa chỉ dữ liệu (≥256 byte RAM) có con trỏ ngăn xếp 16 bit, với một nửa cao trong thanh ghi SPH.
  2. Các mô hình có> 8 KiB ROM thêm các hướng dẫn JUMP và CALL 2 từ (22 bit). (Một số mô hình ban đầu bị lỗi nếu hướng dẫn bỏ qua được thực hiện theo hướng dẫn 2 từ.)
  3. Các mô hình có> 64 KiB ROM thêm hướng dẫn ELPM và thanh ghi RAMPZ tương ứng. Hướng dẫn LPM bằng không mở rộng địa chỉ ROM trong Z; Các hướng dẫn ELPM đăng ký thanh ghi RAMPZ cho các bit cao. Đây không giống như hướng dẫn LPM tổng quát hơn; tồn tại các mô hình "cổ điển" chỉ với hình thức không hoạt động của ELPM (ATmega103 và at43usb320). Khi tự động tăng khả dụng (hầu hết các kiểu máy), nó sẽ cập nhật toàn bộ địa chỉ 24 bit bao gồm RAMPZ.
  4. (Hiếm) các mô hình có> 128 KiB ROM có bộ đếm chương trình 3 byte. Các cuộc gọi và trả về chương trình con sử dụng một byte không gian ngăn xếp bổ sung, có một thanh ghi EIND mới để cung cấp các bit cao bổ sung cho các lệnh nhảy và cuộc gọi không mong muốn, và có các hướng dẫn mở rộng mới EIJMP và EICALL sử dụng EIND: Z làm địa chỉ đích. (Các hướng dẫn IJMP và ICALL trước đó sử dụng Z không mở rộng.)
  5. (Hiếm) các mô hình có> 64 KiB không gian địa chỉ RAM mở rộng giới hạn địa chỉ RAM 16 bit với các thanh ghi RAMPX, RAMPY, RAMPZ và RAMPD. Chúng cung cấp các bit cao bổ sung cho các chế độ địa chỉ sử dụng các cặp thanh ghi X, Y hoặc Z tương ứng hoặc các hướng dẫn địa chỉ trực tiếp LDS / STS. Không giống như truy cập ROM, không có hướng dẫn "mở rộng" riêng biệt; thay vào đó các thanh ghi RAMP được sử dụng vô điều kiện.

6

Gần như tất cả các bộ xử lý 8 bit có một số khả năng hình thành địa chỉ 16 bit từ phần có thứ tự thấp và phần có thứ tự cao. Trên một số bộ xử lý bao gồm 8080 ban đầu, có các thanh ghi dành riêng cho việc giữ phần trên và phần dưới của địa chỉ (mặc dù theo quan điểm của lập trình viên, có thể có một số thanh ghi như con trỏ ngăn xếp của 8080 không cung cấp hướng dẫn để giải quyết chúng một cách riêng biệt). Trong một số bộ xử lý khác, không có các thanh ghi dành cho nửa trên hoặc dưới của một địa chỉ, nhưng các địa chỉ được lắp ráp "nhanh chóng". Ví dụ, trên 6502, hướng dẫn "LDA $ 1234, X" tải bộ tích lũy với địa chỉ được hình thành bằng cách thêm $ 1234 vào thanh ghi X 8 bit [giả sử nó chứa $ F0]. Việc thực hiện lệnh đó sẽ tiến hành theo 4 hoặc 5 bước:

  1. Kết thúc đăng ký ghi từ hướng dẫn trước (nếu có) và tải opcode ($ BD)
  2. Tìm nạp byte toán hạng đầu tiên sau opcode ($ 34) trong khi giải mã lệnh
  3. Tìm nạp byte toán hạng thứ hai ($ 12) trong khi thêm byte được tìm nạp trước đó vào thanh ghi X
  4. Đọc bộ nhớ tại địa chỉ được hình thành bằng cách nối byte toán hạng thứ hai với kết quả ALU [tức là $ 1224]. Đưa byte toán hạng thứ hai vào ALU để thêm 0 hoặc một tùy thuộc vào việc thêm lần trước tạo ra một carry
  5. Đọc bộ nhớ tại địa chỉ được hình thành bằng cách thay thế nửa trên bằng kết quả ALU [$ 1334]

Việc chuyển byte đọc sang bộ tích lũy sẽ chồng lấp việc tìm nạp lệnh tiếp theo. Ngoài ra, đối với nhiều thao tác, nếu bước 3 không tạo được thực hiện, bước 4 sẽ đọc đúng địa chỉ và thực thi có thể bỏ qua trực tiếp từ bước 4 đến hướng dẫn tiếp theo, bỏ qua bước 5.

Nếu kiểm tra trình tự các thao tác, người ta sẽ nhận thấy rằng một kiến ​​trúc endian nhỏ có lợi thế nhất định so với kiến ​​trúc cuối lớn, trong hầu hết các trường hợp (mặc dù không phải là hiển thị), mặc dù ALU cần một chu kỳ để thực hiện ngoài ra, có thể đọc một byte từ địa chỉ được tính mà không cần chờ kết quả ALU, vì thông thường byte cao được tìm nạp sẽ là byte cao của toán hạng đích. Trên máy cuối lớn có ALU 8 bit, tải được lập chỉ mục sẽ mất ít nhất 5 chu kỳ (vì nửa dưới của địa chỉ sẽ không được đọc cho đến bước 3 và do đó sẽ được tính ở bước 4).


Tôi nhớ đã thấy một số quảng cáo cho máy tính có bộ xử lý 8 bit và bộ nhớ 1 megabyte. Điều này được thực hiện bằng cách sử dụng hai thanh ghi 8 bit trên CPU cộng với một thanh ghi 8 bit không có trên CPU để tạo thành toàn bộ địa chỉ.
user6030

@ user6030: Có nhiều cách để hoàn thành những việc như vậy. Thông thường các phần của không gian địa chỉ sẽ được "cố định" và các phần khác sẽ được ngân hàng lựa chọn. Một số thiết bị hoạt động độc đáo cho các lập trình viên; nhiều người khác, không quá nhiều
supercat

6

Các đường dữ liệu (chân) và đường địa chỉ (chân) hoàn toàn tách biệt. Nói một cách đơn giản, các dòng dữ liệu xác định số lượng bit tối đa có thể được truyền cùng một lúc (và được lưu trên bộ nhớ) trong khi các dòng địa chỉ xác định số lượng "ô" bộ nhớ tối đa có thể được chọn.

Nó chủ yếu là một điều tiếp thị mà CPU x86 32 bit không thể giải quyết nhiều hơn 4GB RAM. Tôi nhớ ở đâu đó có các chân A33-34 trên CPU Pentium 4.


1
Bạn đã đúng - PAE cho phép sử dụng nhiều RAM hơn, nhưng vì nó không có sẵn trên máy tính để bàn nên không có nhiều người sử dụng nó.
pjc50

PAE là tên của tính năng. Ngoài ra, bộ xử lý 64 bit không thể xử lý 64 exabyte, như264sẽ đề nghị.
Phil Frost

CPU x86 không thể giải quyết nhiều hơn 4GB mà không có sự phức tạp đáng kể nào trong hệ điều hành không chuyển sang các kiến ​​trúc khác.
Kaz

1
@Kaz ARM 32-bit có một tính năng tương tự gọi là LPAE, cho phép hệ điều hành xử lý hơn 32 bit địa chỉ
phuclv

3

Điều thường đúng là có một số mối quan hệ giữa kích thước bộ nhớ có thể đánh địa chỉ và kích thước thanh ghi bên trong, mặc dù mối quan hệ này khác nhau vì những lý do khác nhau. 256 byte không gian địa chỉ được coi là quá nhỏ ngay cả trong những ngày đầu của bộ vi xử lý, vì vậy hầu hết các bộ xử lý tám bit tạo ra địa chỉ 16 bit (hai byte), xử lý 64 kilobyte. Tuy nhiên, với chuyển đổi ngân hàng (về cơ bản là sử dụng một số dòng I / O nhất định để tạo ra nhiều dòng địa chỉ hơn), có thể có nhiều hơn nữa.

Trong bộ xử lý 16 và 32 bit đầu tiên, không có đủ chân trên thiết bị để đạt được tất cả không gian mà các thanh ghi địa chỉ nội bộ của chúng có thể xử lý. Ví dụ, trên Motorola 68000, chỉ có đủ các chân địa chỉ (24) để giải quyết 16 megabyte RAM, mặc dù các thanh ghi địa chỉ bên trong có chiều rộng 32 bit.


2

Tôi sẽ trả lời câu hỏi này cụ thể cho các bộ điều khiển AVR mà bạn đề cập. Nguyên tắc cơ bản cũng đúng với nhiều kiến ​​trúc 8 bit khác.

AVR là lõi 8 bit. Điều này có nghĩa là họ có Thanh ghi 8 bit. Tuy nhiên, 8 bit là không đủ để truy cập vào một lượng bộ nhớ có thể sử dụng. Do đó, lõi AVR có thể sử dụng một bộ các thanh ghi cụ thể được kết hợp như các thanh ghi con trỏ 16 bit. Các thanh ghi r30 và r31 (cũng được đặt tên là ZL và ZH) là một ví dụ cho điều này. Họ cùng nhau tạo thành con trỏ Z.

Khi lắp ráp, đọc một byte tại địa chỉ 0x1234 sẽ như thế này:

ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z    ; Load byte to r16

Họ AVR có 3 cặp thanh ghi có thể được sử dụng cho việc này. Chúng được thiết kế đặc biệt trong phần cứng để cho phép các hoạt động như vậy.

Khi lập trình bằng ngôn ngữ cấp cao hơn như C, trình biên dịch sẽ xử lý công cụ này.


Lưu ý: Một số AVR thậm chí còn hỗ trợ kích thước bộ nhớ lớn hơn 64k. Các bộ điều khiển này có một thanh ghi chức năng đặc biệt trong đó các bit bổ sung của địa chỉ được ghi trước khi truy cập. Do đó, địa chỉ bao gồm các bit sau (MSB đến LSB):

Thanh ghi chức năng đặc biệt (thường là 1 byte), ZH (8 bit), ZL (8 bit).


1

Các máy 8 bit của Atmel thực sự sử dụng địa chỉ dữ liệu 16 bit. Có rất nhiều thanh ghi 16 bit khác và thậm chí một số bộ định thời 16 bit. Vì nó chỉ là bộ xử lý 8 bit, nên nó thường sử dụng hai chu kỳ xung nhịp để tải một thanh ghi 16 bit.


1

Wikipedia giải thích nó khá tốt:

CPU tám bit sử dụng bus dữ liệu 8 bit và do đó có thể truy cập 8 bit dữ liệu trong một lệnh máy. Bus địa chỉ thường rộng gấp đôi octet (tức là 16 bit), do những cân nhắc thực tế và kinh tế. Điều này ngụ ý không gian địa chỉ trực tiếp chỉ 64 KB trên hầu hết các bộ xử lý 8 bit.


1

Khái niệm rằng "độ rộng bit" của bộ xử lý thiết lập lượng RAM tối đa mà bộ xử lý có thể giải quyết là một trong những huyền thoại phổ biến nhất trong điện toán. Trong thực tế, lịch sử ngành công nghiệp chỉ tràn ngập CPU mà mối quan hệ này không giữ được.

HP 21MX, HP 1000: CPU 16 bit, bộ nhớ đến 16 MB

PDP-11: CPU 16 bit, bộ nhớ tới 4 MB

VAX-11/780: CPU 32 bit, bộ nhớ đến 512 MB

Vân vân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.