This paper presents an overview of designing with Field Programmable Gate Arrays (FPGAs) for software and firmware engineers. While not exhaustive, the material presented provides the foundation required to evaluate designing with FPGAs. The first section reviews the fundamentals of FPGA architectures, and when it may be appropriate to use FPGA technology in a design. The next section describes how to design effectively with FPGAs. The final section identifies some challenges commonly encountered when designing with FPGAs. Topics include the FPGA design flow, FPGA programming, simulation, critical process decisions, informed component selection, and the advantages and challenges of designing with Intellectual Property (IP).