Bagaimana prosesor 8-bit mendukung lebih dari 256 byte RAM?

14

Jika prosesor 32- bit dapat menangani kira-kira 4 GiB RAM (yaitu ) byte, mengapa Arduino Mega 2560 saya memiliki 8 KiB SRAM, jika menjadi prosesor 8- bit memungkinkan untuk hanya menangani 256 byte ( )? Atau apakah saya salah membaca halaman berikut?232=429496729628

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

ZaqueoAlejandro
sumber
5
Tentunya setiap mesin turing-complete mampu menangani hampir semua ukuran ram, diberikan waktu yang cukup.
John U
1
Sebenarnya jumlah bit dalam nama prosesor hanya dapat digunakan untuk estimasi di muka lebar data internal. 8088 adalah prosesor 16-bit karena register 16-bit tetapi memiliki bus data 8-bit dan bus alamat 20-bit. 68000 adalah prosesor 32-bit yang sebagian besar disebut 16/32-bit karena register 32-bitnya tetapi memiliki bus data 16-bit dan bus alamat 24-bit. Implementasi ARM kecil adalah prosesor 32-bit (register 32-bit dan data-bus) tetapi bahkan jika mereka menggunakan 32 bit untuk alamat mereka tidak dapat mengatasi total 4 GB.
the busybee
Saya telah menambahkan awalan SI yang benar untuk unit ini. adalah gibi (Gi) dan 2 10 adalah kibi (Ki). 230210
Elliot Alderson

Jawaban:

18

Kebanyakan CPU 8 bit memiliki bus alamat 16 bit yang memungkinkan mereka untuk mengatasi 64kbytes, tepatnya karena 256 byte sebenarnya tidak cukup untuk melakukan banyak hal! Itu hanya berarti mereka perlu memuat dua byte, bukan satu, setiap kali mereka perlu memuat alamat. Sedikit lebih lambat tapi lumayan mengingat ukurannya.

(Dan ya ada banyak pengecualian, sebagian besar dikembangkan ketika 64k menjadi terlalu kecil, tetapi kita sedang berbicara tentang ide dasar di sini).

Brian Drummond
sumber
Sebenarnya sebagian besar mikrokontroler 8-bit yang saya temui tidak memiliki alamat 16-bit
phuclv
@Brian Drummond Apakah saya benar: Pengendali akan menulis lebih rendah 8 bit pertama kemudian 8 bit lalu Latch bus alamat. Ini adalah bagaimana ia akan mengakses bus alamat 16bit!
Swanand
Atau atas 8 bit kemudian lebih rendah 8 bit, tetapi pada dasarnya ya, itulah idenya.
Brian Drummond
7

The bus alamat dan bus data dipisahkan sehingga mereka mungkin memiliki ukuran yang berbeda. Untuk ukuran bus alamat tertentu ada banyak teknik untuk mengatasi lebih banyak memori daripada lebar bit register

  • Cara paling umum adalah meningkatkan lebar bus alamat entah bagaimana dengan

    • menggunakan beberapa register untuk alamat

      • AVR memiliki R26..R31 yang dapat dipasangkan menjadi 16-bit X, Ydan Zregister pengalamatan data memungkinkan maksimum 64KB RAM. Mereka pada gilirannya dapat dipasangkan dengan RAMPX, RAMPY, RAMPZuntuk mengakses alamat RAM yang lebih tinggi dalam versi yang lebih besar. Ini juga memiliki SPHuntuk byte byte stack yang tinggi dan SPLvarian dengan lebih dari 256 byte RAM 1
      • Intel 8080 dan Zilog Z80 adalah CPU 8-bit, tetapi mereka memiliki pasangan register seperti H& L, B& C, D& Eyang dapat digunakan bersama sebagai register alamat 16-bit
    • menggunakan register khusus besar tunggal lebih besar dari ukuran alami untuk mengatasi

      • Intel 8051 adalah mikrokontroler 8-bit, yaitu ia memiliki alamat data 8-bit. Namun ia menggunakan alamat instruksi 16-bit dan memiliki 2 register 16-bit: PC dan DPTR untuk pengalamatan di ruang instruksi.
      • AVR memiliki register PC 16 atau 22-bit
    • menggunakan register khusus untuk bagian paling atas dari alamat . Ketika menangani beberapa memori, secara default 8 bit rendah dari alamat akan diambil dari register 8-bit langsung atau 8-bit pada mikrokontroler 8-bit, sedangkan bit-bit tinggi akan diganti dengan nilai register alamat lain.

      • Kasus khusus ini adalah memori tersegmentasi , yang digunakan oleh x86 16-bit . Dalam teknik ini memori dibagi menjadi beberapa segmen dengan ukuran 64KB (2 16 byte). Akses normal adalah di dalam segmen tunggal secara default sehingga mereka dapat menggunakan alamat 16-bit untuk data yang dekat . Data yang terpisah lebih jauh harus ditangani secara khusus berdasarkan nilai segmen, oleh karena itu 2 register harus digunakan untuk pengalamatan jauh.
      • The PIC mikrokontroler , yang dasar dan seri midrange mungkin memiliki alamat 13 atau 14-bit, adalah contoh lain. Saat menggunakan callatau gotoinstruksi, 8 atau 9 bit rendah dari alamat ditunjukkan oleh langsung dan sisanya diambil dari penghitung program saat ini. Jadi mengakses sesuatu yang tidak jauh di sekitar segmen saat ini hanya menggunakan 1 instruksi, sedangkan alamat lebih lanjut akan membutuhkan 2 instruksi (untuk mengatur bit tinggi).
      • Contoh lain adalah arsitektur MIPS yang juga menggabungkan alamat langsung 26-bit lebih rendah dengan 6 bit tinggi dari PCsaat melompat tanpa syarat.
  • Cara lain untuk mencapai ini adalah memory banking . Ini adalah metode yang berguna yang masih digunakan di beberapa arsitektur saat ini. Dalam model ini, memori dibagi menjadi beberapa bank . Setiap kali Anda hanya dapat mengatasi bank tertentu. Sering ada bank global atau rentang alamat yang selalu terlihat kapan saja, tetapi untuk bagian lain Anda harus beralih bank saat diperlukan.

    • Intel 8051 menggunakan memory banking untuk register. Ini memiliki 32 register tetapi hanya 8 dari mereka yang terlihat pada suatu waktu.
    • x86 PAE dan ARM LPAE , dengan ruang alamat fisik lebih besar yang dipetakan ke ruang alamat virtual kecil
    • Aplikasi lain untuk ini adalah Address Windowing Extensions pada Windows yang dapat digunakan oleh aplikasi x86 32-bit dalam mode PAE untuk mengakses lebih dari 2 / 3GB memori. Ini tidak persis seperti bank memori pada mikrokontroler tetapi dapat dilihat seperti itu, karena rentang alamat besar dapat berupa windows / bank kecil yang cukup kecil untuk masuk ke dalam ruang alamat aplikasi. Jika aplikasi perlu menggunakan data di beberapa jendela, ia akan memetakan jendela itu ke ruang alamat saat ini.
    • DOS juga memiliki beberapa jenis peralihan bank seperti memori yang diperluas atau memori yang diperluas karena terbatasnya memori yang dapat dialamatkan.
  • Ada juga teknik yang tidak terlalu umum tetapi dapat ditemukan di Intel 8051 . Sebagai mikrokontroler dengan alamat data 8-bit, ia dapat memiliki paling banyak 256 alamat. Setengah dari ruang (bagian tinggi) digunakan untuk register fungsi khusus ( SFR ), membatasi RAM nyata yang dapat dialamatkan hanya 128 byte. Namun pabrikan seri 8051 modern menemukan cara cerdas untuk mengatasinya dengan memisahkan akses memori . Pengalamatan langsung akan mengakses SFR sementara pengalamatan tidak langsung meskipun register akan mengakses bagian tinggi RAM yang berarti sekarang Anda memiliki 256 + 128 = 384 byte yang dapat dialamatkan.


1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions

Core terkecil memiliki ≤256 byte ruang alamat data (yang berarti ≤128 byte RAM setelah port I / O dan alamat yang dicadangkan lainnya dihapus) dan ROM program ≤8192 byte (8 KiB). Ini hanya memiliki stack pointer 8-bit (dalam SPL), dan hanya mendukung instruksi lompatan / panggilan relatif 12-bit, RJMP / RCALL. (Karena penghitung program AVR menghitung kata-kata 16-bit, bukan byte, offset 12-bit cukup untuk mengatasi 213 byte ROM.)

Kemampuan pengalamatan memori tambahan hadir sesuai kebutuhan untuk mengakses sumber daya yang tersedia:

  1. Model dengan> 256 byte ruang alamat data (≥256 byte RAM) memiliki penunjuk tumpukan 16-bit, dengan separuh tinggi dalam register SPH.
  2. Model dengan ROM> 8 KiB menambahkan instruksi JUMP dan CALL 2-kata (22-bit). (Beberapa model awal menderita erratum jika instruksi lewati diikuti oleh instruksi 2 kata.)
  3. Model dengan ROM> 64 KiB menambahkan instruksi ELPM dan register RAMPZ yang sesuai. Instruksi LPM nol-perpanjang alamat ROM dalam Z; Instruksi ELPM menambahkan register RAMPZ untuk bit tinggi. Ini bukan hal yang sama dengan instruksi LPM yang lebih umum; ada model "klasik" dengan hanya bentuk nol operan dari ELPM (ATmega103 dan at43usb320). Ketika peningkatan otomatis tersedia (sebagian besar model), ia memperbarui seluruh alamat 24-bit termasuk RAMPZ.
  4. (Rare) model dengan ROM> 128 KiB memiliki penghitung program 3-byte. Panggilan dan pengembalian subrutin menggunakan byte tambahan ruang stack, ada register EIND baru untuk memberikan bit tinggi tambahan untuk lompatan dan panggilan tidak langsung, dan ada instruksi tambahan EIJMP dan EICALL yang menggunakan EIND: Z sebagai alamat tujuan. (Instruksi IJMP dan ICALL sebelumnya menggunakan nol-extended Z.)
  5. (Rare) model dengan> 64 KiB ruang alamat RAM memperpanjang batas pengalamatan 16-bit RAM dengan register RAMPX, RAMPY, RAMPZ dan RAMPD. Ini memberikan bit tinggi tambahan untuk mode pengalamatan yang menggunakan pasangan register X, Y, atau Z, masing-masing, atau instruksi pengalamatan langsung LDS / STS. Tidak seperti akses ROM, tidak ada instruksi "diperpanjang" yang berbeda; sebaliknya register RAMP digunakan tanpa syarat.
phuclv
sumber
6

Hampir semua prosesor 8-bit memiliki beberapa kemampuan untuk membentuk alamat 16-bit dari bagian orde rendah dan bagian orde tinggi. Pada beberapa prosesor termasuk 8080 asli, ada register yang didedikasikan untuk memegang bagian atas dan bawah alamat (meskipun dari sudut pandang programmer mungkin ada beberapa register seperti stack pointer 8080 yang tidak menawarkan instruksi untuk mengatasinya secara terpisah). Di beberapa prosesor lain, tidak ada register yang dikhususkan untuk bagian atas atau bawah dari suatu alamat, tetapi alamat dirakit "on the fly". Misalnya, pada 6502, instruksi "LDA $ 1234, X" memuat akumulator dengan alamat yang dibentuk dengan menambahkan $ 1234 ke register X 8-bit [anggap mengandung $ F0]. Eksekusi instruksi tersebut akan dilanjutkan dalam 4 atau 5 langkah:

  1. Selesaikan register tulis dari instruksi sebelumnya (jika ada) dan muat opcode ($ BD)
  2. Ambil byte operan pertama mengikuti opcode ($ 34) saat mendekode instruksi
  3. Ambil byte operan kedua ($ 12) sambil menambahkan byte yang sebelumnya diambil ke register X
  4. Baca memori pada alamat yang dibentuk dengan menggabungkan byte operan kedua ke hasil ALU [yaitu $ 1224]. Feed byte operan kedua ke dalam ALU untuk menambahkan nol atau satu tergantung pada apakah sebelumnya add menghasilkan carry
  5. Baca memori di alamat yang dibentuk dengan mengganti bagian atas dengan hasil ALU [$ 1334]

Transfer byte baca ke akumulator akan tumpang tindih dengan pengambilan instruksi berikutnya. Selain itu, untuk banyak operasi, jika langkah 3 tidak menghasilkan carry, langkah 4 akan membaca alamat yang benar dan eksekusi dapat melompat langsung dari langkah 4 ke instruksi berikutnya, melewati langkah 5.

Jika seseorang memeriksa urutan operasi, orang akan melihat bahwa arsitektur little-endian memiliki keunggulan yang pasti daripada yang big-endian, dalam banyak kasus (meskipun bukan yang ditunjukkan), meskipun ALU membutuhkan siklus untuk melakukan sebagai tambahan, dimungkinkan untuk membaca byte dari alamat yang dihitung tanpa menunggu hasil ALU, karena biasanya byte tinggi yang diambil akan menjadi byte tinggi dari operan target. Pada mesin big-endian dengan ALU 8-bit, beban yang diindeks akan membutuhkan setidaknya 5 siklus (karena bagian bawah alamat tidak akan dibaca sampai langkah 3, dan dengan demikian akan dihitung pada langkah 4).

supercat
sumber
Saya ingat melihat beberapa iklan untuk komputer dengan prosesor 8-bit dan memori 1 megabyte. Ini dilakukan dengan menggunakan dua register 8-bit pada CPU plus satu register 8-bit bukan pada CPU untuk membentuk seluruh alamat.
user6030
@ user6030: Ada banyak cara untuk mencapai hal-hal seperti itu. Biasanya bagian dari ruang alamat akan "diperbaiki" dan yang lain akan dipilih bank. Beberapa perangkat bekerja dengan baik untuk programmer; banyak lainnya, tidak begitu banyak.
supercat
6

Databus lines (pin) dan address lines (pin) sepenuhnya terpisah. Sederhananya, garis databus menentukan jumlah bit maksimum yang dapat ditransfer satu per satu (dan disimpan di memori) sedangkan garis alamat menentukan jumlah maksimum "sel" memori yang dapat dipilih.

Itu sebagian besar hal pemasaran yang 32-bit x86 CPU tidak bisa mengatasi lebih dari 4GB RAM. Saya ingat di suatu tempat bahwa ada pin A33-34 pada CPU Pentium 4.

dprogrammer
sumber
1
Anda benar - PAE mengizinkan penggunaan lebih banyak RAM, tetapi karena tidak tersedia di desktop Windows, tidak banyak orang yang pernah menggunakannya.
pjc50
264
x86 CPU tidak dapat mengatasi lebih dari 4GB tanpa komplikasi yang signifikan dalam sistem operasi yang tidak terhubung ke arsitektur lain.
Kaz
1
@Kaz ARM 32-bit memiliki fitur serupa yang disebut LPAE, yang memungkinkan sistem operasi untuk mengatasi lebih dari 32 bit alamat
phuclv
3

Seringkali benar bahwa ada beberapa hubungan antara ukuran memori yang dapat dialamatkan dan ukuran register internal, meskipun hubungannya bervariasi karena alasan yang berbeda. Ruang alamat 256 byte dianggap terlalu kecil bahkan pada hari-hari awal mikroprosesor, sehingga sebagian besar prosesor delapan bit menghasilkan alamat 16 bit (dua byte), yang menangani 64 kilobyte. Namun, dengan peralihan bank (pada dasarnya menggunakan jalur I / O tertentu untuk menghasilkan lebih banyak garis alamat), dimungkinkan untuk memiliki lebih banyak.

Dalam prosesor 16 dan 32 bit pertama, tidak selalu ada pin yang cukup pada perangkat untuk mencapai semua ruang yang bisa dialamatkan oleh register alamat internal mereka. Misalnya, pada Motorola 68000, hanya ada cukup pin alamat (24) untuk mengatasi 16 megabita RAM, meskipun register alamat internal lebarnya 32 bit.

Gus Mueller
sumber
2

Saya akan menjawab pertanyaan ini khusus untuk pengendali AVR yang Anda sebutkan. Prinsip dasar juga berlaku untuk banyak arsitektur 8-bit lainnya.

AVR adalah inti 8-bit. Ini berarti mereka memiliki Register 8-bit. Namun, 8 bit tidak cukup untuk mengakses jumlah memori yang dapat digunakan. Oleh karena itu, inti AVR dapat menggunakan satu set register spesifik yang digabungkan sebagai register pointer 16 bit. Register r30 dan r31 (juga disebut sebagai ZL dan ZH) adalah contoh untuk ini. Bersama-sama mereka membentuk Pointer Z.

Dalam perakitan membaca byte di alamat 0x1234 akan terlihat seperti ini:

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

Keluarga AVR memiliki 3 pasangan register yang dapat digunakan untuk ini. Mereka secara khusus dirancang dalam perangkat keras untuk memungkinkan operasi tersebut.

Saat memprogram dalam bahasa tingkat yang lebih tinggi seperti C, kompiler menangani hal ini.


Catatan: Beberapa AVR bahkan mendukung ukuran memori yang lebih besar dari 64k. Kontroler ini memiliki register fungsi khusus di mana bit tambahan alamat ditulis sebelum akses. Oleh karena itu alamat terdiri dari bit-bit berikut (MSB ke LSB):

Daftar fungsi khusus (biasanya 1 byte), ZH (8bit), ZL (8bit).

GNA
sumber
1

Atmel 8 bit AVR sebenarnya menggunakan alamat data 16 bit. Ada banyak register 16 bit lainnya dan bahkan beberapa timer 16 bit. Karena ini hanya prosesor 8 bit, biasanya menggunakan dua siklus clock untuk memuat register 16 bit.

Garrett Fogerlie
sumber
1

Wikipedia menjelaskannya dengan cukup baik:

CPU delapan-bit menggunakan bus data 8-bit dan karenanya dapat mengakses 8 bit data dalam satu instruksi mesin. Bus alamat biasanya memiliki lebar oktet ganda (yaitu 16-bit), karena pertimbangan praktis dan ekonomis. Ini menyiratkan ruang alamat langsung hanya 64 KB pada sebagian besar prosesor 8-bit.

Kamil
sumber
1

Gagasan bahwa "lebar bit" dari suatu prosesor menetapkan jumlah maksimum RAM yang dapat diatasi oleh prosesor adalah salah satu mitos paling luas dalam komputasi. Bahkan sejarah industri hanya dipenuhi dengan CPU yang tidak dimiliki hubungan ini.

HP 21MX, HP 1000: 16-bit CPU, memori hingga 16 MB

PDP-11: CPU 16-bit, memori hingga 4 MB

VAX-11/780: CPU 32-bit, memori hingga 512 MB

dll, dll.

Jamie Hanrahan
sumber