Why does this adder need two clock cycles (two pushes of the button) to display a result?
The &lt;= assignment in the process is done in a special way. First all of the right side statements are evaluated, and then all of the left side signals are assigned. In your case, first the std_logic(tmp(n)); parts are evaluated with the 'old' value of tmp, and only then tmp and sum values are assigned.