The code
for temp in 0 to 659 loop
spek <= '1' after 758725 ns; --1/(659 hz) = 1517450ns // (1517450/2) = 758725ns
spek <= '0' after 758725 ns;
end loop;
schedules 2 * 659 transitions on "spek", all occurring 758 us after the loop is entered. The last transition wins, which sets spek to '0'.
for temp in 0 to 659 loop
spek <= '1' after 758725 ns, '0' after 1517450 ns;
wait for 1517450ns;
end loop;
is probably closer to what you want.
However, for synthesis as other comments say, the code for "do" or "re" works (and synthesises!).
One other point worth thinking about : it's easier to let the compiler generate all the funny constants itself - then if you change a parameter such as the clock frequency you don't need to spend an hour with the calculator...
clk_freq : natural := 8000000;
clk_period : time := 1 sec / clk_freq;
or for the sim only version,
procedure note (freq : natural; duration : time) is
-- not synthesisable!
begin
for temp in 1 to freq * duration / 1 sec loop
spek <= '1' after 1 sec / freq / 2, '0' after 1 sec / freq;
wait for 1 sec / freq;
end loop;
end note;
...
if (la <= '1') then
note(698, 1 sec);
elsif