difference between hardware and firmware design