A bus (set of wires each carrying a digital signal, which together specify a number in binary) used to specify a memory address. If a microprocessor chip wants to read or write a specific value to a specific address in memory, it'll specify the address on the Address bus, and the value to read or write will be tranferred on the Data bus.

The 'width' of the address bus (i.e. the number of signals (bits) that comprise it) determine how much memory can be addressed. Hence, if you have a 16-bit address bus, you can represent a number (in binary) up to 216 (=65536) possible values (actually the range used is 0-65535), so you can individually refer to 65536 different memory addresses, or 64K of memory*.

Note that when (in computer terms) people say Kbytes or Mbytes, they are actually referring to K=1024 (210) and M=1,048,576 (220), so that's why 64K is not 64,000 , it's 64*1024 = 65,536.

(* This is actually not strictly the case; when people refer to '64k of memory' they mean 64k bytes (8-bit values) of memory. If you've got a 16-bit address bus (so 65536 possible address) and a 16-bit data bus, you can still address 65536 different physical memory locations, but each one is a 16-bit value. As a 16-bit value can also be considered as two 8-bit bytes, you can address 128k(bytes) of actual memory with this setup)

Extra complexity

If you've got quite a wide address bus (e.g. 32 bit, as found on modern PCs, which allows you to address 4Gb of memory), it is often inconvenient to have that many actual separate wires on a connector (say, on one of those slots you stick memory modules into inside your PC), especially as it you usually want a wide data bus as well to provide higher performance (the wider the data bus, the larger the number you can transmit in one go - this may not seem very useful, but you can either consider a 64-bit word* as a single 64-bit number (which can mean one of 264 possible values - from 0 to very-fucking-big-indeed) or as 8 separate byte values, so you could equally consider it as transferring 8 adjacent bytes simultaneously, which is obviously going to be a good thing. Anyway, to avoid having a zillion connections, you can use what is known as a multiplexed address bus. What this means is that you have (say) a 32-bit address that you need to specify, but instead of using 32 wires, you use 16 wires and send the address sequentially in two halves, one after the other.

RAM chips (or DRAM, or SDRAM, or whatever this week's flavour is) virtually always use a multiplexed bus (because otherwise the chips would need loads of pins, which would make them more expensive to manufacture.

A slightly interesting side effect of using a multiplexed address bus is this; Say you want to read a value from memory address $12345678 (see hexadecimal for what the '$' means), you might put the number '$1234' on the wires going to the RAM chip, wait a tiny amount of time for it all to go through the works, then put '$5678' on the address bus, wait a little more, and then read or write the value you want over the data bus. The time delays are tiny (for example two or three nanoseconds nowadays), but it all adds up. If the next thing you want to do is to read or write address $12345679 (the next one along), you can save a teeny bit of time by not specifying the '$1234' part of the address again, and just tell the chip that the first (or 'high') part of the address hasn't changed, and you only need to specify the second (low) part ($5679) of the whole address. This is known as 'fast page mode' addressing (because the low part of the address is called a 'page'), and is universally used nowadays.

To get into the details of memory systems, RAM chips, and the like is waaaaaay complicated, and I suggest you go to university to study it (although I didn't), primarily because there you can get drunk and hopefully have sex with girls/boys (delete as applicable).. (although you probably won't have much luck if you insist on going on about bits and busses). You could look at my node on Rambus memory if you want a taste of how scary it gets.

Just so you know, it's the convention to refer to address bus lines (wires or pins inside a computer that carry specific signals are knowns as 'lines' e.g. 'reset line') as A0..A(whatever) where A0 is the least significant bit of the bus. Data bus lines are called D0..D(whatever). If you see a bus where the lines are called AD0..AD(whatever), that usually means they're using a multiplexed bus, where the same wires are used alternately for carrying address and data information.

(* note that a byte is always 8 bits, a nibble is always 4 bits, and anything else is usually referred to as a word of a specific size, e.g. a 16-bit word)

Log in or register to write something here or to contact authors.