This document discusses the implementation of a Viterbi decoder on an FPGA to improve its design. It begins with an introduction to convolutional encoding and the Viterbi algorithm. It then describes the basic components of a Viterbi decoder including the branch metric unit, path metric unit, and survivor memory management unit. It discusses different techniques for Viterbi decoding including hard decision, soft decision, and various register exchange methods. It concludes that increasing the constraint length improves the decoder's performance and that traceback methods are more area efficient than register exchange methods for large constraint lengths.