This book provides a systematic introduction to the topic of Hardware-Software Codesign. The material emphasizes the basic ideas, and the practical aspects of Hardware-Software Codesign. The book developed from a course on the topic of Hardware-Software Codesign, organized by the author at Virginia Tech. It is separated into four differenct sections; Basic Concepts, Custom Architectures, Hardware/Software Interfaces, and Applications.The author covers many concepts including the various forms of expressing computations, sequential and parallel implementations, control-flow and data-flow, control dependency and data dependency, latency and throughput as well as the architecture design space of hardware data paths, finite state machines, micro-programmed machines, instruction-set processors, system-on-chip, and on-chip buses. The material also includes the different forms of hardware/software interfaces, their impact on performance, hardware cost, and software complexity. The book contains information on hardware/software integration of components on top of hardware/software interfaces as well as design methodology and design flows for hardware-software codesign including performance evaluation, verification and synthesis of hardware and software implementations. Problems are included at the end of each chapter and a solutions manual will be available for instructors.