Дополнение про глючок. Если вышеприведенная правка не помогает, то может помочь замена
Код:
            if (hcnt = 128 and vcnt (9) = '0') then screen_pre <='1';
            elsif (hcnt = 511) then screen_pre <= '0';
на
Код:
            if (hcnt>=128 and hcnt<=511 and vcnt (9) = '0') then screen_pre <='1';
            else screen_pre <= '0';
но в целом суть этой плавающей проблемы мне непонятна