Episode 1.1 – Importance of Hardware Design

Welcome to the Geek Author series on Computer Organization and Design Fundamentals. I’m David Tarnoff, and I’ve been teaching Computer Organization, Computer Architecture, Digital Design, and Embedded System Design for over 25 years. If you’re interested in the basics of how the logic of a computer works, you’re in the right place. The only background you’ll need for this series is an understanding of integer math. A little experience with a programming language such as Java would be helpful too as we’ll be using some code to help describe the theory.

In this episode, we’re just going to have a short chat about why hardware design is important to anyone interested in creating computing solutions. Don’t get me wrong, an understanding of hardware may not be necessary to program a computer to perform simple tasks, but to be truly effective, a skilled programmer must understand how a computer formats and organizes its data, the processes it uses to execute code, and the methods it uses to access its resources. Why? Well, let’s look at some examples.

The same design theories used at the lowest level of hardware design are also used at the system level. For example, the same methods a circuit board designer would use to create the interface between a processor and its memory chips are used to design the addressing scheme of an IPv4 network or manage the pages of virtual memory. The same methods used to optimize digital circuits can be used to improve the performance of the logic portions of our software. Complex blocks of if-statements, for example, can be simplified or made to perform faster using hardware design tools.

System-level troubleshooting and general debugging also benefit from a clear understanding of the inner workings of a computer. Experience with hardware design gives anyone servicing it the tools to isolate a problem quicker and do it with greater accuracy. Going deeper into the computer’s architecture is essential when it comes to deep debugging, optimizing software, formatting data for optimal storage, searching, and retrieval, or making the most of your processor’s performance features. Without these skills, any attempts to reach performance goals become astonishingly difficult. In addition, there are a number of software bugs that only make sense through an understanding of the unique methods computers use to manage logic and data. For example, why on earth would the addition of two positive numbers result in a negative number? Why is it that a faster connection speed is actually taking longer to transfer a block of data? Both of these situations are possible on a computing system.

And no computer can be of use unless it has inputs and outputs. Most users are familiar with the basics of a keyboard, mouse, and monitor, but I/O can go so much further. Programmers must be able to access hardware ranging from the joystick, buttons, and haptic feedback of a game controller to the sensors and airbag actuators of a vehicle’s supplementary restraint system.

And let’s be realistic, who doesn’t want a job? An understanding of hardware interfacing can be a stepping stone to a career in embedded system design. Embedded system design puts microprocessors into mission specific applications such as industrial control, home automation, and automotive systems. As processors become cheaper and more powerful, the same tools used for desktop software design are being applied to embedded system design. This means that the software engineer with experience in hardware design has a significant advantage over the hardware engineers in this market.

Think of the abundance of systems around you such as your car, cell phone, and game console that rely on a programmer’s understanding of hardware. A game controller, for example, sends digital information into the console’s USB port. In order for the software to respond properly to the joystick movement or button presses, the software designer must be able to interpret the digital signal.

And if you’re really serious about understanding the operation of a computer, take a look at assembly language. At this low level of programming, you have complete access to the circuitry of the processor. With a background in assembly, you can gain an understanding of how attackers can leverage certain processor vulnerabilities to access the protected functions of the processor and thereby better protect your system. You may never program a single line of assembly language, but an understanding of the language will provide you with an appreciation for what a compiler does, insight as to why a system change might be affecting performance, and revelations into what might be causing that aggravating software bug.

If you’re still not convinced, well, why don’t you hang out with us anyway? In our next episode, we will compare analog and digital signals and see why digital is so important to our everyday lives. And remember, while the scope of what makes a computer is immense, it’s all just ones and zeros.