Smallest/slowest answer is something like
Set up a chain from high to low, checking for when the first zero is seen.
all_zeros(1023) <= NOT vector(n);
for n in 0 to 1022 loop;
all_zeros(n) <= all_zeros(n+1) AND NOT vector(n);
end loop;
...and then leave the tools to optimize it for the underlying architecture (they will most likely do a poor job
)
During the update just set the bit
if rising_edge(clk) and something = '1' then
vector(0) <= '1';
for n in 1 to 1023 loop
vector(n) <= vector(n) OR (all_zeros(n) AND vector(n-1));
end loop;
end;
There is no way getting around it, that the new state for bit one depends on the state of all other bits in the vector. Somehow the state from the 1023 other bits must fan in to allow it to be updated.
If you need to do that in one cycle the best you can do is celling(log(1024)/log(LUT width)) levels of LUTs...
...unless you also maintain a vector of "this block of n bits is all zeros" alongside the main one, allowing you to move some of the work a cycle earlier.