In the early days of embedded systems, software engineers typically had some understanding of hardware design. Indeed, in many cases, it was the hardware designer who implemented the software. Over the years, as the amount of software development has increased, engineers have become less and less “hardware aware”. I find this transition interesting from the viewpoint of an embedded software specialist working in a company where 90% of my colleagues are hardware design experts.
It does not follow that software engineers are not interested in hardware. A common topic that I have received inquiries about is FPGA technology. Engineers wonder what they are all about and how they might matter to a software specialist …
Most chips [integrated circuits, semiconductor devices …] have a specific functionality. This may be complex or simple, but it is well defined and fixed. A field programmable gate array [FPGA] is different: it’s functionality is not determined until it is deployed in a design. Actually, it could even be later than that, as an FPGA’s characterization is not normally loaded until it is powered up.
An FPGA, as its name implies, is an array of logic elements. These elements and their interconnection can be programmed to meet the needs of the design in hand. In the past, hardware design was done by drawing a circuit diagram. But, nowadays, most development is done using a hardware description language [HDL] and this includes programming of FPGAs.
As a software engineer, HDLs are interesting because they closely resemble programming languages. The two most common languages are VHDL [which is based on Ada syntax] and Verilog [which looks more like C]. Of course, Mentor Graphics offers a range of FPGA development tools that support the standard languages.
There is an increasing move to programming/defining hardware using languages that are much closer to C and C++. This begs the question: can a software engineer develop a hardware design using an FPGA? The answer is not 100% clear. Programming hardware is still different from software. The key issues are the true parallelism that is intrinsic in hardware and the timing issues associated with that. I am involved in a session at Design WEST next week, which looks at a variety of languages for both software and hardware.
There is a lot of intellectual property [IP – i.e. prepackaged design elements] available for FPGAs to save designers from re-inventing the wheel too often. From an embedded software engineer’s point of view, the interesting FPGA IP products are CPU “soft cores”. These are full CPUs, with a comprehensive range of functionality, that can be instantiated into the FPGA fabric. There may be a single instance or multiple instantiations, if a multicore design is appropriate. Examples of these soft cores are Nios II from Altera and MicroBlaze from Xilinx. Developing software and deploying operating systems [like Nucleus] etc. on these devices is much the same process as with conventional CPUs.
A trend with FPGAs is to incorporate specialist hardware into the FPGA fabric to accommodate specific functionality with greater performance. Again, an example that would be of interest to software engineers is a “hard core” CPU. A number of FPGA have been and are available with one or more embedded CPUs – typically ARM or PowerPC, which are very familiar to software developers.
Naturally, soft cores may also be instantiated in the FPGA along with hard cores to create a heterogeneous multicore system, if required.