A quiet revolution is taking place. Over the past few years, the
density of the average programmable logic device has begun to
skyrocket. The maximum number of gates in an FPGA is currently
around 500,000 and doubling every 18 months. Meanwhile, the price
of these chips is dropping. What all of this means is that the
price of an individual NAND or NOR is rapidly approaching zero!
And the designers of embedded systems are taking note. Some system
designers are buying processor cores and incorporating them into
system-on-a-chip designs; others are eliminating the processor
and software altogether, choosing an alternative hardware-only
design.
As this trend
continues, it becomes more difficult to separate hardware from
software. After all, both hardware and software designers are
now describing logic in high-level terms, albeit in different
languages, and downloading the compiled result to a piece of silicon.
Surely no one would claim that language choice alone marks a real
distinction between the two fields. Turing's notion of machine-level
equivalence and the existence of language-to-language translators
have long ago taught us all that that kind of reasoning is foolish.
There are even now products that allow designers to create their
hardware designs in traditional programming languages like C.
So language differences alone are not enough of a distinction.
Both hardware
and software designs are compiled from a human-readable form into
a machine-readable one. And both designs are ultimately loaded
into some piece of silicon. Does it matter that one chip is a
memory device and the other a piece of programmable logic? If
not, how else can we distinguish hardware from software?
Regardless
of where the line is drawn, there will continue to be engineers
like you and me who cross the boundary in our work. So rather
than try to nail down a precise boundary between hardware and
software design, we must assume that there will be overlap in
the two fields. And we must all learn about new things. Hardware
designers must learn how to write better programs, and software
developers must learn how to utilize programmable logic.
TYPES OF PROGRAMMABLE
LOGIC
Many types
of programmable logic are available. The current range of offerings
includes everything from small devices capable of implementing
only a handful of logic equations to huge FPGAs that can hold
an entire processor core (plus peripherals!). In addition to this
incredible difference in size there is also much variation in
architecture. In this section, I'll introduce you to the most
common types of programmable logic and highlight the most important
features of each type.
PLDs
At the low
end of the spectrum are the original Programmable Logic Devices
(PLDs). These were the first chips that could be used to implement
a flexible digital logic design in hardware. In other words, you
could remove a couple of the 7400-series TTL parts (ANDs, ORs,
and NOTs) from your board and replace them with a single PLD.
Other names you might encounter for this class of device are Programmable
Logic Array (PLA), Programmable Array Logic (PAL), and Generic
Array Logic (GAL).