Yes, many people have built many systems from a bunch of hardware modules,
each system leaving out the modules that have functions not necessary for that system.
Most systems are divided up into several PCBs, with non-standard ad-hoc interfaces between the boards. Very often "sensitive analog stuff", "noisy high-speed digital stuff", and "noisy power supply stuff" are put on 3 different boards, often in 3 different boxes.
(For example, cell phones with analog stuff in the Bluetooth headset, high-speed digital stuff in the handset, and power supply stuff in the wall-wart charger).
There are already several (alas, incompatible) standardized systems of hardware modules.
In no particular order (and with widely varying amounts of functionality and connector costs):
- PC/104
- Bug Labs as mentioned by Joby Taffey
- the JeeNode Arduino-compatible board and JeeLabs modules that plug into it: a b c d
- R-Dev-Ino stackable Arduino compatible board
- PlugaPodS
- gumstix packs
- DIP chips and breadboard-compatible plug-in modules: the 74HC00 series and many (but alas, not all) microcontrollers come in DIP packaging, such as many 8-bit and 16-bit microprocessors from Atmel, Microchip, Freescale (formerly a division of Motorola), Cypress, and the 32-bit Parallax Propeller. Combine these with solderless breadboard or stripboard or other prototyping boards.
- "pass-through 40-Pin OOPic expansion connectors"
- the Freescale Tower System
- Modular interface extension (MIX) stacking and communications interface
- VMEbus
- STEbus
- CompactPCI
- GPIB IEEE-488
- virtual cogs (they used to have some interesting parts at Sparkfun ?)
- I've heard rumors of a "Stackable USB" (?) (USB is smaller and faster than the ISA bus used in the original PC/104)
If you are lucky, then perhaps one of the above systems will be adequate for your needs -- you can use off-the-shelf hardware for your system, and only design a few boards for functions that are not available off-the-shelf -- at least for the first prototype of your system, even if you end up custom-manufacturing every part of your system later.
While the abstract idea of "modules" is very useful in both hardware design and software design, hardware modules have some annoying differences from software modules:
- connectors cost money. enclosures cost money. So once I have a block diagram of all the parts I need for a system, it's tempting to cram everything onto one or two PCBs so I can use a slightly smaller, cheaper enclosure, and avoid paying for a bunch of connectors.
- In hardware, everything happens at the same time. This can create problems that are difficult to debug by people are used to serial software.
- Connecting two chips on two separate boards with a connector between them usually has worse EMC than than the same two chips on one big board with only a short trace between them.
- Putting a small memory on each module sounds like a good idea. That memory can hold (a) a short unique ID number for the module, and perhaps (b) hold information about the module, like Autoconfig, PC Card CIS, PCI configuration space, Display Data Channel, etc., and perhaps going further an (c) store some executable "device driver" code -- preferably in a processor-independent language, like Open Firmware, rather than in raw executable code for one particular processor, like some other kinds of option ROM. Alas, the temptation to save a few bucks by getting the same number of bytes of memory in one "big" memory chip for the entire system -- rather than one "little" memory chip per board -- often seems overwhelming. Also, you have the dilemma of either (a) reprogrammable memory such as Flash -- which risks erasing a module's local storage; or worse, re-programming it with the wrong stuff, or (b) one-time-programmable memory -- which risks sending out a bunch of hardware with a bug in that memory that is expensive to fix.
- Hotplugging -- worth a separate question. It's much simpler to design a system that is only intended to plug and unplug modules while the power is off. Just one of the many issues involved in getting hot-plugging working right is Best options for limiting input ringing with ceramic capacitors .