Source: https://cse.sc.edu/~jbakos/313/overview_altera_hal.pdf